自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(108)
  • 资源 (2)
  • 收藏
  • 关注

原创 Unity开发时遇到的各种需要注意的地方

前言:最近在做东西的时候突然想到,自己以前做过的项目有很多地方需要注意的,然而并没有记录下来,导致下次还会出现这样的问题。于是就有了这个想法,把之前各种各样奇奇怪怪的问题都记录下来,解决方案也写下了。一是加深记忆,二是万一又遇到了好歹也有个参考;正文:1、Transform.GetComponentsInChildren找不到组件!?这是因为Transform.G...

2018-09-28 16:26:22 6878 3

原创 负反馈性能调节系统

最早看到这个概念是在《腾讯游戏开发精粹II》里,看了之后感觉非常实用,于是将其列为开放世界的一个必备组件。其运行逻辑简单总结就是:例如监测到帧率下降时,则进行减少一些特效、音效,对不重要的 AI 降频等操作,使帧率提升。这样使得游戏整体帧率保持平稳,且能最大限度保证玩家的游戏体验。

2024-09-04 15:43:55 672

原创 开放世界的开发利器:白模

所谓白模(BlockMesh),就是在关卡设计初期,使用极简模型搭建的示意,用来测试关卡的合理性和可玩性。这不是一个新概念,在众多高质量游戏制作中都是必不可少的流程。这里我推荐一篇顽皮狗关卡策划 David Shaver 关于白模分享(原版PDF下载)五分钟GDC 01:游戏Blockmesh关卡设计技巧——图文版 - 哔哩哔哩Hello 大家好,这里是五 分 钟GDC,今天给大家带来的是游戏关卡设计中Blockmesh 的技巧。首先,让我们先了解一下什么是Blockmesh。

2024-09-03 20:41:12 1116

原创 什么是游戏开发流水线?以及我们为什么需要他?

游戏开发流水线,即从构思到成品的一系列过程。相信有的朋友已经迷惑了:哪个项目不是从构思到成品呢?诚然,所有项目都是从构思到产品。但关键在于 “一系列过程”。你经历过的项目,他们的这个过程是相同的吗?有通用的步骤吗?每做完一个项目,能让我下一个项目进行地更快吗?也许,有的项目是先写好策划案,美术和程序再依照制作;有的项目是一边做功能,一边补案子;有的项目做了编辑工具;有的项目有原型流程图……然而,如果不能将游戏的开发步骤形成规范,且既能从项目中抽象出来,也能适配到项目中去;

2024-09-03 11:48:15 1025

原创 开放大世界的全局寻路

开放大世界的寻路一直是很困扰我的一个点,地图大、还是动态可变的,所以寻路会有很多要求。根据上面的需求,像 NavMesh、JPS+ 虽然效率高,但是重建代价大;用 A* 重建代价小但是效率也太差了;而 FlowField 又不支持多目标寻路。最后,我根据项目本身的需求,设计了一套适用于航海主题的海洋+岛屿的寻路解决方案。这个方案能够满足项目要求,且只有一个 O(1) 的复杂度,还可以分布寻路,地图的重建开销也很低。当然,这里对岛屿、地图设计做了一些限制,同时是针对航海特化的方案。

2024-08-30 14:49:55 1016

原创 开放大世界千人同屏网络设计

客户端(逻辑层)服务器都采用ECS架构(只有ECS能满足设计需求)。总体上还是使用状态同步,各个客户端看到的表现不一致。玩家主要关心周边的单位,而不是全部的AOI块内的单位。同步时,只同步移动(路径)信息,其他信息一概不同步(包括血量)服务器提供一个协议,供客户端直接拉取某个玩家的具体信息(客户端主动请求,避开主服务器的同步,类似于灯塔)。客户端根据相机范围来主动向服务器拉取(只读)。这个请求需要做到能无代价。

2024-08-30 11:44:09 1215

原创 开放大世界的碰撞与物理

对于开放大世界的物理碰撞,根据现有解决方案,需要将带物理的物体控制在 1k 以下,就能很好地在手机上运行并支持玩法。对于特殊的需求(例如翻墙、攀岩)等,通过射线手段进行辅助检测,减少物理碰撞的开销。基于 GpuTerrain 实现的地形,则需要通过生成 SDF 图的方式来辅助碰撞,基本上能满足需求。对于一些对碰撞精度要求较高的需求,也可以通过取巧的方式来实现。(例如,如需要玩家在前进过程中自动绕开一些小型灌木。

2024-08-28 12:09:16 1111

原创 开放大世界的数据管理

经过前面几个章节的介绍,开放世界的数据管理就已经初具雏形了。实际上,开放世界数据最麻烦的,就是各种地图渲染数据。如果地图渲染数据解决了,逻辑数据处理起来也是相对容易的。所以这里讲的,核心也是在地图渲染数据。这个视频是使用这一套技术整出来的Demo,有美术的配合就好看很多了。Island_G效果演示(8月版本)_哔哩哔哩_bilibili岛屿效果演示视频,项目中的Island_G。除了常规的天气、后期等,此版本主要增加了草海效果。这个版本的草海是根据新的草海插件美术手动绘制的,在CPU多线程进行渲染。

2024-08-27 20:59:41 620

原创 【Unity】移动端草海解决方案

草海是开放大世界渲染的必不可少的因素,Unity 原生的 Terrain 草海效率较低,而且无法与 RVT 结合起来,无法在移动端上实现。因此我们自己搓出来一套草海系统,使用 C# 多线程辅助运算,并能支持割草、烧草等进阶玩法。草的位置、密度、类型还需要根据美术和地形的信息进行自适应。最终效果可以看这个演示视频:GpuTerrain+草海_哔哩哔哩_bilibili地形用GpuTerrain渲染;草海是自定义实时生成运算+Gpu渲染。

2024-08-24 15:50:06 873

原创 基于 Dots + GPU Instance 的大规模物体渲染

之前写的两篇开放世界技术栈都是公司其他同事做的,所以很多细节了解不详细。但这次是全程我自己搭建的轮子,可以讲得稍微详细些。之前写的大规模物件渲染的 GPU 版本,虽然渲染量大效率高,但是有个很致命的缺陷:无法与游戏逻辑进行交互。因为主要渲染数据都是放在 GPU 中,为了效率要尽可能减少异步回读,也要尽量减少同步数据量,所以要物体与逻辑交互就基本不可能了。但是使用 Unity 的 Dots 系统再加上 GPU Instance 技术,就可以很好地解决这个问题。

2024-08-22 13:58:13 1172

原创 GPU驱动的大规模静态物件渲染

GPU Driven 的静态物件渲染,听起来很高级,其实具体操作很简单,基础就是直接调用 Graphics.DrawMeshInstancedIndirect 这个 Unity 内置接口就可以了。但我们项目对这个流程做了一些优化,使得支持的实体数量有大幅提升。这套系统主要也是公司的 TA 实现的,这里我也只简明扼要地介绍一下原理。

2024-08-15 17:11:09 806

原创 开放大世界的 GpuTerrain + RVT

Unity 原生有一个 Tarrain(地形)系统,但可惜并不能直接用于开放世界,当然是因为其效率问题。现在开放世界主流是使用 GpuTerrain + RVT ,也是一个成熟技术了。在项目中实现这个技术的是公司的 TA(我只做了接入),具体不了解,这里也只是大概说明下这个技术。如果对这套技术缺乏了解的,建议直接去看参考文章,而不是本文(因为本文写得非常简略,也不包含实现方案)。如果已经了解了的,这篇文章也可以跳过。

2024-08-15 11:52:29 949

原创 Unity手游开放大世界解决方案

在介绍技术栈之前,需要先了解下项目需求(因为有不少方案都是基于需求而定制的)。我们这个项目是一个海洋主题的项目,整个大世界是由一片大洋和星罗棋布的岛屿组成。最大的岛屿占地 2048*2048 米,最小的岛屿占地 256*256 米,整个世界大大小小岛屿总量约 1万。评估下来,总世界面积超过 4000 平方公里,总陆地面积约 922 平方公里。其中,岛屿有上岛玩法,即玩家可以扮演一个 NPC 登陆游玩,类似 RPG 游戏,可以进行解谜、战斗、探索等。玩家岛屿固定大小,可以在地图上迁移。

2024-08-14 18:30:38 649

原创 【Unity】位图字体制作工具:蒲公英

一般来讲,如果需要制作位图字体,一般是使用 BMFont 这种第三方工具:然而这个工具对于非程序员来说,操作起来较为繁琐困难。每次美术修改了字体之后,需要重新导出,而且还要在Untiy中做数据转换,最后才能在Untiy中看到字体。这里为了方便工作流,制作了一个一键导出的 Unity 内置位图字体生成工具:蒲公英。摸鱼小分队 / Unity位图生成工具:蒲公英 · GitCodeUnity位图生成工具:蒲公英 直接在Unity中生成位图字体,不需要再使用BMEditor。

2024-05-05 13:50:41 844

原创 【Unity】LODGroup 计算公式

Unity 在配置 LodGroup 时,其分级切换的计算方法是按照物体在相机视野中占据的比例计算的。在运行时,如果相机视野范围(Field of View)没有改变,那么这个值可以直接换算成物体距离相机的距离。这里就讨论下如何计算得到这个距离。

2023-09-26 15:59:46 909

原创 Houdini19 命令行启动环境配置

在自动化流程中,通常都是从外部命令行启动 Houdini,而不是在软件里进行烘培和输出。完全体是通过类似 Jenkins 等自动化工具来启动 Houdini 自动生成流程。我使用的 Houdini 版本为 19.5.640,对应的 Python 版本为 3.9 。

2023-09-12 16:26:49 876

原创 【Unity】编辑器下查找指定文件下的所有特定资源

需求上很简单,就是在编辑器下,找到某个制定文件下的所有特定资源(UnityEngine.Object)。

2023-08-15 11:06:08 2823 1

原创 【C#】并行编程实战:并行编程中的模式

本章将介绍并行编程模式,重点是理解并行代码问题场景并使用并行编程/异步技术解决他们。本章会介绍几种最重要的编程模式。

2023-07-27 10:24:00 1011

原创 【C#】并行编程实战:异步流

本章主要介绍异步流:一种将异步多线程和主线程结合使用的方法;

2023-07-26 10:44:28 518

原创 【C#】并行编程实战:编写并行和异步代码的单元测试用例

本章将介绍如何编写并行和异步代码的单元测试用例。编写单元测试是大型项目的重要组成部分,是代码健壮可靠、易于维护的必然要求。不过本章书上的代码与 Unity 基本没什么关系,也不适用。但是单元测试在 Unity 中依然是必要的,这里我们基于 Unity 来讨论单元测试。

2023-07-25 10:29:39 271

原创 【C#】并行编程实战:使用 Visual Studio 调试任务

本章将介绍可以在 Visual Studio 中的调试工具(包括 Thread 窗口、Tasks 窗口和 Concurrency Visulizer)调试线程。

2023-07-24 12:06:54 1408

原创 【C#】并行编程实战:基于任务的异步编程基础(下)

本文主要介绍一下TPL,主要内容为主要内容为异步代码的异常处理和使用异步代码的一些注意事项。

2023-07-21 10:06:22 122

原创 【C#】并行编程实战:基于任务的异步编程基础(上)

主要内容为async 和 await 关键字 和手动实现 TAP。

2023-07-20 19:59:50 135

原创 【C#】并行编程实战:异步编程详解

本章将从介绍同步代码和异步代码之间的区别开始,然后讨论何时适合使用异步代码,以及何时应避免异步代码。最后我们将讨论并行编程中的新功能以解决异步代码复杂性的帮助。本章相当于阶段性总结,新东西并不多。

2023-07-20 14:12:01 303

原创 【C#】并行编程实战:使用延迟初始化提高性能

在前面的章节中讨论了 C# 中线程安全并发集合,有助于提高代码性能、降低同步开销。本章将讨论更多有助于提高性能的概念,包括使用自定义实现的内置构造。本章主要内容为通过延迟初始化提高性能,相对比较简单。

2023-07-18 10:08:09 695

原创 【C#】并行编程实战:使用并发集合

但一般来说,共享资源是一个可以由多个线程读写的集合,即便多线程也应该能够同时写入。因此,使用同步原语对于这种数据集合来说,就不是很合适,这种时候推荐使用线程安全集合。

2023-07-17 10:43:57 1235

原创 【C#】并行编程实战:同步原语(4)

本章主要介绍轻量级同步原语、屏障和倒数事件、SpinWait和自旋锁。

2023-07-14 10:01:29 480

原创 【C#】并行编程实战:同步原语(3)

本章主要介绍信号原语。

2023-07-13 10:22:12 276

原创 【C#】并行编程实战:同步原语(2)

当多线程数据共享时,需要用到同步原语。本章为第2篇。主要介绍锁、互斥锁和信号灯。

2023-07-12 15:16:17 486

原创 【C#】并行编程实战:同步原语(1)

线程局部存储和分区局部存储,某种程度上可以解决同步问题。但是,当数据共享时,就需要用到同步原语。本章主要介绍互锁操作、.NET中的内存屏障、锁原语。

2023-07-11 09:55:14 582

原创 【C#】并行编程实战:使用 PLINQ(3)

本文的主要内容为 PLINQ 中的组合并行和顺序 LINQ 查询、取消 PLINQ 查询、使用 PLINQ 进行并行编程时要考虑的事项和影响 PLINQ 性能的因素。

2023-07-10 10:27:28 420

原创 【C#】并行编程实战:使用 PLINQ(2)

本文继续介绍 PLINQ 语句,主要内容为 PLINQ 中的合并选项以及抛出和处理异常。

2023-07-07 09:58:23 763

原创 【Unity】打包编译错误:‘NativeArrayUnsafeUtility‘ does not contain a definition for ‘SetAtomicSafetyHandle‘

解决 Unity 打包出现 'NativeArrayUnsafeUtility' does not contain a definition for 'SetAtomicSafetyHandle' 的编译错误。

2023-07-06 12:02:45 346

原创 【C#】并行编程实战:使用 PLINQ(1)

LINQ 是语言集成查询(Language Integrate Query , LINQ)的并行实现(P 表示并行)。本章将介绍其编程的各个方面以及与之相关的一些优缺点。本文为第一部分。

2023-07-05 11:24:10 559

原创 【C#】并行编程实战:实现数据并行(3)

本章继续学习实现数据并行,本文主要介绍取消循环。

2023-07-03 15:45:41 546

原创 【C#】并行编程实战:实现数据并行(4)

本章继续学习实现数据并行,本文主要介绍并行循环中的线程存储。这也是本章节的最后一篇。

2023-07-03 15:45:18 1871

原创 【C#】并行编程实战:实现数据并行(2)

本章继续学习实现数据并行,本文主要介绍任务并行度和自定义分区策略相关内容。

2023-06-30 10:49:08 547

原创 【C#】并行编程实战:实现数据并行(1)

到目前为止,我们已经掌握了并行编程、任务和任务并行的基础知识。本章将讨论并行编程的另一个重要方面,即数据并行。

2023-06-27 20:41:31 974

原创 【C#】并行编程实战:任务并行性(下)

本章继续介绍任务并行性,因篇幅所限,本章为下篇。因为并行编程上手难度较大,因此代码帖得比较多,属于保姆级教程。

2023-06-25 12:38:32 767

原创 【C#】并行编程实战:任务并行性(中)

本章继续介绍任务并行性,因篇幅所限,本章为中篇。

2023-06-15 23:52:56 2618

TrelloClean.unitypackage

Unity Trello 插件的干净版本,自己做了一些优化。 升级了一下API之类的。把例子文件和绘图工具删除了,保留了网页的API。

2020-04-21

Unity Excel插件 EPPlus (3.5+4.x)

Unity Excel插件 EPPlus ,以及附带调用代码。插件包含 .Net 3.5 和 .Net 4.x 两个版本;C#部分代码包含对Excel 2007以上(.xlsx)的读写等功能。 使用参考:https://blog.csdn.net/cyf649669121/article/details/87380643

2019-02-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除