通过接口访问组件的“启用”属性

问题描述 投票:0回答:1

我有一个类/行为

MyBehavior
,它使用以下代码在游戏对象上查找实现接口
IMyInterface
的任何组件:
myInterface = (IMyInterface)gameObject.GetComponentInParent (typeof(IMyInterface))

IMyInterface
由多个类/行为实现。例如:

public class MyClass1: MonoBehaviour, IMyInterface

public class MyClass2: MonoBehaviour, IMyInterface

等等等等

我希望能够确定

MyClass1
MyClass2
等组件是否启用或禁用。

但是,我不确定如何访问组件,并且接口似乎无法访问

enabled
disabled
属性。

我考虑过的一个解决方案是明确检查类型,例如

myInterface is MyClass1
但这有一个问题,如果我创建一个实现该接口的新类,我必须记住回到这个
MyBehavior
脚本并更新它,这是我不喜欢的。

有什么方法可以获取接口所在类的类型,并访问其

enabled
disabled
属性吗? 如果我总是期望它是一个单一行为,那么将其转换为
Monobehaviour
工作可以吗?或者这是一个隐藏问题的坏主意吗?

c# unity-game-engine
1个回答
0
投票

如果你被允许改变

IMyInterface
,就这么简单:

public interface IMyInterface {
    public bool enabled { get; set; }
}

即使您将接口应用于类层次结构中的派生类型,该接口仍然可以公开属于该类接口的任何成员,无论它们在继承链中的位置有多远。

因此,您可以确保访问

enabled
(实际上是其父级
MonoBehaviour
)类的原始
Behaviour
属性。


如果不允许更改

IMyInterface
,那么可以,转换为
MonoBehaviour
Behaviour
,而不是转换为具体类型。

IMyInterface myInterface = ...
MonoBehaviour myBehaviour = (MonoBehaviour)myInterface;

这绝对不是一个坏习惯,因为在这里你已经通过使用

MonoBehaviour
进入了
gameObject.GetComponentInParent
范式。这显然不适用于 C# 类,也不适用于
ScriptableObject
或不在
MonoBehaviour
层次结构中的其他类型。所以你在这里很安全。


比较两种方法:由于您已经使用了接口,因此最好公开那里的属性,而不是强制转换所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.