如何解决 Unity 不在检查器中显示界面的问题?

Pau*_*one 8 c# unity-game-engine

如果有一个interface,说...

public interface ITool
{
    void Use();
}
Run Code Online (Sandbox Code Playgroud)

我有一个MonoBehaviour实现该接口的类,比如说......

public class Equipment : MonoBehaviour, ITool
{
    ...

    public void Use()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我想引用另一个类中的接口MonoBehaviour,比如说......

public class Player : MonoBehaviour
{
    public ITool tool;
    ...

    void Update()
    {
        ...
        tool.Use();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我发现 Unity 中的检查器Player没有显示tool,因此我无法从具有组件的某个对象中拖动引用ITool

通过搜索,我看到有人说 Unity 检查器不支持接口,并且人们已经找到了避免接口的方法。

有什么办法?

如果不为每个接口创建自定义包装器类(例如这个接口),我如何保留接口类的优点保持脚本解耦?(即我不想输入public Equipment toolPlayer因为Player不必了解Equipment脚本......并且还应该让我引用不同类型的ITool。)

der*_*ugo 2

根据您的具体用例,也许[SerializeReference]已经可以解决您的问题。

不幸的是,除此之外,没有简单直接的方法。不过,很多人已经通过自定义属性抽屉/编辑器脚本做到了这一点。在我看来,全面实施有点过于宽泛。


然而, - 再次取决于您的实际用例 - 接口的完整替代品可能是一个常见的基类,例如

public abstract class BaseTool : MonoBehaviour 
{ 
    public abstract void Use(); 
} 
Run Code Online (Sandbox Code Playgroud)

进而

public class Equipment : BaseTool 
{ 
    public override void Use()
    { 
        ...
    }
} 
Run Code Online (Sandbox Code Playgroud)

最后在播放器中使用

 public BaseTool tool;
Run Code Online (Sandbox Code Playgroud)

这基本上与 Unity 使用例如ColliderRenderer或 的方式完全相同Texture,它们是许多不同子类型的抽象基类。