Unity C#如何实现通过接口直接访问gameObject的优雅写法
解决方案
方案1:接口定义同名只读属性(最优解,无额外开销)
C#接口支持声明属性,而Unity的MonoBehaviour原生自带public GameObject gameObject { get; }属性,只需修改接口定义即可直接匹配你要的调用形式,实现类不需要额外写任何冗余代码:
using UnityEngine; public interface IAimPanel { // 声明和MonoBehaviour自带属性签名完全一致的只读属性 GameObject gameObject { get; } } // 实现类无需额外写实现代码,MonoBehaviour自带属性自动满足接口要求 public class Target : MonoBehaviour, IAimPanel { } public class Test : MonoBehaviour { public IAimPanel aimPanel; private void Start() { // 直接按你期望的形式调用即可 aimPanel.gameObject.SetActive(true); } }
方案2:扩展属性适配旧接口(兼容现有代码无需修改原有实现)
如果你的IAimPanel接口已经在大量业务中使用,不方便修改原有接口定义,可以通过扩展属性实现需求,原有接口、实现类都不需要调整:
using UnityEngine; // 原有代码完全不用改动 public interface IAimPanel { public GameObject GetGameObject(); } public class Target : MonoBehaviour, IAimPanel { public GameObject GetGameObject() { return gameObject; } } // 新增扩展类即可 public static class AimPanelExtensions { public static GameObject gameObject(this IAimPanel aimPanel) { return aimPanel.GetGameObject(); } } public class Test : MonoBehaviour { public IAimPanel aimPanel; private void Start() { aimPanel.gameObject.SetActive(true); } }
内容的提问来源于stack exchange,提问作者harut9
相关产品推荐
相关产品推荐

