我在学习中使用Zigfu的ZDK for Game Project。我拿了标准化身并将两个碰撞器(球体碰撞器与刚体)连接到手上。一个用于左手,一个用于右手。 我在头像周围建造了一些(24)盒子对撞机,以跟踪手是否正在进入一个新区域。每个框都有一个“id”,从0到23,以下脚本:
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中处理数组,但没有任何效果。我不明白碰撞和数组之间的联系?!
答案 0 :(得分: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 staticcor中初始化它们:
static playerCommunication ()
{
handsLeft = new bool[ARRAY_SIZE];
handsRight = new bool[ARRAY_SIZE];
}
答案 1 :(得分: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
- 值设置为某个值。您说每个框的id值都是0到23.您是否在Unity属性视图中正确设置了它?
答案 2 :(得分:0)
我猜你得到异常的原因是因为你没有访问播放器上的playerCommunication脚本,而是试图使用脚本文件夹中的那个,我想象的不是在公共handsRight等上设置任何东西。
您需要做的是替换这样的行:
playerCommunication.handsLeft[id] = true;
用这个:
GameObject.Find("Avatar").GetComponent<playerCommunication>().handsLeft[id] = true;
其中“Avatar”将是头像/玩家游戏对象的名称,而playerCommunication是该对象中具有handsLeft公共bool的脚本。