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 主人,Switcher 的 Mode 的 setter 会触发平滑协程,平滑协程里面对 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))
{

本文介绍了Unity游戏框架中Switchable组件的优化过程,包括将重复部分改为泛型,实现ISwitchable和ISwitcher接口,以及解决在构造期间和游戏开始后Switchable组件可能出现的null引用问题。详细讨论了SwitchableGeneric、SwitchableFloat和SwitcherEnum的改进,并展示了在TPSCharacterUIController、TPSCharacterLocomotionController和TPSCharacterAnimationController中的应用。
最低0.47元/天 解锁文章
37万+

被折叠的 条评论
为什么被折叠?



