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

Unity 3D中GetComponent<IInteractable>()获取对象的疑问

关于Unity中GetComponent()的疑问解答

我知道这可能是个基础问题,但还是需要清晰的解答。我在YouTube上看到一个关于接口的视频,里面展示了这样的代码:

private void Update()
{
    var nearestGameObject = GetNearestGameObject();
    if (nearestGameObject == null) return;
    if (Input.GetButtonDown("Fire1"))
    {
        var interactable = nearestGameObject.GetComponent<IInteractable>();
        interactable?.Interact();
    }
}

我的疑问是:在上述Update函数中的var interactable = nearestGameObject.GetComponent<IInteractable>();这行代码里,GetComponent<IInteractable>()实际获取的是什么?是接口本身吗?还是游戏对象?我从未在Inspector面板中看到接口挂载到游戏对象上。


首先明确:GetComponent()获取的不是接口本身,也不是游戏对象,而是那个游戏对象上实现了IInteractable接口的具体组件实例。

为什么你在Inspector里看不到接口?因为接口本身不能直接挂载到游戏对象上——Unity不允许把接口作为组件添加。只有实现了该接口的C#脚本(继承自MonoBehaviour的类)才能作为组件挂载到GameObject上。

举个实际的例子,假设你有这样一个脚本:

public class Door : MonoBehaviour, IInteractable
{
    public void Interact()
    {
        // 开门逻辑
        Debug.Log("门被打开了");
    }
}

这个Door脚本既继承了MonoBehaviour(满足Unity组件的要求),又实现了IInteractable接口。当你把这个脚本挂载到某个GameObject上后,调用GetComponent<IInteractable>()时,Unity就会找到这个GameObject上的Door组件实例,然后把它转换成IInteractable类型返回给你。

这么做的核心优势在于多态性:不管这个GameObject上挂的是Door、Chest还是其他任何实现了IInteractable的组件,你都可以统一用IInteractable类型来调用Interact()方法,不用关心具体是哪个组件,极大简化了交互逻辑的编写。


内容的提问来源于stack exchange,提问作者Khoaoaoa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:15:34