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

unity开发之原创开关小部件 一直在使用ngui做ui,不过发现尽然没有一个开关组件 阅读详情

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 UGUI SwitchButton制作 在游戏设置中我们经常会使用到类似这样的开关组件,但是UGUI并没有直接提供,通常我们都是使用Toggle组件加自己写的脚本完成这个效果,今天我们来制作一个脚本,直接达到switchButton这样的效果。        仔细观察一个switchButton,主要由以下三个部分构成,label,OnImage,OffImage。        我们先使用CreateEmpty创建一个ro 阅读详情

相关推荐

[Unity][Odin Inspector] SerializedMonoBehaviour 中的 private List 会被初始化为 null

Bug:构造期间不为 null 游戏开始后变成 null 一个最简单的使用 Switchable 的 Controller Assets/MeowFramework/TPSCharacter/Scripts/Controller/TPSCharacterUIController.Mode.cs // ---------------------------------------------- // 作者: 廉价喵 // 创建于: 12/04/2022 15:53 // 最后一次修改于: 22/04/2022

PriceCheap的博客 1112

Unity Odin从入门到精通(四):序列化调试器详解

什么是序列化和反序列化:序列化和反序列化主要用来解决对象的传输问题。其中序列化用来将对象转换成二进制流;反序列化用来将二进制流转换成对象。Unity序列化:Unity序列化器的实现十分简单,目的是为了非常快速的进行序列化和反序列化操作。具有以下特性: 1.可以被序列化的类型如下所示: 1.1.某些Unity内置类型。如:Vector2、Vector3、Vector4、Rect、Quaternion、Matrix4x4、Color、Color32、LayerMask、AnimationCurve、Gradie

zjz 5046

【Unity 3D】学习笔记五:Toggle(开关按钮)

Unity 学习笔记五   学习资料:《Unity 3D游戏开发》 宣雨松   Toggle控件用来创建一个开关按钮,跟单选框一样。其返回值为bool类型。   例子           Toggle(开关按钮)技术文档:   最后,虽然我写的学习笔记很没有技术含量,基本是照本宣科似的写。但我还是想以此文,纪念下我的外公。原谅我没有回去见您。

零逸Space 1万+

Unity中UGUI的Toggle控件

Toggle控件

blanrey的博客 2万+

【Unity3D小技巧】Unity3D中使用反射消灭Switch语句

推荐阅读 优快云主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 你的点赞就是对博主的支持,有问题记得留言: 一、前言 在开发中常常会用到Switch语句,Switch语句是一种选择语句,指针某个表达式的值进行判断,从而执行哪一段的代码,但是表达式的值多了之后,Switch语句往往特别长,很不美观,接下来,博主就带领大家使用反射来消灭Switch.

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 4132

UnityLibrarySwitcher:Unity插件,用于切换构建目标,git分支,而无需重新导入无休止的资产。 不再维护

Unity库切换器 Unity库切换器是一个Unity3d插件,用于切换构建目标和git分支,而无需重新导入资产。 安装 为了安装UnityLibrarySwitcher您有两个选择。 第一个是下载文件并打开它。 第二种选择是克隆此存储库或下载源,然后将UnityProject/Assets/UnityLibrarySwitcher文件夹复制到您的项目资产文件夹。 只是不要忘记将LibrarySwitcherCache文件夹添加到.gitignore文件。 对于Windows用户,此插件可以运行,但不如OS X上完美UnityLibrarySwitcher需要已配置为可与git一起使用的bash或sh路径。 默认情况下,假定您已将安装到C:\Program Files (x86)\Git 。 如果不是您正在使用的,请随时更改MonoBasher.cs以下行。 private stat

switcher:一个多功能的端口转发端口复用工具,支持转发本地或远程地址的端口,支持正则表达式转发(实现端口复用)

Switcher V2 一个多功能的端口转发工具,支持转发本地或远程地址的端口,支持正则表达式转发(实现端口复用)。 这是v2版,如需v1版请切换到v1分支 使用方法 配置好目录下的config.json后,直接运行就行 配置 打开程序目录下的config.json,你会看到类似下面的内容 主结构 { "log_level": "debug", "rules": [ 规则配置 ] } 规则配置 { "name": "test", "listen": "0.0.0.0:1234", "enable_regexp": false, "first_packet_timeout": 5000, "targets": [ 目标配置 ] } 目标配置 { "regexp": "正则表达式", "address": "127.0.0.1:80"

Unity3d组件手册(中文版)

Unity 3d组件手册,2014版,中文版,总共611页,效果清晰,很全面,值得当工具书用,查询

gameplayswitcherv2c:游戏切换器v2的源代码-Switch source code

gameplayswitcherv2c 游戏切换器v2的源代码

CrewAI 多 Agent 实战包 v1(Mock免Key跑通+通义千问可选+流水线样例)

本资源是 CrewAI 风格多 Agent 可运行工程包:研究→写作→审校等流水线样例。无 API Key 时自动降级 Mock 引擎跑通;有 DASHSCOPE_API_KEY 时可接真实 CrewAI + 通义千问。含中文 README、samples、smoke 留档、单元测试。本包不含密钥。关联博客:https://blog.youkuaiyun.com/mtl1994

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架

本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。

weixin_28235513的博客 235

避坑指南:麒麟系统ARM架构下PostGIS离线安装常见问题解析

本文深度解析了在国产麒麟系统ARM64架构下进行PostGIS离线安装的完整路径与核心避坑点。通过对比Docker容器化与源码编译两种部署方式的优劣,详细阐述了离线Docker环境搭建、ARM64镜像获取验证、容器化配置及常见故障排查的全流程,为在特殊环境下稳定部署空间数据库提供了一套可靠的实践指南。

Python的专栏 287

STM32HAL库硬件I2C驱动INA226避坑指南:从寄存器配置到电流测量实战

本文详细解析了使用STM32的HAL库硬件I2C驱动INA226电流/功率监测芯片的完整流程与常见陷阱。内容涵盖从硬件I2C配置、寄存器(特别是配置与校准寄存器)的深度解析、健壮的驱动函数封装,到实战中的校准技巧与滤波优化,旨在帮助开发者避开通信失败、数据不准等典型问题,实现高精度电流测量。

x1y2z的博客 791

Dual-stream multiple instance learning networks for tumor detection in Whole Slide Image——论文笔记

关于多示例学习的资料网上比较少,但是在医学图像方面还是有人在应用的。主要是因为一般比较大,几个G都是十分常见的,这么大图片是无法直接训练,一般都会进行切图,所以天然契合多示例学习bag和instance的概念。最近看了一篇论文刚好关于这方面的,所以做下笔记。 github地址:https://github.com/binli123/dsmil-wsi paper:https://arxiv.org/abs/2011.08939 背景知识 在多示例学习(MIL)中,一组训练样本被视为包含多个instance的

weixin_41693877的博客 4170

PCIe Gen4 Switch芯片PM40028调试踩坑实录:从boot引脚设置到串口无输出的诡异问题

本文记录了PCIe Gen4 Switch芯片PM40028的实战调试过程,重点剖析了从boot引脚配置错误导致串口无输出,到使用逻辑分析仪定位并解决启动问题的完整排障思路。文章深入探讨了芯片启动流程、硬件信号测量方法,并总结了高速硬件调试的核心经验与系统性排查清单,为工程师解决类似PCIe Gen4设备调试难题提供实用指南。

i8j9k0l1的博客 251

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

博主基于https://github.com/hpc203/GroundingDINO-onnxrun项目分享的onnx c++推理代码,修改为GroundingDINO模型的tensorrt推理代码。对于600x400的输入,在3060显卡下,cuda 12.1,TensorRT-10.4.0,window环境下53ms处理完一张图片。

a486259的博客 1220

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 900

Claude Code、Codex、Gemini CLI、OpenCode 和 OpenClaw 配置管理太麻烦?试试这个统一管理工具

还在为 Claude Code、Codex、Gemini CLI 等 AI CLI 配置烦恼?🤯 这款桌面工具支持五大助手统一管理,一键切换 50+ 服务商,MCP 和 Skills 集中管理 🛠️,跨平台支持,让你的 AI 编程更高效 ⚡

XiaoqiangClub的博客 913

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: [Unity][Odin Inspector] SerializedMonoBehaviour 中的 private List 会被初始化为 null
下一篇: [Unity] 战斗系统学习 14:Switchable 3
「已注销」
博客等级 码龄7年 156粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值