1

我在学习中使用 Zigfu 的 ZDK 进行游戏项目。我拿了标准的化身并在手上附加了两个对撞机(带刚体的球体对撞机)。一个用于左手,一个用于右手。我在化身周围构建了一些 (24) 盒式对撞机,以跟踪手是否正在进入新区域。每个盒子都有一个从 0 到 23 的“id”以及以下脚本:

using UnityEngine;
using System.Collections;

public class handsTracking : MonoBehaviour 
{
    public int id;

    void OnTriggerEnter (Collider other) {
        if(other.tag == "handsLeftTracking"){
            print("leftHand entered: " + id);
            playerCommunication.activity += 0.1f;
            playerCommunication.handsLeft[id] = true; //here ist the exception
        }
        else if (other.tag == "handsRightTracking"){
            print("rightHand entered: " + id);
            playerCommunication.activity += 0.1f;
            playerCommunication.handsRight[id] = true; //here ist the exception
        }
    }
    void OnTriggerExit (Collider other) {
        if(other.tag == "handsLeftTracking"){
            print("leftHand exited: " + id);
            playerCommunication.activity += 0.01f;
            playerCommunication.handsLeft[id] = false; //here ist the exception
        }
        else if (other.tag == "handsRightTracking"){
            print("rightHand exited: " + id);
            playerCommunication.activity += 0.01f;
            playerCommunication.handsRight[id] = false; //here ist the exception
        }
    }
}

在播放器的另一个脚本中,我想使用这些碰撞。handsTracking.cs 应该只编辑 playerCommunication.cs 脚本中的值:

using UnityEngine;
using System.Collections;

public class playerCommunication : MonoBehaviour {

    public static bool[] handsRight;
    public static bool[] handsLeft;
    public static float activity;
    public float fallback;

    // Use this for initialization
    void Awake () {
        activity = 0.0f;
    }

    // Update is called once per frame
    void Update () {
        if((activity - fallback * Time.deltaTime) >= 0.0f){
            activity -= fallback * Time.deltaTime;
        }
    }

    void OnGUI () {
        GUI.Box (new Rect (10,200,150,20), "Activity: " + activity);    
    }
}

到目前为止,这工作正常。但我得到以下例外:

NullReferenceException: Object reference not set to an instance of an object
handsTracking.OnTriggerEnter (UnityEngine.Collider other) (at Assets/SeriousGame/Scripts/handsTracking.cs:19)

如果我推荐我尝试编辑数组的行,错误就消失了。我试图在 playerCommunication 脚本中调用一个函数,或处理 handsTracking.cs 中的数组,但没有任何效果。我不明白碰撞和数组之间的联系?!

4

3 回答 3

3

您的数组从未被初始化过。你得到了一个NullReferenceException,因为你的数组是对 null 的引用,因为它没有被分配到任何地方。

例如你可以在里面初始化它们Awake

int[] array1 = new int[5];

public static bool[] handsLeft;

// Use this for initialization
void Awake () {
    activity = 0.0f;
    handsLeft = new bool[ARRAY_SIZE];
}

也许您已尝试从检查器初始化这些数组字段,但它们被声明为静态,因此当您从编辑器切换到播放模式时Unity3D 不会序列化它们。

请注意,静态字段将由playerCommunication类的所有实例共享。所以,如果你想让几个 GameObject 使用这个脚本,在你的数组中有不同的值,你不应该将它们声明为静态的。

如果您想有效地将​​它们声明为静态,因为您不知道类的创建顺序,最好在类静态构造函数中初始化它们:

static playerCommunication ()
{
     handsLeft = new bool[ARRAY_SIZE];
     handsRight = new bool[ARRAY_SIZE];
}
于 2013-04-23T12:55:29.820 回答
0

您得到 nullpointerexception 的原因是因为您尝试在数组中添加一个尚未初始化的对象。

您有以下声明:

public int id;

之后,您将拥有以下代码行:

print("leftHand entered: " + id);

将其更改为,例如:

Debug.Log("ID value is now: " + id);

您可能会看到以下内容:

ID value is now: null

你还没有给出id一个值。当您调用时playerCommunication.handsLeft[id] = true;,您实际上是在尝试将数组的 null'est 值设置为true。确保将id-value 设置为某个值。你说每个盒子都有一个从 0 到 23 的 id 值。你在 Unity 属性视图中设置正确了吗?

于 2013-04-23T11:33:20.790 回答
0

我猜测您收到异常的原因是因为您没有访问播放器上的 playerCommunication 脚本,而是尝试使用脚本文件夹中的那个(我想)没有任何设置在公众手中等。

您需要做的是替换这样的行:

playerCommunication.handsLeft[id] = true;

有了这个:

GameObject.Find("Avatar").GetComponent<playerCommunication>().handsLeft[id] = true;

其中“Avatar”将是化身/玩家游戏对象的名称,而 playerCommunication 是该对象中具有 handsLeft 公共布尔值的脚本。

于 2013-04-23T13:04:09.983 回答