Unity:GetComponent结果为null引用

时间:2017-09-19 08:41:54

标签: c# unity3d

我有一个包含嵌套预制件的场景。 嵌套预制件包含多个桶预制件(下图)

这些桶式预制件具有组件:变换,动画,网格过滤器和网格渲染器

问题在于我无法找到网格过滤器&网格渲染器的代码。在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);
 }

scene structure

enter image description here

1 个答案:

答案 0 :(得分:0)

除非组件未附加到该Object或组件被销毁,否则

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正在返回它,因为它存在于场景中。