我有一个包含嵌套预制件的场景。 嵌套预制件包含多个桶预制件(下图)
这些桶式预制件具有组件:变换,动画,网格过滤器和网格渲染器
问题在于我无法找到网格过滤器&网格渲染器的代码。在Unity播放器中一切正常!但是,当我为pc构建时,我在`gobj.getComponent上获得了一个null引用,但仅限于具有"桶"的对象。标签,(油工作正常,并具有相同的组件):
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);
}
答案 0 :(得分:0)
GetComponent
将永远不会返回null。
您的GameObject.FindGameObjectsWithTag("oil")
或GameObject.FindGameObjectsWithTag("barrel")
正在使用&#34; oil&#34;找到一个GameObject或&#34;桶&#34;分别标记。
在此之后,GetComponent<Renderer()
用于循环访问Renderer
返回的每个FindGameObjectsWithTag
。根据你的说法,它有时返回null,返回null的循环指向名为&#34; Fish1&#34; 的GameObject。
问题是你错误地将Fish1的标签改为&#34; oil&#34;或&#34;桶&#34;。然后FindGameObjectsWithTag
会将其选中并尝试检查其呈现器是否为空。
将&#34; Fish1&#34; 标记更改为未标记,以便GameObject.FindGameObjectsWithTag("oil")
和GameObject.FindGameObjectsWithTag("barrel")
无法找到它
现在,如果你真的打算让&#34; Fish1&#34; 拥有&#34; oil&#34;或&#34;桶&#34;然后你必须确保MeshRender
附加了它。
注意:
编辑器中有一个搜索栏,用于在场景中搜索&#34; Fish1&#34; GameObjects并更改标签。
另外,请确保您没有使用&#34; oil&#34;来实例化任何名为&#34; &#34; Fish1&#34; 的GameObject。或&#34;桶&#34;标签。这是非常重要的。这不是魔术。 GameObject.FindGameObjectsWithTag
正在返回它,因为它存在于场景中。