C# 为什么在对象完成移动后,我总是得到null异常?

C# 为什么在对象完成移动后,我总是得到null异常?,c#,unity3d,C#,Unity3d,空异常位于以下行: if (boid == null) print("It's null !!!!!"); alignment+=boid.GetComponent().velocity; 我有5个球体,附加了相同的脚本,速度设置为X=1y=1z=1 我尝试在这里学习教程: 但是我不明白为什么会出现null异常。如果null不重要,那么就这样写: alignment += boid.GetComponent<BoidFlocking>()

空异常位于以下行:

if (boid == null)
                    print("It's null !!!!!");
alignment+=boid.GetComponent().velocity;
我有5个球体,附加了相同的脚本,速度设置为X=1y=1z=1

我尝试在这里学习教程:


但是我不明白为什么会出现null异常。

如果null不重要,那么就这样写:

alignment += boid.GetComponent<BoidFlocking>().velocity;
alignment+=boid?.GetComponent()?.velocity??矢量3.0;

这一行表示,如果
boid
GetComponent()
为空,则使用
Vector3.zero
作为默认值。

如果为空无关紧要,则按以下方式编写:

alignment += boid.GetComponent<BoidFlocking>().velocity;
alignment+=boid?.GetComponent()?.velocity??矢量3.0;

这一行表示,如果
boid
GetComponent()
为空,则使用
Vector3.zero
作为默认值。

您准确地获得了哪些与空相关的异常?现在,在同一行中有两个命令(成员访问链)。请使用临时变量将它们拆分为多行,以便更好地定位错误点。不要担心性能。JiT编译器非常擅长在发布版本中删除这些“无用”变量。检查从
GetComponent()
返回的值。最有可能是空的。您可以将条件更改为:
if(boid?.GetComponent()==null)
,这将测试
boid
GetComponent
的返回值,您可以准确地得到哪些与空相关的异常?现在,在同一行中有两个命令(成员访问链)。请使用临时变量将它们拆分为多行,以便更好地定位错误点。不要担心性能。JiT编译器非常擅长在发布版本中删除这些“无用”变量。检查从
GetComponent()
返回的值。很可能是空的。您可以将条件更改为:
if(boid?.GetComponent()==null)
,这将测试
boid
GetComponent
的返回值。我收到此错误:功能“null传播运算符”在C#4中不可用。请使用语言版本6或更高版本,然后启用.net 4.6以访问C#6。要启用.net 4.6支持,请转到编辑->项目设置->播放器->其他设置->配置->脚本运行时版本,并将“Api兼容级别*”设置为.net 4。6@DanielLip或者,检查
如果(boid.GetComponent()==null)
,因为boid不需要为null,这样它就不会受到
BOIDFLOCK
组件的攻击。
?。
的全部目的是在不在乎它是否为null时消除null检查。如果(something==null)你想做
if(something==null)
只有在你关心并且想做点什么的时候。我得到了这个错误:功能“null传播操作符”在C#4中不可用。请使用语言版本6或更高版本,然后启用.net 4.6以访问C#6。要启用.net 4.6支持,请转到编辑->项目设置->播放器->其他设置->配置->脚本运行时版本,并将“Api兼容级别*”设置为.net 4。6@DanielLip或者,检查
如果(boid.GetComponent()==null)
,因为boid不需要为null,这样它就不会受到
BOIDFLOCK
组件的攻击。
?。
的全部目的是在不在乎它是否为null时消除null检查。如果(something==null)你想做
只有在你关心并且想做点什么的时候。
alignment += boid?.GetComponent<BoidFlocking>()?.velocity ?? Vector3.zero;