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 tool,Player因为Player不必了解Equipment脚本......并且还应该让我引用不同类型的ITool。)
根据您的具体用例,也许[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 使用例如Collider或Renderer或 的方式完全相同Texture,它们是许多不同子类型的抽象基类。