[Unity] 战斗系统学习 13:Switchable 2

本文介绍了Unity游戏框架中Switchable组件的优化过程,包括将重复部分改为泛型,实现ISwitchable和ISwitcher接口,以及解决在构造期间和游戏开始后Switchable组件可能出现的null引用问题。详细讨论了SwitchableGeneric、SwitchableFloat和SwitcherEnum的改进,并展示了在TPSCharacterUIController、TPSCharacterLocomotionController和TPSCharacterAnimationController中的应用。
摘要由CSDN通过智能技术生成

1. Switchable v2

改了这两个
TPSCharacterAnimationController.Mode
TPSCharacterLocomotionController.Mode
之后我就觉得,有很多是重复的,是可以改的

比如

public float ModeTransitionTime = 1f;

private List<ISwitchable> switchableObjectList = new List<ISwitchable>();

private Coroutine switchValueCoroutine;

private void ClearSwitchableList()

private IEnumerator ModeTransition(TPSCharacterBehaviourMode mode)

SwitchObject 也有很多重复的,我就做成了泛型 SwitchableGeneric<T>
SmoothDamp 没有泛型,所以只好继承泛型确定类型 SwitchableFloat SwitchableVector3
为了方便,承担平滑插值逻辑的函数做成接口,并放到 SwitchableGeneric<T> 中,在 SwitchableFloat SwitchableVector3 中延迟实现

原来直接在 mono 里面做的协程,现在我把 Mode 单独做成一个 Switcher 类,那么他就需要获取到 mono 组件
原来直接在 mono 里面把 ISwitchable 加入一个列表,现在我把这个列表放到 Switcher 类中,于是 ISwitchable 需要有一个时机加入 Switcher 类的列表中
本来我是想在构造函数中做这些事的,但是首先我不能设置一个有参的构造函数,因为我必须要有一个无参的构造函数,才能在变量初始化的同时构造变量(如果有参,这个参数不能是编译期提供的,所以我只能在 Awake 中调用有参构造函数),这样我才能在监视器中配置类
所以 Switcher 有一个 RegisterSwitchable 函数来把 ISwitchable 加入一个列表,有 Owner 属性配置 mono 主人,SwitcherModesetter 会触发平滑协程,平滑协程里面对 ISwitchable 列表调用平滑函数

1.1 ISwitchable

Assets/MeowFramework/Core/Switchable/ISwitchable.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 22/04/2022 9:00
// 最后一次修改于: 22/04/2022 19:33
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System;

namespace MeowFramework.Core.Switchable
{
   
    /// <summary>
    /// 切换变量的接口
    /// </summary>
    public interface ISwitchable
    {
   
        /// <summary>
        /// 使变量在不同预设值之间切换
        /// </summary>
        /// <param name="mode">预设模式</param>
        public void SwitchValue(Enum mode);
    }
}

1.2 ISwitcher

Assets/MeowFramework/Core/Switchable/ISwitcher.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 22/04/2022 19:08
// 最后一次修改于: 22/04/2022 20:38
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System.Collections.Generic;

namespace MeowFramework.Core.Switchable
{
   
    /// <summary>
    /// 切换器的借口
    /// </summary>
    public interface ISwitcher
    {
   
        /// <summary>
        /// 注册可切换变量
        /// </summary>
        /// <param name="switchable">可切换变量</param>
        public void RegisterSwitchable(ISwitchable switchable);
        
        /// <summary>
        /// 注册可切换变量
        /// </summary>
        /// <param name="switchableList">可切换变量列表</param>
        public void RegisterSwitchable(List<ISwitchable> switchableList);
    }
}

1.3 SwitchableGeneric

要推迟接口的实现,所以使用抽象类

Assets/MeowFramework/Core/Switchable/SwitchableGeneric.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 22/04/2022 18:55
// 最后一次修改于: 22/04/2022 21:33
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System;
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;

namespace MeowFramework.Core.Switchable
{
   
    public abstract class SwitchableGeneric<T> : ISwitchable
    {
   
        /// <summary>
        /// 当前值
        /// </summary>
        [ShowInInspector]
        [Tooltip("当前值")]
        protected T value;

        /// <summary>
        /// 当前值
        /// </summary>
        public T Value
        {
   
            get => value;
            set
            {
   
                AfterValueChangeAction?.Invoke(this.value, value);
                this.value = value;
            }
        }
        
        /// <summary>
        /// 值改变后触发的委托
        /// </summary>
        [HideInInspector]
        public Action<T, T> AfterValueChangeAction;
        
        /// <summary>
        /// 预设值字典
        /// </summary>
        [Tooltip("预设值字典")]
        public Dictionary<Enum, T> TargetValueDict = new Dictionary<Enum, T>();

        // 缓存

        /// <summary>
        /// 平滑速度
        /// </summary>
        protected T smoothVelocity;

        /// <summary>
        /// 平滑时间
        /// </summary>
        [Tooltip("平滑时间")]
        public float SmoothTime = 0.2f;

        // 析构函数
        ~SwitchableGeneric()
        {
   
            AfterValueChangeAction = null;
        }
   
        // 接口
        
        // 延迟实现接口
        
        /// <summary>
        /// 使变量在不同预设值之间切换
        /// </summary>
        /// <param name="mode">预设模式</param>
        public abstract void SwitchValue(Enum mode);
    }
}

1.4 SwitchableFloat

Assets/MeowFramework/Core/Switchable/SwitchableFloat.cs

// ----------------------------------------------
// 作者: 廉价喵
// 创建于: 22/04/2022 9:01
// 最后一次修改于: 22/04/2022 21:33
// 版权所有: CheapMeowStudio
// 描述:
// ----------------------------------------------

using System;
using UnityEngine;

namespace MeowFramework.Core.Switchable
{
   
    /// <summary>
    /// 可切换浮点
    /// </summary>
    public class SwitchableFloat : SwitchableGeneric<float>
    {
   
        // 实现接口
        
        /// <summary>
        /// 使变量在不同预设值之间切换
        /// </summary>
        /// <param name="mode">预设模式</param>
        public override void SwitchValue(Enum mode)
        {
   
            // SmoothDamp 
            if (TargetValueDict.ContainsKey(mode)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值