kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

UnityのGetComponent(難易度:易)

かずまです。

徳島に帰って来ましたが、Unity勉強会など各地で開催されていますが徳島では開催されていないのでちょっと残念ですが、一緒にやりたいという方がいればやりましょう!

特に徳大とか、穴吹カレッジの学生さんとかですね!笑

さて、先日友人にUnityでのコードの書き方を教えながら僕も学んでいたのですが、結構難しいという点があるので
ちょっとまとめて置きます。

Inspectorの中身をスクリプトから変更

基本的に一通り触れるようになれば簡単な話ですが、はじめはこの概念はないかもしれません。
使うコードは一つです。

GetComponent

UnityのGameObjectは複数のComponentを持ちます。
まとめられちゃってますが、Transformだって同じですね。

Componentとは、
ColliderやRigidbody、Meshなどゲームの心臓、要素となるものをここではComponentと呼んでいます。

ここではスクリプトと変更したいComponentが同じObjectであれば自分、逆の場合は相手と呼ぶことにします。

自分に付いているRigidbodyのisKinematicを変更する。

  private Rigidbody rb;
  
  void Start() {
    rb = this.GetComponent<Rigidbody>();
    rb.isKinematic = false;
  }

相手(cube)に付いているRigidbodyのisKinematicを変更する。

  private Rigidbody rb;
  public GameObject cube; // 予めcubeをinspectorで入れておく場合.
  
  void Start() {
    rb = cube.GetComponent<Rigidbody>();
    rb.isKinematic = false;
  }


例えばですが、当たった相手の動きを止めるとかであればGetComponentで相手のスクリプトを取ってきて、boolを変更してあげればできそうですよね。こんな感じ。

  void OnTriggerEnter(Collider col) {
    if(col.tag == "Enemy"){
       col.GetComponent<Enemy>().enableMove = false; // Enemy.csには public bool enableMove;を持っている。
    }
  }
  • しかし何回もGetComponent書くのはあんまりきれいではないんですよね。

上のコードでは、、、

 col.GetCompoment<Enemy>().enableMove = false;

と書いていますが、これは一度だけ呼び出すのでまとめて書いてしまいました。
ですが3行や4行と変更する点があるときはコードの量が増えてしまうのでローカル変数でもいいので一度の変数に受けてあげます。

private Enemy enemy;

if(col.tag == "Enemy"){
   enemy = col.GetComponet<Enemy>();
   enemy.enableMove = false;
   enemy.hp -= 10;
}

こうするとGetComponentを一回だけで済むのでスマートに書けますね。
UnityではComponentを取得してそれを変更するというのが基本的にはかなり多くなってくるのでこれがわかればとりあえずはゲームができると思います。UI周りもほとんどこれですね。

例えばScoreを表示させてリアルタイムで変更させたい場合

public GameObject score; // publicのTextでもいいのですがGetComponentを理解するため
private Text score_text;
private int game_score;

void Start() {
    score_text = score.GetComponent<Text>();
}

void Update () {
     score_text.text = "現在のスコア : " + game_score + "点";
}

結構簡単に書けますね。