我的目标是找到给定类型的所有对象,使用 Linq 对它们进行一些过滤并交换它们的精灵(交换工作)。请注意,我将其用作编辑器脚本,而不是运行时。
var objs = GameObject.FindObjectsOfType<GameObject>()
.Where(g =>
{
var sr = g.GetComponent<SpriteRenderer>();
if (sr != null)
{
if (sr.sprite.name.Equals(_from.name)) { return true; } //error here
return false;
}
return false;
}).AsEnumerable();
它的大多数时间,但现在我正在
NullReferenceException:未将对象引用设置为对象的实例 SwapSprites.m__0(UnityEngine.GameObject g)(在Assets / SwapSprites.cs:44)
即使我在场景中有一堆对象,其精灵是我用作 _from 的精灵。
我不知道出了什么问题。我希望找到所有带有 SpriteRenderer 的对象,它们的精灵是我正在寻找的。
有什么奇怪的,虽然在调试时我确实得到了一堆结果,但最终不是我所追求的,最终我得到了这个例外。
答案 0 :(得分:2)
在使用sr = g.GetComponent<SpriteRenderer>()
之前,您已经检查过null
。
问题可能是_from.name
或sr.sprite.name
,因为这两个问题都是从类null
访问变量。
请注意,SpriteRenderer
可能未分配Sprite
。在这种情况下,您还必须在使用Sprite
或检查其name
属性之前检查 var objs = GameObject.FindObjectsOfType<Transform>()
.Where(g =>
{
var sr = g.GetComponent<SpriteRenderer>();
if (sr != null)
{
if (sr.sprite != null)
{
if (sr.sprite.name.Equals(_from.name)) { return true; }
}
return false;
}
return false;
}).AsEnumerable();
是否为空。
%userprofile%\AppData\Local\nvim\init.vim