Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#OnTriggerEnter NullReferenceException_C#_Unity3d_Collision - Fatal编程技术网

C#OnTriggerEnter NullReferenceException

C#OnTriggerEnter NullReferenceException,c#,unity3d,collision,C#,Unity3d,Collision,我正在使用ZDK从Zigfu游戏项目在我的研究。我拿着标准的头像,将两个对撞机(带刚体的球体对撞机)连接到手上。一只左手,一只右手。 我在阿凡达周围建立了一些(24)盒对撞机,以跟踪手是否进入一个新的区域。在以下脚本中,每个框都有一个从0到23的“id”: 使用UnityEngine; 使用系统集合; 公共类跟踪:单一行为 { 公共int id; 无效对撞机(对撞机其他){ if(other.tag==“HandsleeftTracking”){ 打印(“左手输入:+id”); playerCo

我正在使用ZDK从Zigfu游戏项目在我的研究。我拿着标准的头像,将两个对撞机(带刚体的球体对撞机)连接到手上。一只左手,一只右手。 我在阿凡达周围建立了一些(24)盒对撞机,以跟踪手是否进入一个新的区域。在以下脚本中,每个框都有一个从0到23的“id”:

使用UnityEngine;
使用系统集合;
公共类跟踪:单一行为
{
公共int id;
无效对撞机(对撞机其他){
if(other.tag==“HandsleeftTracking”){
打印(“左手输入:+id”);
playerCommunication.activity+=0.1f;
playerCommunication.handsLeft[id]=true;//这里是异常
}
else if(other.tag==“HandRightTracking”){
打印(“右侧输入:+id”);
playerCommunication.activity+=0.1f;
playerCommunication.handsRight[id]=true;//这里是异常
}
}
void OnTriggerExit(碰撞器其他){
if(other.tag==“HandsleeftTracking”){
打印(“左手退出:+id”);
playerCommunication.activity+=0.01f;
playerCommunication.handsLeft[id]=false;//这里是异常
}
else if(other.tag==“HandRightTracking”){
打印(“右侧退出:+id”);
playerCommunication.activity+=0.01f;
playerCommunication.handsRight[id]=false;//这里是异常
}
}
}
在播放器的另一个脚本中,我想使用这些碰撞。handsTracking.cs应仅编辑playerCommunication.cs脚本中的值:

使用UnityEngine;
使用系统集合;
公共课堂游戏沟通:单一行为{
公共静态版权;
公共静态bool[]左手;
公众静态浮动活动;
公共浮动备用;
//用于初始化
无效唤醒(){
活动=0.0f;
}
//每帧调用一次更新
无效更新(){
如果((活动-回退*时间.延迟时间)>=0.0f){
活动-=回退*Time.deltaTime;
}
}
void OnGUI(){
GUI.Box(新Rect(10200150,20),“活动:”+活动);
}
}
到目前为止,这很好用。但我有以下例外情况:

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中的数组,但没有任何效果。我不明白碰撞和阵列之间的联系

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

你有以下声明:

public int id;
之后,您将获得以下代码行:

print("leftHand entered: " + id);
将其更改为,例如:

Debug.Log("ID value is now: " + id);
您可能会看到以下内容:

ID value is now: null

您尚未给出
id
值。调用
playerCommunication.handleft[id]=true时
,实际上您正在尝试将数组的null'est值设置为
true
。确保将
id
-值设置为某个值。您说每个框都有一个从0到23的id值。您在Unity properties视图中正确设置了吗?

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

例如,您可以在
唤醒中初始化它们:

int[] array1 = new int[5];

public static bool[] handsLeft;

// Use this for initialization
void Awake () {
    activity = 0.0f;
    handsLeft = new bool[ARRAY_SIZE];
}
可能您试图从inspector初始化这些数组字段,但它们被声明为静态,因此当您从编辑器切换到播放模式时,
Unity3D
不会序列化它们

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

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

static playerCommunication ()
{
     handsLeft = new bool[ARRAY_SIZE];
     handsRight = new bool[ARRAY_SIZE];
}

我想你之所以得到异常是因为你没有访问播放器上的playerCommunication脚本,而是试图使用脚本文件夹中的脚本,而脚本文件夹中没有设置任何公共手持权限等

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

playerCommunication.handsLeft[id] = true;
为此:

GameObject.Find("Avatar").GetComponent<playerCommunication>().handsLeft[id] = true;
GameObject.Find(“化身”).GetComponent().handleft[id]=true;

其中,“阿凡达”将是阿凡达/玩家游戏对象的名称,玩家通信是该对象内具有左手公用布尔的脚本。

我在Unity inspector中设置了id。当然,我用
print(“id”)检查了id的值我尝试调试。现在登录。这里的变量也是正确的:
ID值现在是:19 UnityEngine.Debug:Log(Object)handsTracking:OnTriggerEnter(Collider)(位于Assets/SeriousGame/Scripts/handsTracking.cs:11)
在第19行,您的错误发生在哪里,我看到了
。我从顶部开始倒数,所以看不到行号。错误具体发生在哪一行?啊,对不起,我对代码做了一些实验,所以错误与这里的代码不匹配。我现在又开始了,仍然是
playerCommunication.handsLeft[id]=true。。。在这里,他抛出了一个异常……HandRight被声明为static,因此他可以直接访问rough类名。@Heisenbug它是静态的,但在Unity中,您可以填充数组并从Inspector设置其大小。听起来他为播放器对象设置了大小并填充了数组,但文件夹中的脚本仍然没有。因此,在e和e之间切换时,exception.static字段不会序列化