Unity はスクリプトを使用してオブジェクトとコンポーネントを取得します (オン)

1. オブジェクト、コンポーネント、およびオブジェクト

ゲームオブジェクトはオブジェクトであり、オブジェクトから削り取られていないスクリプトは梨の花の涙であり、当面は特定のオブジェクトではありませんが、スクリプトがオブジェクトに掛けられると、それは実際のオブジェクトになります。

スクリプトが実行されると、通常は特定の皇帝の村に吊るされます。したがって、スクリプト コードでは、ゲームオブジェクトを直接使用するだけで、スクリプトが現在アタッチされているオブジェクトにいつでもアクセスできます。

以下は両方とも問題ありません、これは省略できます

Debug.Log(ゲームオブジェクト名);

Debug.Log(this.gameObject.name);

2. コンポーネントの入手方法

オブジェクトを取得した後、そのオブジェクトを通じてその各コンポーネントを取得できます。たとえば、新しいテスト スクリプト ファイルを作成し、球体に掛けます。スクリプトの内容はデフォルトのままです。Sphere Collider コンポーネントを取得するには、GetComponent() メソッドを直接使用して、次のようにテスト スクリプトの内容を変更します。

UnityEngine を使用する。

パブリック クラス テスト: MonoBehaviour

{

      SphereCollider コライダー。

      void Start()

       {

           collider=gameObject.GetComponent<SphereCollider>();

       }

上記は、コンポーネントを取得するための非常に一般的なコードです。つまり、まず現在のスクリプトからゲーム オブジェクトを取得し、次にゲーム オブジェクト内で特定のコンポーネントを見つけます。

Transform コンポーネントは GetComponent() メソッドを使用して取得することもできますが、Transform コンポーネントは非常に一般的に使用されるため、フィールド変換を通じていつでもアクセスでき、コードを通じて取得する必要はありません。

便宜上、Unity は相互に競合するコンポーネントを作成する簡単な方法を設計しました。このアイデアは、別のオブジェクト上で、最初にゲーム オブジェクトを取得することなく、任意のコンポーネントから開始して他のコンポーネントを直接取得できるということです。言い換えると、コンポーネントを取得するための同等の記述形式が多数あります。たとえば、次のようになります。

collider=gameObject.getComponent<SphereCollider>();

//以下の各文は上の文と同等です

collider=this.GetComponent<SphereCollider>();

collider=GetComponent<SphereCollider>();

collider=transform.GetComponent<SphereCollider>();

 複数の同一のコンポーネントを取得する必要がある場合は、GetComponents() メソッドを使用する必要があります。このメソッドは通常、配列に格納されます。

3. オブジェクトの入手方法

1. オブジェクトを名前で取得する

GameObject.Find() メソッドを使用するだけです。例: 新しいキューブを作成し、TestGetObject スクリプトをハングします。内容は次のとおりです。

パブリック クラス TestGetGameObject : MonoBehaviour

{

     ゲームオブジェクト objMainCam;

     ゲームオブジェクトobjMainLight;

     void Start()

     {

        objMainCam=GameObject.Find("メインカメラ");

         objMainLight=GameObject.Find("指向性ライト");

         Debug.Log("メインカメラ: "+objMainCam.name);

         Debug.Log("メインライト: "+objMainLight.name);

         //メインカメラをこのオブジェクトの 1m 後ろに配置します

         objMainCam.transform.position=transform.position-transform.forward;

      }

}

GameObject.Find() メソッドがより一般的に使用されますが、2 つの欠点があります。

  • 非アクティブなオブジェクトが見つかりません
  • シーン内のすべてのオブジェクトをトラバースする必要があるため、パフォーマンスの点で非常に非効率的です     

最初の欠点を確認するには、上記の例でシーン光源を無効にして (インスペクター ウィンドウで Drectional Light オプションのチェックを外して)、再度実行するとエラーが表示され、例外タイプは NullReferenceException (ヌル参照)。エラーをダブルクリックすると、対応するソース コードが表示されます。ソース コードは次のとおりです。

Debug.Log("メインライト: "+objMainLight.name);

これは、現在 null 参照であるため、名前フィールドにアクセスするとエラーが報告されるためです。GameObject.Find() メソッドが非アクティブなオブジェクトを見つけられないことを示しています。

2つ目のデメリットは、単純なシーンでは検出が難しいことです。ゲーム全体では、シーン内に数千のオブジェクトが存在することが多く、効率の違いは明らかです。ただし、これは GameObject.Find() メソッドが使用できないという意味ではありません。Start メソッドで一度呼び出しただけで、objMainCam にオブジェクトを保存した場合、後で再度検索する必要がないため、効率に明らかな違いはありません。

2. タグによるオブジェクトの検索

例を挙げて説明する

// Player というラベルが付いた最初のオブジェクトを検索します

GameObject player=GameObject.FindGameObjectWithTag("Palyer");

//Monster というラベルが付いたすべてのオブジェクトを検索します。戻り値は単なる配列で、結果は 0 以上になる可能性があります。

GameObject[]Monsters=GameObject.FindGameObjectsWithTag("Monser");

 インスペクターでオブジェクトのラベルを変更するだけでなく、次のようにスクリプトでも変更できます。

GameObject m=GameObject.FindGameObjectWithTag("プレイヤー");

m.tag="キューブ";

if(m.CompareTag("Cube")) //CompareTag の使用法は m.tag=="Cube" と同等なので、CompareTag を使用することをお勧めします

{

......//少し

}

 

おすすめ

転載: blog.csdn.net/m0_63024355/article/details/130507378