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),效果一样 } } }
额外注意事项
- 访问权限:如果父类的
OnInteractedItem是private static,子类根本看不到它,得改成protected static或者public static才行。 - 内存泄漏:静态事件容易引发内存泄漏,记得在订阅该事件的对象销毁时,一定要取消订阅(比如在
OnDestroy里调用BaseInteractable.OnInteractedItem -= 你的方法)。
这样调整后,你在按键时就能正常触发父类的静态Action事件啦!
内容的提问来源于stack exchange,提问作者Enric Delgado Claramunt
相关产品推荐
相关产品推荐

