- 博客(113)
- 资源 (2)
- 收藏
- 关注

原创 Unity开发时遇到的各种需要注意的地方
前言:最近在做东西的时候突然想到,自己以前做过的项目有很多地方需要注意的,然而并没有记录下来,导致下次还会出现这样的问题。于是就有了这个想法,把之前各种各样奇奇怪怪的问题都记录下来,解决方案也写下了。一是加深记忆,二是万一又遇到了好歹也有个参考;正文:1、Transform.GetComponentsInChildren找不到组件!?这是因为Transform.G...
2018-09-28 16:26:22
7202
3
原创 基于预设路线的寻路导航
在部分游戏中,其寻路不是要求最短路径,而是要求优先走预设的路径。这里需要 NPC 在路径上移动,此路径需要与美术绘制的道路重合,此时并不是按照最短路径移动。这里设计一种基于路径烘培的 SDF 图(SDF 概念参考),并以无环有向图、NavMesh 进行寻路搜索的方案。
2025-03-18 17:22:24
645
原创 基于SDF的碰撞和寻路
SDF ,即有号距离场 Signed Distance Function,简单介绍如下:有号距离场是一种用于表示三维空间中每个点与一个几何形状之间的相对位置关系的函数。对于空间中的任意点,有号距离场返回一个实数,这个实数表示该点与几何形状的相对位置:正数表示点在几何形状的外部,负数表示点在内部,零表示点恰好在几何形状上。有号距离场图则是将这种函数的值以图形的形式表示出来。在图中,每个点的位置表示它对应的有号距离场的值。
2025-03-10 16:45:26
1124
原创 再谈游戏AI:顶层设计
很多程序员一谈到做 AI、设计 AI 框架的时候,第一步就想的是要用状态机还是行为树。其实这只是实现方式,而不是 AI 的顶层设计。无论状态机还是行为树,都可以满足绝大部分 AI 的需求,一定程度上没有绝对的优劣之分。而 AI 最为关键的问题,则是更为抽象的顶层设计。
2025-03-10 00:04:51
901
原创 场景生产流程的环节
场景生产流程通常会经历前期准备、Layout、Blockout、场景资产制作/编辑/迭代、灯光布置与烘培等阶段。本文重点强调前期准备、Layout 和 Blockout 三个阶段:因为这三个阶段为目前国内项目中常常缺失的部分。至于最后的资产制作、灯光等,根据项目不同,属于锦上添花,丰俭由人了。这篇文章的主要观点摘抄自《游戏造梦师:游戏场景的开发与设计》。
2025-02-22 11:43:30
913
原创 《游戏人工智能编程 案例精粹》阅读心得
最近读完了这本《游戏人工智能编程 案例精粹》,感觉获益匪浅,在对游戏人工智能的设计上有了更深的感悟。这本书既适合初学者学习,因为次书会从最基础的数学物理公式推导一步一步介绍到完整的人工智能开发;同时也适合进阶程序员,因为其设计思路、解决方案能给人以很大启发。要注意的是:这里讲的人工智能,并非现在大火的强人工智能(AI),而是游戏中的行为体智能控制(例如控制 NPC 行动的状态机)。
2025-02-22 11:26:28
1124
原创 负反馈性能调节系统
最早看到这个概念是在《腾讯游戏开发精粹II》里,看了之后感觉非常实用,于是将其列为开放世界的一个必备组件。其运行逻辑简单总结就是:例如监测到帧率下降时,则进行减少一些特效、音效,对不重要的 AI 降频等操作,使帧率提升。这样使得游戏整体帧率保持平稳,且能最大限度保证玩家的游戏体验。
2024-09-04 15:43:55
844
原创 开放世界的开发利器:白模
所谓白模(BlockMesh),就是在关卡设计初期,使用极简模型搭建的示意,用来测试关卡的合理性和可玩性。这不是一个新概念,在众多高质量游戏制作中都是必不可少的流程。这里我推荐一篇顽皮狗关卡策划 David Shaver 关于白模分享(原版PDF下载)五分钟GDC 01:游戏Blockmesh关卡设计技巧——图文版 - 哔哩哔哩Hello 大家好,这里是五 分 钟GDC,今天给大家带来的是游戏关卡设计中Blockmesh 的技巧。首先,让我们先了解一下什么是Blockmesh。
2024-09-03 20:41:12
1994
原创 什么是游戏开发流水线?以及我们为什么需要他?
游戏开发流水线,即从构思到成品的一系列过程。相信有的朋友已经迷惑了:哪个项目不是从构思到成品呢?诚然,所有项目都是从构思到产品。但关键在于 “一系列过程”。你经历过的项目,他们的这个过程是相同的吗?有通用的步骤吗?每做完一个项目,能让我下一个项目进行地更快吗?也许,有的项目是先写好策划案,美术和程序再依照制作;有的项目是一边做功能,一边补案子;有的项目做了编辑工具;有的项目有原型流程图……然而,如果不能将游戏的开发步骤形成规范,且既能从项目中抽象出来,也能适配到项目中去;
2024-09-03 11:48:15
1317
原创 开放大世界的全局寻路
开放大世界的寻路一直是很困扰我的一个点,地图大、还是动态可变的,所以寻路会有很多要求。根据上面的需求,像 NavMesh、JPS+ 虽然效率高,但是重建代价大;用 A* 重建代价小但是效率也太差了;而 FlowField 又不支持多目标寻路。最后,我根据项目本身的需求,设计了一套适用于航海主题的海洋+岛屿的寻路解决方案。这个方案能够满足项目要求,且只有一个 O(1) 的复杂度,还可以分布寻路,地图的重建开销也很低。当然,这里对岛屿、地图设计做了一些限制,同时是针对航海特化的方案。
2024-08-30 14:49:55
1301
原创 开放大世界千人同屏网络设计
客户端(逻辑层)服务器都采用ECS架构(只有ECS能满足设计需求)。总体上还是使用状态同步,各个客户端看到的表现不一致。玩家主要关心周边的单位,而不是全部的AOI块内的单位。同步时,只同步移动(路径)信息,其他信息一概不同步(包括血量)服务器提供一个协议,供客户端直接拉取某个玩家的具体信息(客户端主动请求,避开主服务器的同步,类似于灯塔)。客户端根据相机范围来主动向服务器拉取(只读)。这个请求需要做到能无代价。
2024-08-30 11:44:09
1529
原创 开放大世界的碰撞与物理
对于开放大世界的物理碰撞,根据现有解决方案,需要将带物理的物体控制在 1k 以下,就能很好地在手机上运行并支持玩法。对于特殊的需求(例如翻墙、攀岩)等,通过射线手段进行辅助检测,减少物理碰撞的开销。基于 GpuTerrain 实现的地形,则需要通过生成 SDF 图的方式来辅助碰撞,基本上能满足需求。对于一些对碰撞精度要求较高的需求,也可以通过取巧的方式来实现。(例如,如需要玩家在前进过程中自动绕开一些小型灌木。
2024-08-28 12:09:16
1424
原创 开放大世界的数据管理
经过前面几个章节的介绍,开放世界的数据管理就已经初具雏形了。实际上,开放世界数据最麻烦的,就是各种地图渲染数据。如果地图渲染数据解决了,逻辑数据处理起来也是相对容易的。所以这里讲的,核心也是在地图渲染数据。这个视频是使用这一套技术整出来的Demo,有美术的配合就好看很多了。Island_G效果演示(8月版本)_哔哩哔哩_bilibili岛屿效果演示视频,项目中的Island_G。除了常规的天气、后期等,此版本主要增加了草海效果。这个版本的草海是根据新的草海插件美术手动绘制的,在CPU多线程进行渲染。
2024-08-27 20:59:41
841
原创 【Unity】移动端草海解决方案
草海是开放大世界渲染的必不可少的因素,Unity 原生的 Terrain 草海效率较低,而且无法与 RVT 结合起来,无法在移动端上实现。因此我们自己搓出来一套草海系统,使用 C# 多线程辅助运算,并能支持割草、烧草等进阶玩法。草的位置、密度、类型还需要根据美术和地形的信息进行自适应。最终效果可以看这个演示视频:GpuTerrain+草海_哔哩哔哩_bilibili地形用GpuTerrain渲染;草海是自定义实时生成运算+Gpu渲染。
2024-08-24 15:50:06
1308
原创 基于 Dots + GPU Instance 的大规模物体渲染
之前写的两篇开放世界技术栈都是公司其他同事做的,所以很多细节了解不详细。但这次是全程我自己搭建的轮子,可以讲得稍微详细些。之前写的大规模物件渲染的 GPU 版本,虽然渲染量大效率高,但是有个很致命的缺陷:无法与游戏逻辑进行交互。因为主要渲染数据都是放在 GPU 中,为了效率要尽可能减少异步回读,也要尽量减少同步数据量,所以要物体与逻辑交互就基本不可能了。但是使用 Unity 的 Dots 系统再加上 GPU Instance 技术,就可以很好地解决这个问题。
2024-08-22 13:58:13
1647
原创 GPU驱动的大规模静态物件渲染
GPU Driven 的静态物件渲染,听起来很高级,其实具体操作很简单,基础就是直接调用 Graphics.DrawMeshInstancedIndirect 这个 Unity 内置接口就可以了。但我们项目对这个流程做了一些优化,使得支持的实体数量有大幅提升。这套系统主要也是公司的 TA 实现的,这里我也只简明扼要地介绍一下原理。
2024-08-15 17:11:09
1134
原创 开放大世界的 GpuTerrain + RVT
Unity 原生有一个 Tarrain(地形)系统,但可惜并不能直接用于开放世界,当然是因为其效率问题。现在开放世界主流是使用 GpuTerrain + RVT ,也是一个成熟技术了。在项目中实现这个技术的是公司的 TA(我只做了接入),具体不了解,这里也只是大概说明下这个技术。如果对这套技术缺乏了解的,建议直接去看参考文章,而不是本文(因为本文写得非常简略,也不包含实现方案)。如果已经了解了的,这篇文章也可以跳过。
2024-08-15 11:52:29
1325
原创 Unity手游开放大世界解决方案
在介绍技术栈之前,需要先了解下项目需求(因为有不少方案都是基于需求而定制的)。我们这个项目是一个海洋主题的项目,整个大世界是由一片大洋和星罗棋布的岛屿组成。最大的岛屿占地 2048*2048 米,最小的岛屿占地 256*256 米,整个世界大大小小岛屿总量约 1万。评估下来,总世界面积超过 4000 平方公里,总陆地面积约 922 平方公里。其中,岛屿有上岛玩法,即玩家可以扮演一个 NPC 登陆游玩,类似 RPG 游戏,可以进行解谜、战斗、探索等。玩家岛屿固定大小,可以在地图上迁移。
2024-08-14 18:30:38
2059
原创 【Unity】位图字体制作工具:蒲公英
一般来讲,如果需要制作位图字体,一般是使用 BMFont 这种第三方工具:然而这个工具对于非程序员来说,操作起来较为繁琐困难。每次美术修改了字体之后,需要重新导出,而且还要在Untiy中做数据转换,最后才能在Untiy中看到字体。这里为了方便工作流,制作了一个一键导出的 Unity 内置位图字体生成工具:蒲公英。摸鱼小分队 / Unity位图生成工具:蒲公英 · GitCodeUnity位图生成工具:蒲公英 直接在Unity中生成位图字体,不需要再使用BMEditor。
2024-05-05 13:50:41
1095
原创 【Unity】LODGroup 计算公式
Unity 在配置 LodGroup 时,其分级切换的计算方法是按照物体在相机视野中占据的比例计算的。在运行时,如果相机视野范围(Field of View)没有改变,那么这个值可以直接换算成物体距离相机的距离。这里就讨论下如何计算得到这个距离。
2023-09-26 15:59:46
1223
原创 Houdini19 命令行启动环境配置
在自动化流程中,通常都是从外部命令行启动 Houdini,而不是在软件里进行烘培和输出。完全体是通过类似 Jenkins 等自动化工具来启动 Houdini 自动生成流程。我使用的 Houdini 版本为 19.5.640,对应的 Python 版本为 3.9 。
2023-09-12 16:26:49
1262
原创 【Unity】编辑器下查找指定文件下的所有特定资源
需求上很简单,就是在编辑器下,找到某个制定文件下的所有特定资源(UnityEngine.Object)。
2023-08-15 11:06:08
3155
1
原创 【C#】并行编程实战:并行编程中的模式
本章将介绍并行编程模式,重点是理解并行代码问题场景并使用并行编程/异步技术解决他们。本章会介绍几种最重要的编程模式。
2023-07-27 10:24:00
1127
原创 【C#】并行编程实战:编写并行和异步代码的单元测试用例
本章将介绍如何编写并行和异步代码的单元测试用例。编写单元测试是大型项目的重要组成部分,是代码健壮可靠、易于维护的必然要求。不过本章书上的代码与 Unity 基本没什么关系,也不适用。但是单元测试在 Unity 中依然是必要的,这里我们基于 Unity 来讨论单元测试。
2023-07-25 10:29:39
343
原创 【C#】并行编程实战:使用 Visual Studio 调试任务
本章将介绍可以在 Visual Studio 中的调试工具(包括 Thread 窗口、Tasks 窗口和 Concurrency Visulizer)调试线程。
2023-07-24 12:06:54
1652
原创 【C#】并行编程实战:异步编程详解
本章将从介绍同步代码和异步代码之间的区别开始,然后讨论何时适合使用异步代码,以及何时应避免异步代码。最后我们将讨论并行编程中的新功能以解决异步代码复杂性的帮助。本章相当于阶段性总结,新东西并不多。
2023-07-20 14:12:01
362
原创 【C#】并行编程实战:使用延迟初始化提高性能
在前面的章节中讨论了 C# 中线程安全并发集合,有助于提高代码性能、降低同步开销。本章将讨论更多有助于提高性能的概念,包括使用自定义实现的内置构造。本章主要内容为通过延迟初始化提高性能,相对比较简单。
2023-07-18 10:08:09
769
原创 【C#】并行编程实战:使用并发集合
但一般来说,共享资源是一个可以由多个线程读写的集合,即便多线程也应该能够同时写入。因此,使用同步原语对于这种数据集合来说,就不是很合适,这种时候推荐使用线程安全集合。
2023-07-17 10:43:57
1387
原创 【C#】并行编程实战:同步原语(1)
线程局部存储和分区局部存储,某种程度上可以解决同步问题。但是,当数据共享时,就需要用到同步原语。本章主要介绍互锁操作、.NET中的内存屏障、锁原语。
2023-07-11 09:55:14
684
原创 【C#】并行编程实战:使用 PLINQ(3)
本文的主要内容为 PLINQ 中的组合并行和顺序 LINQ 查询、取消 PLINQ 查询、使用 PLINQ 进行并行编程时要考虑的事项和影响 PLINQ 性能的因素。
2023-07-10 10:27:28
512
原创 【Unity】打包编译错误:‘NativeArrayUnsafeUtility‘ does not contain a definition for ‘SetAtomicSafetyHandle‘
解决 Unity 打包出现 'NativeArrayUnsafeUtility' does not contain a definition for 'SetAtomicSafetyHandle' 的编译错误。
2023-07-06 12:02:45
433
原创 【C#】并行编程实战:使用 PLINQ(1)
LINQ 是语言集成查询(Language Integrate Query , LINQ)的并行实现(P 表示并行)。本章将介绍其编程的各个方面以及与之相关的一些优缺点。本文为第一部分。
2023-07-05 11:24:10
702
TrelloClean.unitypackage
2020-04-21
Unity Excel插件 EPPlus (3.5+4.x)
2019-02-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人