【发布时间】:2017-09-19 08:41:53
【问题描述】:
我有一个包含嵌套预制件的场景。 嵌套预制件包含多个桶预制件(下图)
这些桶形预制件具有组件:变换、动画、网格过滤器和网格渲染器
问题是我无法通过代码找到网格过滤器和网格渲染器。在 Unity 播放器中一切正常!但是当我为 pc 构建时,我在 `gobj.getComponent 上得到了一个空引用,但只在具有“桶”标签的对象上,(油工作正常并且具有相同的组件):
private void EvaluateAll() //gets called from awake
{
EvaluateDissolve();
EvaluateFish();
EvaluateFloor();
EvaluateFogCol();
EvaluateFogDens();
EvaluatePlants();
EvaluateRocks();
}
private void EvaluateDissolve()
{
foreach (GameObject gobj in GameObject.FindGameObjectsWithTag("oil"))
{
gobj.GetComponent<Renderer>().sharedMaterial.SetFloat("_SliceAmount",m_dissolveFactor + 0.2f);
}
foreach (GameObject gobj in GameObject.FindGameObjectsWithTag("barrel"))
{
gobj.GetComponent<Renderer().sharedMaterial.SetFloat("_SliceAmount",m_dissolveFactor);
}
}
我尝试记录桶对象的所有组件,它只记录动画和变换组件,由于某种原因没有记录网格渲染器和网格过滤器(此代码从唤醒函数调用):
foreach (GameObject gobj in GameObject.FindGameObjectsWithTag("barrel"))
{
Debug.Log("is object active? " + gobj.activeInHierarchy.ToString());
Debug.Log("barrel scene: " + gobj.scene.name.ToString());
Debug.Log("asking components of barrel, is barrel null?" + (gobj == null).ToString());
Component[] components = gobj.GetComponents(typeof(Component));
foreach (Component comp in components)
{
Debug.Log(comp.GetType().ToString());
}
gobj.GetComponent<Renderer>().sharedMaterial.SetFloat("_SliceAmount",m_dissolveFactor);
}
【问题讨论】:
-
"我在桶上得到一个空引用。getComponent
" .....你的代码中没有i get a nullreference on barrel.getComponent<Renderer>。由于我们无权访问您的场景对象,因此最好指出错误发生的确切位置。 -
我添加了一些信息来指出错误发生的确切位置
-
还不知道。我将就如何轻松找出导致此问题的原因提供建议。如果您确定问题出在此处:
gobj.GetComponent<Renderer()然后在屏幕中间添加一个简单的Text组件。根据它是否为空来修改此文本。如果gobj.GetComponent<Renderer()为空,则打印它,然后使用break跳出循环。你也可以用yourUIText.text = gobj.name;将GameObject的名称添加到Text组件中,如果你有任何发现请回复我 -
我确定渲染器组件是空的,因为它没有打印在我的日志中,我记录了所有内容并使用名为报告器的工具在构建中检查这些内容。我还明确检查了 getComponent
() == null 并打印了一个日志告诉我它的 null -
好的,现在打印我上面所说的为空的游戏对象的名称,并告诉我它是什么。