Unity でゲーム オブジェクトを取得するいくつかの方法

オブジェクトとコンポーネントを取得する方法を学ぶときは、まずオブジェクト、コンポーネント、およびオブジェクトとは何かを説明します。

オブジェクト: 統一された階層に表示されるすべてのものをオブジェクトと呼ぶことができます

コンポーネント: Unity は、剛体、衝突体など、多数の作成済みコンポーネントを提供しており、自分で作成したスクリプトもコンポーネント クラスです。

オブジェクト: オブジェクトにマウントされたスクリプトは、インスタンス化されたコンポーネント、つまりオブジェクトです。

ゲーム オブジェクトはオブジェクトです。オブジェクトにマウントされていないスクリプトはインスタンス化されていないクラスであり、スクリプトがオブジェクトにマウントされると、実際のオブジェクトになります。

コンポーネントを取得するメソッド

(1)GetComponent()

Rigidbody2D M_Rigidbody2D; 
void Start()
{
    //获取到组件后,将它的 引用!! 保存在M_Rigidbody2D字段中,方便下次使用
    M_Rigidbody2D = gameobject.GetComponent<Rigidbody2D>();
   //这是很常见的获取组件的代码,gameobject是从当前脚本组件获取到游戏物体,GetComponent就是从游戏物体中获取到指定的组件
}

(2) GetComponents(): このメソッドは上記のメソッドに似ていますが、その戻り値は配列です。これは、ゲーム オブジェクトで同じタイプの複数のコンポーネントを取得し、同じタイプのすべてのコンポーネントを取得するために使用されます。

オブジェクトを取得するメソッド

(1) GameObject.Find(): オブジェクト名でオブジェクトを取得する

欠点が 2 つあります.1 つは、GameObject.Find() が非アクティブなオブジェクトを見つけることができないことです.2 番目に、GameObject.Find() はシーン内のすべてのオブジェクトをトラバースする必要があります.

(2) GameObject.FindGameObjectWithTag(): タグを介してオブジェクトを検索します。このメソッドはゲーム オブジェクトを返します。

GameObject.tag=="" と同じ true または false を返す CompareTag() メソッドもあります。

(3)オブジェクトオブジェクトを取得するための親子関係

transform.Find("子オブジェクトの名前") は子オブジェクトを見つけます

transform.GetChild() シリアル番号で子オブジェクトを検索

オブジェクトとコンポーネントを取得するパブリック変数を取得する

上記のオブジェクトやコンポーネントを取得する際は、スクリプト内で全て割り当てますが、実はunityコンパイラでも取得可能です。

(1) オブジェクトを取得する (最も一般的に使用される)

(2) コンポーネントを取得する

コンポーネントの取得もオブジェクトの取得と似ていますが、インスペクターウィンドウにもコンポーネントの割り当てバーがありますが、違いは、コンポーネントをドラッグして割り当てるのではなく、コンポーネントを持ったゲームオブジェクトをドラッグして割り当てることです。割り当て、結局、取得したコンポーネントの目的は、ゲームオブジェクト上の特定のコンポーネントを取得することです

要約する

获取游戏对象和组件方法其实有很多,上面的方法也只是列举的比较常用的,在获取物体时,脚本在物体上时--直接用GameObject就能获取,脚本不在物体上--用public公共变量获取;在获取组件时,脚本(其实脚本也算是组件)如果和组件在同一个对象上--用gameobject.GetComponent;如果脚本和组件不在同一个对象上--用public公共变量获取

现在我才发现,在使用public方法对变量或者组件,对象进行赋值时,当游戏物体被制作成预制件之后,通过预制件的方式用到场景中去,之前使用public赋值的方法需要重新再拖曳赋值,比较麻烦,因此再这里再详细介绍下通过

代码来查找物体的方法:

(1)GameObject.Find(string name)//按名字寻找对象,1.只能找到激活对象,2 尽量保证名字是唯一的,不唯一可以用路径 3.效率低会遍历场景中的所有对象

(2)GameObject.FindWithTag(string tag);//按标签寻找对象,1.只能找到激活对象

(3)GameObject.FindGameObjectWithTag(string tag)//按标签寻找对象,1.只能找到激活对象

//注意FindGameObjectWithTag和FindWithTag的作用是一样的,只是名字不一样

(4)GameObject.FindGameObjectsWithTag(string tag)//按标签寻找对象数组,1.只能找到激活对象

(5)transform.Find()//按名字寻找子物体的对象,1.可用于未激活物体,2.多重子物体时需写全路径

(6)transform.GetChild()//按索引寻找子物体的对象,1.可用于未激活物体2.多重子物体可以多次使用GetChild()

绝大部分寻找到物体就是为了获取该物体身上的组件,有时候可以直接用代码获取

gameObject.GetComponent//通过以上方法获取对象后,再结合这个方法就能获取到想要的组件

//当想要获取游戏子对象上的组件时,可以先不用获取到子对象再获取组件,可以直接用下面的方法获取组件

(1)transform.parent//得到父对象的transform组件

(2)transform.GetComponentInChildren<T>()//获取子物体对应的组件,1.可用于未激活物体,不过需要参数里面写true,注意:这里不能直接获取<GameObject>,具体原因我也不是太清楚

(3)transform.GetComponentsInChildren<T>()//获取子物体对应的组件,返回值是数组

(4)transform.GetChildCount()//被弃用了,现在是通过transform.childCount来获取子对象的个数

おすすめ

転載: blog.csdn.net/qq_62947569/article/details/128588952