使用FindObjectofType和FindObjectOfTypeAll Unity方法

时间:2014-08-15 18:52:20

标签: unity3d

GameObject[] rm = FindObjectsOfTypeAll(typeof(RoadMovement)) as GameObject[];
        if (Input.GetKeyDown (KeyCode.LeftArrow)) 
        {
        foreach(GameObject r in rm)  //objectRefrence not set to instance of an object error here
        {
            var bounds1 = r.renderer.bounds;
            var bounds2 = player.renderer.bounds;
            Transform roadtransform = r.transform;
            if(bounds1.Intersects(bounds2))
            {

                    if (this.transform.position.x > r.renderer.bounds.min.x)
                        this.transform.position = new Vector3 (this.transform.position.x - 0.6f, this.transform.position.y, this.transform.position.z); 
                }
            }
        }

FindObjectOfTypeFindObjectOfTypeAll之间有什么区别?我想获取附有RoadMovement脚本的所有对象。我理解错误:Object reference not set to an instance但不知道如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

第一个问题:FindObjectsOfTypeAll已被弃用了很长时间,并且在当前版本的Unity中根本不再记录。因为您要比较场景中的对象,所以看起来您需要Object.FindObjectsOfType

第二个问题:您正在进行的查找调用并不返回GameObject数组,因此as运算符将在强制转换失败时返回null。您提到RoadMovement是您编写的行为脚本。这意味着每个RoadMovement 都有一个GameObject,但并不是每个RoadMovement 都是一个GameObject。

这也是您获得InvalidCastException以及asking about的原因。了解您的退货类型,您将了解错误。

最近的Unity版本甚至添加了FindObjectsOfType的通用版本:

RoadMovement[] roadMovements = Object.FindObjectsOfType<RoadMovement>();
foreach (RoadMovement roadMovement in roadMovements) {
    GameObject myGameObject = roadMovement.gameObject;
    //do something
}