【初心者向け】他のオブジェクトのスクリプトを取得する方法【Unity】

キューブ Unity

私がUnityを始めたばかりのころ、どうやったら他のオブジェクトのスクリプトを取得できるのかが分かりませんでした。
今回は取得する方法を2種類紹介します。
これ以外にも取得する方法はあるかもしれません。

GameObject.Findメソッド

こちらのメソッドは名前でオブジェクトを検索して、そのオブジェクトを返します。
見つからなかった場合はnullを返します。

しかし、このメソッドは処理が重いので使うのは避けるべきだという意見が多く、私も使わないようにしていますが、とりあえず説明だけしてみます。

まずTest1スクリプトTest2スクリプトを作ります。

Test1スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test1 : MonoBehaviour
{
    private GameObject gameObject2;
    private Test2 test2;

    // Start is called before the first frame update
    void Start()
    {
        gameObject2 = GameObject.Find("GameObject2");
        test2 = gameObject2.GetComponent<Test2>();

        test2.Kamikoppu();
    }
}

Test1スクリプトでは
GameObject型のインスタンスgameObject2と、Test2型のインスタンスtest2を作っています。
StartメソッドではFindメソッドを使い“GameObject2”というオブジェクトを探し、gameObject2に代入しています。
次にGetComponentメソッドを使ってGameObject2のTest2test2に代入しています。
そしてtest2.Kamikoppu()Kamikoppuメソッドを実行しています。

Test2スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test2 : MonoBehaviour
{
    public void Kamikoppu()
    {
        this.transform.position = new Vector3(10, 0, 0);
        Debug.Log("かみこっぷ");
    }
}

Test2スクリプトでは、Kamikoppuメソッドの中身を書いています。
まず自身のpositionを(10,0,0)にしています。
次にDebug.Logメソッドかみこっぷと表示させています。

画像のように空のGameObjectを作ります。
名前は何でもよいのですが今回はGameObject1GameObject2にします。
GameObject1にTest1を、GameObject2にTest2をアタッチしてください。

これで実行してみるとConsoleに「かみこっぷ」と表示され、GameObject2のpositionが(10,0,0)になっている事が確認できると思います。



GameObject1のスクリプトからGameObject2のスクリプトを取得し、処理をすることが出来ました。

public GameObject

public GameObjectを説明します。
Test1スクリプトをこのように変えてください

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test1 : MonoBehaviour
{
    public GameObject gameObject2;
    private Test2 test2;

    // Start is called before the first frame update
    void Start()
    {
        test2 = gameObject2.GetComponent<Test2>();
        test2.Kamikoppu();
    }
}

書き換えた後、GameObject1のInspectorを見てみると、このようにTest1のGameObject2にオブジェクトをドラッグアンドドロップ出来るようになっています
これは7行目のアクセス修飾子をprivateからpublicにしたからです。

HierarchyのGameObject2をInspectorにドラッグアンドドロップしてみましょう。



この状態でテストプレイして先程と同じ結果になったら成功です。
Findメソッドを使わずにオブジェクトを取得することが出来ました。

実行されるスクリプト

ここは私が迷ったところです。
同じスクリプトをアタッチしていても、実行されるのは取得したオブジェクトの処理という事なのですが、それが最初に理解できなかったので書いておこうと思います。

まずInspectorにあるGameObject2GameObject2_1という名前に変えてください。
次に、また新たに空のオブジェクトを作り、名前をGameObject2_2にしてください。
GameObject2_2にもTest2スクリプトをアタッチしてください。



このようになればOKです。

少しややこしくなってしまいましたが、
GameObject1にTest1がアタッチされていて、
GameObject2_1とGameObject2_2にTest2がアタッチされていて、
GameObject1のInspectorのGameObject2にGameObject2_1がアタッチされていれば大丈夫です。

この状態で実行してみると



Test1のGameObject2にアタッチしたGameObject2_1のPositionは動きGameObject2_2のPositionは動いていません
GameObject2_1、GameObject2_2、どちらもTest2という同じスクリプトをアタッチしていても、処理されるのは取得した方という事です。

独学なので悩むポイントがおかしかったかもしれませんが、誰かの役に立てましたら幸いです。

コメント

タイトルとURLをコピーしました