if (getcomponent()) <Interface>返回错误。if(getcomponent<Class>()) 工作正常。有什么区别?



在统一中,我正在使用OnTriggerEnter函数。 尝试使用 if 语句查看我是否使用 collider.gameobject.getcomponent<>(( 与对象发生冲突; 如果组件是一个类,它工作正常,如果组件是一个接口,它返回错误"无法隐式将类型可交互转换为布尔值"(可交互是接口名称(。对编程相当陌生,并且好奇为什么这是一个问题?

//错误代码,突出显示的错误是 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);
}    }
}

每个从 UnityEngine.Object 继承的类都有空检查覆盖,这意味着if(component)表示if (component != null)if (gameobject)表示if(gameobject!= null),这是因为 Unity 还会检查表示 C# 外观的底层C++对象指针。但是你的接口不会继承自UnityEngine.Object(毕竟它是一个接口(,所以if(yourinterface)对 Unity 的编译器没有意义,为了省去麻烦并保持应用/游戏的一致性,无论它是否是UnityEngine.Object对象,始终执行 if(x != null(。

根据 unity 文档,unity 对象重载运算符 "bool"。这三个示例给出了相同的结果(它通常与GetComponent()一起使用(

  1. if (GetComponent<Rigidbody>() == true)

  2. if (GetComponent<Rigidbody>())

  3. if (GetComponent<Rigidbody>() != null)

接口不是从对象类派生的。

最新更新