ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity入門 - GetComponent、スクリプトからゲームオブジェクトを操作する -

初めに



 スクリプトからゲームオブジェクトを操作する方法を解説します。

操作の仕方まとめ

 次の流れでスクリプトからゲームオブジェクトを操作します。

  1. ゲームオブジェクトを取得する
  2. コンポーネントを取得する
  3. ゲームオブジェクトを操作する

ゲームオブジェクトを取得する

 ゲームオブジェクトの取得の仕方はいくつかあります。今回は頻繁に使う2つの方法を載せておきます。

①public GameObjectを使い、ヒエラルキーから取得する
 スクリプトにpublic GameObject (オブジェクト名)と記述します。publicはアクセス修飾子と呼ばれるものになります。こちらの記事で紹介しております。

fineworks-fine.hatenablog.com



 ゲームオブジェクトにスクリプトをアタッチし、取得したいゲームオブジェクトをインスペクターから取得する。




 これでスクリプトのTargetObjectの中に、ゲームオブジェクト(今回は"Cube")が取得できました。

②Find関数を使う

  public GameObject TargetObject;

  void Start()
  {
       TargetObject = GameObject.Find("Cube");
       //GameObject.Find("取得したいゲームオブジェクト名");
  }

 Find関数を使うことで、ゲームオブジェクトを取得できます。実際にゲームを実行してみると、取得できていることが分かると思います。

 Find関数は

  • GameObject.Find():ゲームオブジェクトを取得
  • transform.Find():transformを取得

があります。ほかにも指定されたタグが付いているオブジェクトを取得するものなどあります。処理が重いため、乱用は避けなければいけませんが、便利なので覚えておきましょう。

(Unity公式によるFind関数の説明)
docs.unity3d.com
docs.unity3d.com

 なお、スクリプトを操作したいオブジェクト本体にアタッチする場合は、ゲームオブジェクトを取得する必要はありません。

コンポーネントを取得する

 コンポーネントとは、オブジェクトの構成要素のことです。オブジェクトについているTransformやスクリプトなどオブジェクトにアタッチされているものはすべてコンポーネントです。

  public GameObject TargetObject;
  Transform TargetTransform;  
  //取得したいコンポーネントとその名前を記述
  //今回はTransformを取得する. 名前をTargetTransformと名付けた

  void Start()
  {
       TargetObject = GameObject.Find("Cube");
       TargetTransform = TargetObject.GetComponent<Transform>();
       //TargetObjectからTransformのコンポーネントを取得
       //オブジェクト名.GetComponent<取得したいコンポーネント>();
  }

 上記のようにコンポーネントを取得します。操作したいオブジェクトに直接、スクリプトをアタッチしている場合は次のように"this"を使います。オブジェクトを取得する必要もないため、コンポーネントのみの記述でよいです。

  Transform TargetTransform;  

  void Start()
  {
       TargetTransform = this.GetComponent<Transform>();
  }
ゲームオブジェクトを操作する

 取得したコンポーネントに応じて、いろいろな操作ができます。今回はTransformを取得して、オブジェクトを動かしてみます。

    public GameObject TargetObject;
    Transform TargetTransform;

    void Start()
    {
      TargetObject = GameObject.Find("Cube");
      TargetTransform = TargetObject.GetComponent<Transform>();
    }

    void Update()
    {
      TargetTransform.position += new Vector3(0.05f, 0.0f, 0.0f);
     //取得したTransformのコンポーネントのポジションに毎フレーム右辺のベクトルを追加
    }

 ゲームを実行すると次のようになります。

最後に

 スクリプトからゲームオブジェクトを操作する方法をまとめました。スクリプトを使うのであれば、GetComponentは必須です。繰り返し使うことになるので、意識せずとも使えるようになると思われます。