3.3k 3 分钟

状态机是对状态模式的一种使用。用于独立处理在各个状态的具体情况和转换关系。 # 开始 当我们需要处理带流程响应的问题时,可以将其抽象为状态问题。 例如下图的我们需要处理 OnEnter、OnUpdate、OnExit 三个部分。 # 有限状态机 有且仅有可能处于一种状态,解决状态区分和转换问题。 有限状态机是下列几种状态机的基础,下面的状态机都基于有限状态机进行相关功能的扩充。 # 转换方式 在状态机中,我们需要使用一种转换方式来进行状态切换,在 Unity 的 Animator 中使用条件参数进行跳转。我们可以使用类似事件的方式来跳转、或者使用任意能够保证正确进行 原状态到目标状态...
1.8k 2 分钟

# 说明 在 URP 中 Unity 通过定义 RenderFeature 来编写自定义后处理效果,实现 SRP渲染管线 。 VlomeRenderFeatureRenderPass1RenderPass2......RenderPassShaderShaderPass1ShaderPass2流程如上 # Step1 编写后处理 Shader # Setp2 编写 Render Feature # Render Feature Render Feature 是一个处理集,继承自 ScriptableRendererFeature ,可以包含多个 Render Pass。 public...
1.1k 1 分钟

将指令抽象为一组字节码,通过字节码的排列组合定义游戏行为,使得玩家或者策划能够自由设计游戏行为(例如 AI)。 数据驱动 让游戏逻辑脱离编码的限制,赋予数据 行为。 class Program { static void Main(string[] args) { // 使用这样的一种数据驱动的模式来编程,让游戏逻辑脱离编码的限制,赋予数据 行为 // // 使用堆栈存储指令,每次将堆栈中的指令出栈执行再入栈,直到栈空 var stack = new Stack<int>(); var actlist = new...
2.8k 3 分钟

通过创建一个类来支持新类型的灵活创建,其每个实例都代表一个不同的对象类型。 # 问题 试着想象一下,如果我们来设计一个怪物的数据我们会如何? 名称 种族 生命值 攻击力 … 以及我们的 Attack 行为。 可以想到诸如这些的属性,在以这些数据的基础上来派生更多的特殊化数据。 # 传统设计 按照我们的常规思维,我们很容易想到如下的设计方案。 public abstract class MosterBase{ public string Name { get; set; } public int Hp { get;...
134 1 分钟

之前我打包 vs 开发的小项目时都会将 Debug 整个文件夹复制下来使用。 最近突然发现,可以使用另一种方式来方便的打包项目。 在需要发布的项目右键选择发布即可。 虽然这种方式生成的 exe 没有安装过程,可能不太规范,但是很容易操作。 安装后的程序可以在 windows 的程序列表中查看
2.1k 2 分钟

# 复杂光照 在之前的学习中,我们使用的都是单一光照,实际在游戏中可能存在多个光源,不同的光源会互相影响构成真正的光照系统,在这一节我们将实现一个真正可用的光照模型。 # 渲染路径 Rendering Path 📖 决定了光照是如何应用到 Unity Shader 中的。 我们只有为 Shader 正确地选择和设置了需要的渲染路径,该 Shader 的光照计算才能被正确执行。 🏷渲染路径的分类 前向渲染路径(Forward Rendering Path) 延迟渲染路径(Deferred Rendering Path) 顶点照明渲染路径(Vertex Lit Rendering...
2.9k 3 分钟

InputSystem 是 Unity 新推出的输入管理系统。 相比传统的输入系统, InputSystem 支持对设备拔插状态监听和自定义按键映射。 # 以代码的方式运行 # 简单使用 以下为获取使用游戏手柄的方式。 // 获取最后使用的游戏手柄var gamePad = Gamepad.current;// print(gamePad.name);// 持续判断按键按下if (gamePad.dpad.up.isPressed){ print("按下 上");}// 按下一次执行一次if...
477 1 分钟

由于 Spine3.8.75 网络上传播太多,所以官方针对这个版本做了限制,由该版本导出的 Spine 动画不能在 Unity 中正确读取。 # 修改 json 在以 json 格式导出的动画中,可以直接编辑文件修改版本号,修改版本号后就可以被 Unity 正确识别了。 # 修改二进制 上面的方法虽然方便,但是处于对性能的考量,现在基本都是用二进制数据,通过测试发现,修改二进制文件的版本号同样可以正确使用。 但是修改二进制十分麻烦,使用二进制查看器去改位非常麻烦,而且在每次导出时都需要修改一次才能正确使用。于是我做了一个简单的小工具。 核心代码var fs = new...
1k 1 分钟

以下用于记录我在开发 《如果世界没有你》 时的一些思考 《如果世界没有你》 是一款互动叙事类游戏,以下简称 没你 ,起初我在接手时,一听伪 3D 的对话冒险游戏,我觉得我不是轻轻松松解决嘛,事实上在实际的游戏开发中,我还是发现了一些特殊的地方,由此文记录,以便日后自己在面对类似情况时少踩坑。 # 策划设计方面 在这种注重游戏互动叙事的游戏中,策划设计方案显得尤为重要 ,以下从游戏性和美术学方面讨论。 #...
132 1 分钟

# 说明 在我们制作如下的提示框时,会使用到 IPointerEnterHandler, IPointerExitHandler 但是,会出现提示框闪烁(其实是进入离开疯狂调用) # 解决方案 将提示框射线检测去掉(避免新生成的提示框隔断) 控制提示框的锚点远离一些 为提示框添加组件