You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:18:03