[Unity&接口]子类即继承接口类也继承MonoBehaviour的快速操作和重构实现

Unity中同时继承接口与MonoBehaviour的实现
本文介绍了在Unity中如何使一个类同时继承MonoBehaviour和接口的方法。通过VS的快速操作和重构功能,可以自动实现接口,然后只需删除注释内容,即可完成接口与MonoBehaviour的双重继承。

unity接口类继承以及继承MonoBehaviour

unity 中一个类 同时继承MonoBehaviour 和接口类,应该怎么做呢

----------------------------------------------------------------------------------------------------------------

TC_IWeapon 类如下所示


using System.Collections.Generic;
using UnityEngine;
//using System.Collections;

public interface TC_IWeapon
{
    List<TC_BaseStat> Stat { get; set; }
    void PerformAttack();
}



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class TC_Sword : MonoBehaviour,TC_IWeapon
{
    


}

可以看到直接 把 接口 继承这样写是错误的<

### 在Unity中非MonoBehaviour类访问MonoBehaviour类的方法返回值或变量 在Unity中,`MonoBehaviour` 是所有脚本的基类,使用 C# 编写脚本时需要显式继承自 `MonoBehaviour`[^1]。然而,有时开发者可能希望从一个未继承 `MonoBehaviour` 的类中访问继承了 `MonoBehaviour` 类中的方法返回值或变量。这种需求可以通过以下方式实现: #### 1. 使用委托(Delegate) 通过定义一个委托类型,并在 `MonoBehaviour` 类中创建该委托的实例,可以将方法暴露给非 `MonoBehaviour` 类。非 `MonoBehaviour` 类可以通过调用委托来访问目标方法。 ```csharp // MonoBehaviour类 public class MyMonoBehaviour : MonoBehaviour { public int someValue = 42; // 定义委托 public delegate int GetValueDelegate(); // 创建委托实例 public GetValueDelegate getValueDelegate; void Start() { // 将方法赋值给委托 getValueDelegate = () => someValue; } } // 非MonoBehaviour类 public class NonMonoBehaviourClass { private MyMonoBehaviour myMonoBehaviour; public NonMonoBehaviourClass(MyMonoBehaviour mono) { myMonoBehaviour = mono; } public void AccessValue() { if (myMonoBehaviour.getValueDelegate != null) { int value = myMonoBehaviour.getValueDelegate(); // 调用委托 Debug.Log("Accessed Value: " + value); } } } ``` #### 2. 使用接口(Interface) 通过定义一个接口,让 `MonoBehaviour` 类实现接口,非 `MonoBehaviour` 类可以通过接口访问目标方法或变量。 ```csharp // 定义接口 public interface IValueProvider { int GetSomeValue(); } // MonoBehaviour类 public class MyMonoBehaviour : MonoBehaviour, IValueProvider { public int someValue = 42; public int GetSomeValue() { return someValue; } } // 非MonoBehaviour类 public class NonMonoBehaviourClass { private IValueProvider valueProvider; public NonMonoBehaviourClass(IValueProvider provider) { valueProvider = provider; } public void AccessValue() { if (valueProvider != null) { int value = valueProvider.GetSomeValue(); // 通过接口访问 Debug.Log("Accessed Value: " + value); } } } ``` #### 3. 使用静态方法或变量 如果不需要实例化 `MonoBehaviour` 类,可以将其方法或变量声明为静态,从而允许非 `MonoBehaviour` 类直接访问。 ```csharp // MonoBehaviour类 public class MyMonoBehaviour : MonoBehaviour { public static int someValue = 42; public static int GetSomeValue() { return someValue; } } // 非MonoBehaviour类 public class NonMonoBehaviourClass { public void AccessValue() { int value = MyMonoBehaviour.GetSomeValue(); // 直接访问静态方法 Debug.Log("Accessed Value: " + value); } } ``` #### 4. 使用事件(Event) 通过定义事件,`MonoBehaviour` 类可以通知非 `MonoBehaviour` 类某些操作已完成,并传递相关数据。 ```csharp // MonoBehaviour类 public class MyMonoBehaviour : MonoBehaviour { public int someValue = 42; // 定义事件 public event System.Action<int> OnValueReady; void Start() { if (OnValueReady != null) { OnValueReady(someValue); // 触发事件 } } } // 非MonoBehaviour类 public class NonMonoBehaviourClass { public void SubscribeToEvent(MyMonoBehaviour mono) { mono.OnValueReady += HandleValue; // 订阅事件 } private void HandleValue(int value) { Debug.Log("Received Value: " + value); } } ``` #### 注意事项 - 如果需要频繁访问 `MonoBehaviour` 类中的方法或变量,建议在 `Start` 或 `Awake` 方法中缓存引用以提高性能[^4]。 - 非 `MonoBehaviour` 类无法直接访问 Unity 提供的生命周期函数(如 `Update`、`FixedUpdate` 等),因此需要通过上述方式间接实现交互。 ### 总结 通过委托、接口、静态方法或事件等机制,非 `MonoBehaviour` 类可以安全且高效地访问继承了 `MonoBehaviour` 类中的方法返回值或变量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值