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

Unity交互系统:子类如何调用父类的静态Action事件?

问题解答:子类调用父类静态Action事件的正确方式

嘿,这事儿我门儿清!你遇到的问题核心是静态成员的访问规则——静态事件属于类本身,不是某个实例的,所以用base(它指向父类的实例引用)肯定调用不了,不过别担心,换个方式就完全可行!

为什么base.OnInteractedItem?.Invoke(this)不行?

base关键字是用来访问父类的实例成员的,但OnInteractedItem是静态的,它属于BaseInteractable这个类,和任何具体的实例都没关系。就好比你不能用某个具体的猫实例去访问“猫这个物种的通用属性”,得直接提“猫”这个类才行。

正确的实现方式

你只需要直接通过父类的类名来调用这个静态Action就行,前提是父类的静态事件的访问修饰符允许子类访问(比如public static或者protected static)。

举个具体的代码例子:

父类BaseInteractable的定义(确保静态事件的访问权限)

using UnityEngine;
using System;

public class BaseInteractable : MonoBehaviour
{
    // 用protected static让子类能直接访问,或者public static让外部也能访问
    protected static Action<BaseInteractable> OnInteractedItem;

    // 其他基础交互逻辑...
}

子类StandardInteractable的按键触发逻辑

public class StandardInteractable : BaseInteractable
{
    void Update()
    {
        // 假设按E键触发交互
        if (Input.GetKeyDown(KeyCode.E))
        {
            // 直接调用静态事件,不用base!
            OnInteractedItem?.Invoke(this);
            // 如果是public static,也可以写成BaseInteractable.OnInteractedItem?.Invoke(this),效果一样
        }
    }
}

额外注意事项

  1. 访问权限:如果父类的OnInteractedItem是private static,子类根本看不到它,得改成protected static或者public static才行。
  2. 内存泄漏:静态事件容易引发内存泄漏,记得在订阅该事件的对象销毁时,一定要取消订阅(比如在OnDestroy里调用BaseInteractable.OnInteractedItem -= 你的方法)。

这样调整后,你在按键时就能正常触发父类的静态Action事件啦!

内容的提问来源于stack exchange,提问作者Enric Delgado Claramunt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:15:50