会议分享的代码
https://github.com/roboryantron/Unite2017

接下来主要研究这个代码

1.FloatVariable

第一个场景,核心是 FloatVariable

// ----------------------------------------------------------------------------
// Unite 2017 - Game Architecture with Scriptable Objects
//
// Author: Ryan Hipple
// Date:   10/04/17
// ----------------------------------------------------------------------------using UnityEngine;namespace RoboRyanTron.Unite2017.Variables
{[CreateAssetMenu]public class FloatVariable : ScriptableObject{#if UNITY_EDITOR[Multiline]public string DeveloperDescription = "";
#endifpublic float Value;public void SetValue(float value){Value = value;}public void SetValue(FloatVariable value){Value = value.Value;}public void ApplyChange(float amount){Value += amount;}public void ApplyChange(FloatVariable amount){Value += amount.Value;}}
}

就是一个可以通过 float 数值或者同类型数值更改的变量
但是做成 ScriptableObject 说明他是在整个工程中共享的
看到“整个工程共享”我一般就是想到存档,要不然就是 Buff,我朋友说是想到背包系统
其实他完全可以作为逻辑中的一个数据,一个可以共享的数据
比如原来我有一个角色有一个血量,现在血条UI和心跳音源都要引用这个血量
那我就不得不让血条UI和心跳音源知道角色类是什么,然后使用 角色类实例.HP 获得血量
这就是 rigid reference 硬引用,就是我必须要知道一个不能改变的“路径”——文件路径或者引用路径
那么怎么用软引用呢,就是我所有需要用到某个变量的类,都只需要知道这个变量 ScriptableObject 就好了,就不需要从别人那里获得引用了

比如

主角处理受到的伤害需要用到 HP

UI 的填充数值需要用到 HP

音源的音量需要用到 HP

由于他们用到的 HP 是相同的,所以都引用一个表示 HP 的 ScriptableObject
UI,音源都不需要知道主角是谁,知道 HP 是谁就好了

这简直是最佳的解耦
还对策划友好,因为策划只需要在监视器中连接文件就好了
可调试性强,在编辑器进入调试时,你在编辑器中更改这个 ScriptableObject 的值可以影响到所有引用他的对象
解耦,策划友好,可调试,一个 ScriptableObject 做到了全部,牛啊

2.GameEvent

我之前也是把事件放在类里面,然后通过一个硬引用找到这个事件的
但是他还把事件做成了 ScriptableObject

// ----------------------------------------------------------------------------
// Unite 2017 - Game Architecture with Scriptable Objects
//
// Author: Ryan Hipple
// Date:   10/04/17
// ----------------------------------------------------------------------------using System.Collections.Generic;
using UnityEngine;namespace RoboRyanTron.Unite2017.Events
{[CreateAssetMenu]public class GameEvent : ScriptableObject{/// <summary>/// The list of listeners that this event will notify if it is raised./// </summary>private readonly List<GameEventListener> eventListeners = new List<GameEventListener>();public void Raise(){for(int i = eventListeners.Count -1; i >= 0; i--)eventListeners[i].OnEventRaised();}public void RegisterListener(GameEventListener listener){if (!eventListeners.Contains(listener))eventListeners.Add(listener);}public void UnregisterListener(GameEventListener listener){if (eventListeners.Contains(listener))eventListeners.Remove(listener);}}
}
// ----------------------------------------------------------------------------
// Unite 2017 - Game Architecture with Scriptable Objects
//
// Author: Ryan Hipple
// Date:   10/04/17
// ----------------------------------------------------------------------------using UnityEngine;
using UnityEngine.Events;namespace RoboRyanTron.Unite2017.Events
{public class GameEventListener : MonoBehaviour{[Tooltip("Event to register with.")]public GameEvent Event;[Tooltip("Response to invoke when Event is raised.")]public UnityEvent Response;private void OnEnable(){Event.RegisterListener(this);}private void OnDisable(){Event.UnregisterListener(this);}public void OnEventRaised(){Response.Invoke();}}
}

看他是怎么用的
事件发出者只需要知道事件素材是哪个,然后调用 Raise 方法

事件接收者只需要知道事件素材是哪个,然后定义回调

太爽了……

3.Setting

用来做全局设置,跟 floatvariable 一样

4.枚举

枚举直接用一个 list 方便动态改……太强了

// ----------------------------------------------------------------------------
// Unite 2017 - Game Architecture with Scriptable Objects
//
// Author: Ryan Hipple
// Date:   10/04/17
// ----------------------------------------------------------------------------using System.Collections.Generic;
using UnityEngine;namespace RoboRyanTron.Unite2017.Elements
{[CreateAssetMenu]public class AttackElement : ScriptableObject{[Tooltip("The elements that are defeated by this element.")]public List<AttackElement> DefeatedElements = new List<AttackElement>();}
}

好吧……我觉得我似乎领悟到了一切

[Unity] ACT 战斗系统学习 3:ScriptableObject相关推荐

  1. [Unity] ACT 战斗系统学习 8:使用 ScriptableObject 制作角色属性 3

    之前看的那个生成泛型物体的包,我用 git 连接装不上去 虽然可以用读文件的方式装--但是想想就觉得有点累 然后我又想,他那里很多东西是我不需要的,我要是加了,又给组内成员安装工程添加一个麻烦 然后我 ...

  2. [Unity] ACT 战斗系统学习 7:使用 ScriptableObject 制作角色属性 2

    本来我是以为泛型 ScriptableObject 是不可能的 但是我之前在制作技能条件时的尝试让我感觉到一个可能性 当时我是做成这样子的 其实这已经很好看了 当时我是实现了获取一个已知物体的所有字段 ...

  3. [Unity] ACT 战斗系统学习 5:使用 ScriptableObject 制作角色属性 1

    首先最重要的是属性 // ---------------------------------------------- // 作者: 廉价喵 // 创建于: 29/03/2022 1:19 // 最后 ...

  4. [Unity] ACT 战斗系统学习 2:从 Buff 系统开始的思考

    从零开始写,我希望 Buff 系统由三部分组成 BuffSystemSingleton 用于存 Buff 对象池和 Buff 字典,提供创建 Buff,回收 Buff 的功能 BuffManager ...

  5. [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器

    重构前,我的控制器是这样子 Assets/MeowACT/Scripts/ThirdPerson/ThirdPerson.cs // --------------------------------- ...

  6. [Unity] ACT 战斗系统学习 9:Bolt 和 FlowCanvas

    我在 Bolt 里面跑的时候遇到的第一个问题是,他识别不到我的属性--太怪了 我把 value 调成了 public 他居然也没有显示 然后我在 SerializedMonoBehaviour Mon ...

  7. [Unity] ACT 战斗系统学习 1:基于委托的事件管理器

    我觉得看视频太慢了,还是看别人源码更快-- 1.664235822/DarkSouls-Demo Github 源码: https://github.com/664235822/DarkSouls-D ...

  8. [Unity] 战斗系统学习 5:构建 TPS 框架 1

    [Unity] ACT 战斗系统学习 4:重构前的第三人称控制器 以前看猴与花果山的文章,感觉大开眼界,但是没做过所以没更多体会 https://zhuanlan.zhihu.com/p/416805 ...

  9. [Unity] 战斗系统学习 4:FlowCanvas 中的 LatentActionNode

    [Unity] 战斗系统学习 2:FlowCanvas 中的 SubGraph 1. 并行执行 FlowScript 可能的魔改方向 其实我原本是想魔改 FlowCanvas 使其支持并行 FlowS ...

最新文章

  1. 超郁闷的本地连接故障解决过程!!!
  2. 四层负载均衡——LVS
  3. MySQL中常见的单行函数(上)
  4. DynamipsGUI2.8 交换模块试用(Etherchannel)
  5. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解...
  6. 一些服务器编程的概念
  7. Java代码总结【1】_查询手机号码归属地
  8. 小试牛刀:文本处理工具之grep、egrep详解
  9. [iOS]如何把App打包成ipa文件,然后App上架流程[利用Application Loader]
  10. Mego(05) - Mego Tools使用教程
  11. wpf之界面控件MaterialDesignInXAML
  12. C#基础回顾(一)—C#访问修饰符
  13. HTTP请求tomcat版本升级无法识别问题
  14. 复杂性应对之道 - 领域建模
  15. 计算机在模具设计中的应用课程设计,数字化技术在冲压模具设计与制造中的应用...
  16. 解决Git使用出现git@githubcom Permission denied (publickey)
  17. 为全面硬件升级做好准备 鑫谷开元T1全塔机箱评测
  18. 【解决笔记本电脑声音音量低的方法】
  19. 多对多业务,数据库水平切分架构一次搞定(58沈剑)
  20. 微信小程序 vant-weapp 实现多选标签

热门文章

  1. 架构设计:服务自动化部署和管理流程
  2. 金三银四,如何征服面试官,拿到Offer
  3. 荷兰籍空乘服务中国春运:对春节有着别样的感受
  4. Vue-cli(四) 项目中引入Axios
  5. 前端笔试题面试题记录(下)
  6. Oracle Data Integrator之代理创建
  7. Dataguard学习笔记
  8. [C/C++标准库]_[0基础]_[怎样实现std::string自己的Format(sprintf)函数]
  9. SpringMVC学习--springmvc原理
  10. 模拟退火解决TSP问题