如果(getcomponent <Interface>())返回错误。 if(getcomponent <Class>())工作正常。有什么不同?

时间:2019-10-06 01:43:02

标签: c# unity3d

我正在统一使用OnTriggerEnter函数。 尝试使用if语句查看是否使用collider.gameobject.getcomponent <>()与某个对象发生碰撞; 如果组件是类,则工作正常;如果组件是接口,则返回错误“无法将可交互类型隐式转换为bool”(可交互是接口名称)。对编程来说还很陌生,并且对为什么这是一个问题感到好奇?

//错误代码,突出显示的错误是if语句行。可交互的是一个界面

private void OnTriggerEnter(Collider coll)
    {
        if (coll.gameObject.GetComponent<Interactable>())

    {
        Interactable interactable = coll.gameObject.GetComponent<Interactable>();
        interactable.CheckEffect(ability);
    }
}

//工作代码,敌人是阶级

private void OnTriggerEnter(Collider coll)
{
    if (coll.gameObject.GetComponent<Enemy>())
    {
        Enemy enemy = coll.gameObject.GetComponent<Enemy>();

        if (enemy.need == objectType)
        {
            DoAction(enemy);
            enemy.AddEffect(this);
        }    }
}

1 个答案:

答案 0 :(得分:1)

从UnityEngine.Object继承的每个类都具有覆盖null检查的覆盖,这意味着if(component)意味着if (component != null)if (gameobject)意味着if(gameobject!= null),这是因为unity也检查表示C#外观的基础C ++对象指针。但是您的界面并非继承自UnityEngine.Object(毕竟是一个界面),因此if(yourinterface)对unity的编译器没有意义,从而避免了麻烦并始终保持应用程序/游戏的一致性无论是否为UnityEngine.Object对象,都执行if(x!= null)。