简单介绍UIBulider的使用
UIElement是一种类似于Html形式进行界面开发的方式,创建的EditorWidow包括以下3个文件。
C#-代码控制界面逻辑 类似于js
Uss-样式控制器 类似于Css
Uxml-基础骨架模板 类型Html
UIBulider界面
双击Asset打开编辑窗12345678910111213141516171819202122232425262728public class DialogGraphEditWindow : EditorWindow{ private static VisualElement rootMain; [OnOpenAsset(1)] public static bool OpenAsset(int id,int line) { if (EditorUtility.InstanceIDToObject(id) is DialogTreeGraphAsset graph) { var window = ...
状态机是对状态模式的一种使用。用于独立处理在各个状态的具体情况和转换关系。
开始当我们需要处理带流程响应的问题时,可以将其抽象为状态问题。
例如下图的我们需要处理OnEnter、OnUpdate、OnExit三个部分。{.red}
有限状态机
有且仅有可能处于一种状态,解决状态区分和转换问题。
有限状态机是下列几种状态机的基础,下面的状态机都基于有限状态机进行相关功能的扩充。
转换方式在状态机中,我们需要使用一种转换方式来进行状态切换,在Unity的Animator中使用条件参数进行跳转。我们可以使用类似事件的方式来跳转、或者使用任意能够保证正确进行 原状态到目标状态 转换的方式。
实现方式
对于有限状态机来说,我们只需要保证具有状态、转换关系即可。
状态状态是我们需要管理的核心,状态中可以包含转换关系Dict。
非继承式状态1234567891011121314151617181920/// <summary>/// 简单Fsm状态/// </summary>public class FsmState{ public string ...
说明
在URP中Unity通过定义RenderFeature来编写自定义后处理效果,实现SRP渲染管线。
1234graph LR Vlome-->RenderFeature --> RenderPass1 --> RenderPass2--> ...... RenderPass--> Shader--> ShaderPass1-->ShaderPass2-->......
流程如上
Step1 编写后处理ShaderSetp2 编写Render FeatureRender Feature
Render Feature是一个处理集,继承自ScriptableRendererFeature,可以包含多个Render Pass。
public override void Create()
用于在RenderFeature创建时调用,一般在这里进行使用到的RenderPass的初始化操作。
public override void AddRenderPasses(ScriptableRenderer renderer, ref ...
将指令抽象为一组字节码,通过字节码的排列组合定义游戏行为,使得玩家或者策划能够自由设计游戏行为(例如AI)。
数据驱动让游戏逻辑脱离编码的限制,赋予数据 行为。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273class Program { static void Main(string[] args) { //使用这样的一种数据驱动的模式来编程,让游戏逻辑脱离编码的限制,赋予数据 行为 // //使用堆栈存储指令,每次将堆栈中的指令出栈执行再入栈,直到栈空 var stack = new Stack<int>(); var actlist = new List<int>() ...
通过创建一个类来支持新类型的灵活创建,其每个实例都代表一个不同的对象类型。
问题试着想象一下,如果我们来设计一个怪物的数据我们会如何?
名称
种族
生命值
攻击力
……
以及我们的Attack行为。
可以想到诸如这些的属性,在以这些数据的基础上来派生更多的特殊化数据。
传统设计按照我们的常规思维,我们很容易想到如下的设计方案。
123456789101112131415161718192021222324252627282930public abstract class MosterBase{ public string Name { get; set; } public int Hp { get; set; } public string Race { get; set; } public int Damage { get; set; } protected virtual void Attack() { }}public cl ...
复杂光照在之前的学习中,我们使用的都是单一光照,实际在游戏中可能存在多个光源,不同的光源会互相影响构成真正的光照系统,在这一节我们将实现一个真正可用的光照模型。
渲染路径 Rendering Path
:book: 决定了光照是如何应用到Unity Shader中的。
我们只有为Shader正确地选择和设置了需要的渲染路径,该Shader的光照计算才能被正确执行。
:label:渲染路径的分类
前向渲染路径(Forward Rendering Path)
延迟渲染路径(Deferred Rendering Path)
顶点照明渲染路径(Vertex Lit Rendering Path)——已经被弃用
目前unity提供了新的渲染路径代替了原来的渲染路径。
默认使用 Graphics中的设置,可以在摄像机中对设置进行覆盖。
在Shader Pass中来指定该Pass使用的渲染路径:
1Pass { Tags { "LightMode" = "ForwardBase" } }
Lig ...
unity 新技术
Unread
InputSystem 是Unity新推出的输入管理系统。
相比传统的输入系统,InputSystem 支持对设备拔插状态监听和自定义按键映射。
以代码的方式运行简单使用以下为获取使用游戏手柄的方式。
12345678910111213141516171819//获取最后使用的游戏手柄var gamePad = Gamepad.current;// print(gamePad.name);//持续判断按键按下if (gamePad.dpad.up.isPressed){ print("按下 上");}//按下一次执行一次if (gamePad.dpad.up.wasPressedThisFrame){ print("按 上");}//获取左摇杆的值move = gamePad.leftStick.ReadValue();
同理可以获取键盘和鼠标的输入:
1234567891011121314151617181920//获取当前的键盘var keyboard = Keyboard.curre ...
由于Spine3.8.75网络上传播太多,所以官方针对这个版本做了限制,由该版本导出的Spine动画不能在Unity中正确读取。
修改json在以json格式导出的动画中,可以直接编辑文件修改版本号,修改版本号后就可以被Unity正确识别了。
修改二进制上面的方法虽然方便,但是处于对性能的考量,现在基本都是用二进制数据,通过测试发现,修改二进制文件的版本号同样可以正确使用。
但是修改二进制十分麻烦,使用二进制查看器去改位非常麻烦,而且在每次导出时都需要修改一次才能正确使用。于是我做了一个简单的小工具。
核心代码123456var fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);//找到的标志位fs.Position = 33;fs.WriteByte(9);fs.WriteByte(9);
核心代码如上,通过二进制查看器或,for循环找出需要修改的数据的位置,然后写入即可。
使用修正器属于修正的目录,就可以自动修正二进制文件,愉快的在Unity中使用了。
Ps:此方法仅供学习交流,请大家多多支持正 ...
写在开始
此文用于简单介绍FastyTools工具集,详细使用情况后面有空我再写。:)
FastyTools是我个人一直在使用的一套Unity工具链,包含了一些Unity常用的功能封装和基础轮子,可以大大提升开发效率,我个人用起来很爽。
BaseSystem
BaseSystem是工具集的基础。
包括以下内容:
EventCenter 事件中心
MonoController 全局Mono
ObjectPool 对象池
ResLoad 资源加载
Singleton 单例
GamePlay包括以下内容:
Bag 背包系统
Csv 处理Csv的相关操作
Localization 本地化
Music 音效管理系统
Save 存储系统
SceneSwitch 场景选择器
TurnSystem 回合制系统
任务链系统
Numerical包括以下内容:
角色数值
数据类型枚举
玩家主角数据
Skill技能系统
Buffer系统
InputCenter包括:
玩家输入中心
Touch输入
AI
FSM有限状态机
Astar寻路
BT行为树
FFGraphSyst ...
以下用于记录我在开发《如果世界没有你》时的一些思考
《如果世界没有你》是一款互动叙事类游戏,以下简称没你,起初我在接手时,一听伪3D的对话冒险游戏,我觉得我不是轻轻松松解决嘛,事实上在实际的游戏开发中,我还是发现了一些特殊的地方,由此文记录,以便日后自己在面对类似情况时少踩坑。
策划设计方面在这种注重游戏互动叙事的游戏中,策划设计方案显得尤为重要 ,以下从游戏性和美术学方面讨论。
游戏性
游戏性的重要组成是游戏的核心玩法,对于普遍的解密探索类游戏来说,通过玩家点击,找到相关线索,使用道具,推进故事。
12graph LR 玩家互动 --> 寻找线索--> 使用相关道具--> 推进故事
这是一套大家总结出来的通用的游戏流程,也是市面上最多的游戏流程。
拿第一个场景(学校)来说几个可交互地点:
学校大门
猫
商店
路牌
作为一个不大的场景,有4个交互点,其实并不算少,只是我们能否在有限的空间内利用出最大的效能,让玩家能够记住这个场景(除了外形之外情节上的记忆)。如果我们只是在这4个交互点显示一些暗淡冰冷的文字,玩家对于这些交互大概也不会留下什么感情,而且 ...











