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))
{