Unity
文章平均质量分 82
以Unity学习中遇到的各种问题、开发总结为主。
魔术师Dix
API Caller
展开
-
负反馈性能调节系统
最早看到这个概念是在《腾讯游戏开发精粹II》里,看了之后感觉非常实用,于是将其列为开放世界的一个必备组件。其运行逻辑简单总结就是:例如监测到帧率下降时,则进行减少一些特效、音效,对不重要的 AI 降频等操作,使帧率提升。这样使得游戏整体帧率保持平稳,且能最大限度保证玩家的游戏体验。原创 2024-09-04 15:43:55 · 663 阅读 · 0 评论 -
开放大世界的碰撞与物理
对于开放大世界的物理碰撞,根据现有解决方案,需要将带物理的物体控制在 1k 以下,就能很好地在手机上运行并支持玩法。对于特殊的需求(例如翻墙、攀岩)等,通过射线手段进行辅助检测,减少物理碰撞的开销。基于 GpuTerrain 实现的地形,则需要通过生成 SDF 图的方式来辅助碰撞,基本上能满足需求。对于一些对碰撞精度要求较高的需求,也可以通过取巧的方式来实现。(例如,如需要玩家在前进过程中自动绕开一些小型灌木。原创 2024-08-28 12:09:16 · 1090 阅读 · 0 评论 -
开放大世界的数据管理
经过前面几个章节的介绍,开放世界的数据管理就已经初具雏形了。实际上,开放世界数据最麻烦的,就是各种地图渲染数据。如果地图渲染数据解决了,逻辑数据处理起来也是相对容易的。所以这里讲的,核心也是在地图渲染数据。这个视频是使用这一套技术整出来的Demo,有美术的配合就好看很多了。Island_G效果演示(8月版本)_哔哩哔哩_bilibili岛屿效果演示视频,项目中的Island_G。除了常规的天气、后期等,此版本主要增加了草海效果。这个版本的草海是根据新的草海插件美术手动绘制的,在CPU多线程进行渲染。原创 2024-08-27 20:59:41 · 612 阅读 · 0 评论 -
GPU驱动的大规模静态物件渲染
GPU Driven 的静态物件渲染,听起来很高级,其实具体操作很简单,基础就是直接调用 Graphics.DrawMeshInstancedIndirect 这个 Unity 内置接口就可以了。但我们项目对这个流程做了一些优化,使得支持的实体数量有大幅提升。这套系统主要也是公司的 TA 实现的,这里我也只简明扼要地介绍一下原理。原创 2024-08-15 17:11:09 · 793 阅读 · 0 评论 -
开放大世界的 GpuTerrain + RVT
Unity 原生有一个 Tarrain(地形)系统,但可惜并不能直接用于开放世界,当然是因为其效率问题。现在开放世界主流是使用 GpuTerrain + RVT ,也是一个成熟技术了。在项目中实现这个技术的是公司的 TA(我只做了接入),具体不了解,这里也只是大概说明下这个技术。如果对这套技术缺乏了解的,建议直接去看参考文章,而不是本文(因为本文写得非常简略,也不包含实现方案)。如果已经了解了的,这篇文章也可以跳过。原创 2024-08-15 11:52:29 · 939 阅读 · 0 评论 -
Unity手游开放大世界解决方案
在介绍技术栈之前,需要先了解下项目需求(因为有不少方案都是基于需求而定制的)。我们这个项目是一个海洋主题的项目,整个大世界是由一片大洋和星罗棋布的岛屿组成。最大的岛屿占地 2048*2048 米,最小的岛屿占地 256*256 米,整个世界大大小小岛屿总量约 1万。评估下来,总世界面积超过 4000 平方公里,总陆地面积约 922 平方公里。其中,岛屿有上岛玩法,即玩家可以扮演一个 NPC 登陆游玩,类似 RPG 游戏,可以进行解谜、战斗、探索等。玩家岛屿固定大小,可以在地图上迁移。原创 2024-08-14 18:30:38 · 627 阅读 · 0 评论 -
【Unity】位图字体制作工具:蒲公英
一般来讲,如果需要制作位图字体,一般是使用 BMFont 这种第三方工具:然而这个工具对于非程序员来说,操作起来较为繁琐困难。每次美术修改了字体之后,需要重新导出,而且还要在Untiy中做数据转换,最后才能在Untiy中看到字体。这里为了方便工作流,制作了一个一键导出的 Unity 内置位图字体生成工具:蒲公英。摸鱼小分队 / Unity位图生成工具:蒲公英 · GitCodeUnity位图生成工具:蒲公英 直接在Unity中生成位图字体,不需要再使用BMEditor。原创 2024-05-05 13:50:41 · 826 阅读 · 0 评论 -
【Unity】LODGroup 计算公式
Unity 在配置 LodGroup 时,其分级切换的计算方法是按照物体在相机视野中占据的比例计算的。在运行时,如果相机视野范围(Field of View)没有改变,那么这个值可以直接换算成物体距离相机的距离。这里就讨论下如何计算得到这个距离。原创 2023-09-26 15:59:46 · 888 阅读 · 0 评论 -
【Unity】编辑器下查找指定文件下的所有特定资源
需求上很简单,就是在编辑器下,找到某个制定文件下的所有特定资源(UnityEngine.Object)。原创 2023-08-15 11:06:08 · 2793 阅读 · 1 评论 -
【Unity】【ComputeShader】使用ComputeShader计算相机视野
前言: 设一个1024*1024的地块,需要实时计算有哪些地块在相机范围内。为了提高运行效率,这里用ComputeShader来计算。1、准备工作 先在Unity右键创建一个ComputeShader,然后再创建一个Canvas,放一张RawImage(用于接受调试用的图片)。 然后创建一个控制类,添加以下控制组件:public class ComputeTest : MonoBehaviour{ #region 外部赋值属性...原创 2021-09-11 16:37:12 · 938 阅读 · 0 评论 -
【Unity】UPM解决方案:苍耳
在进行Unity游戏开发的时候,一直有一个痛点,那便是相同功能的代码在不同项目之间如何共同使用?苍耳提供了一个解决方案。原创 2022-11-08 16:28:33 · 2194 阅读 · 2 评论 -
【学习积累】Queue 与 ConcurrentQueue性能测试
在 C# 中,关于队列(Queue)有两种,一种就是我们普通使用的队列,另一种是线程安全的队列ConcurrentQueue 。本文将对这两个队列进行一个简单的性能测试,同时讨论一种特殊情况:一个线程入队,一个线程出队时使用 Queue 的情况。原创 2023-04-14 22:08:54 · 1868 阅读 · 2 评论 -
【Unity】使用 System.Windows.Forms 的问题
因为最近开发需要用到使用 Windows 自带的窗口打开、文件选择等功能,然后兜兜转转需要使用System.Windows.Forms 这个库。这个库在 WinForm 里是很常见的,但是要在 Unity 里使用,并打包出来还是有些坑的。原创 2022-12-23 15:05:04 · 6161 阅读 · 3 评论 -
【Unity】UI ToolKit 学习记录
Unity推出的这个 UI ToolKit,据说是要用来替代UGUI。既然这么有野心,那肯定要搞来看一看。这次使用目标就是用这个 UI ToolKit 生成一堆类似HUD的头标,然后看看使用难易程度和性能如何。原创 2022-12-16 15:57:49 · 3671 阅读 · 1 评论 -
【Unity】Entities 1.0 学习(二):调试工具
在 Entites 1.0 ,Unity修改了之前的调试面板,以及在场景下构建 Ecs World 的流程,较之前的版本差别还是蛮大的。因此有必要记录一下新的调试工具,以及构建方法。原创 2022-12-07 17:07:18 · 2813 阅读 · 1 评论 -
【Unity】Entities 1.0 学习(一):Aspect
Unity在 2022年下半年(我印象是9月份左右)推出了 Entities 1.0 ,可以在 2022.2.0b8 以上的版本使用。当时我粗略地看了一下,但是没有深入学习。最近空闲时间稍多,就认真来学习一下 Entities 1.0有啥新的东西。这篇文章算一个起头,以及对Aspect的一些学习总结原创 2022-11-11 23:17:06 · 5427 阅读 · 0 评论 -
【Unity】关于升级到2021.3.12之后URP编译错误的问题
我也看了其他的几个报错,基本都是说的在URP内部包的错误。这种属于低级错误了,这种编译错误都不需要测试人员,编译器自己就能检查出来,纯纯的语法错误。我看了下降级后的工程,确实没有报错了,然后URP的版本也依然是12.1.7。我试过,这个方案确实能解决,他把URP干掉了当然就解决了……如果是在是要用新版本的Uinty,看来只有把2021.3.11的URP拷贝出来,然后在2021.3.12里面用。然后果然还是重现了上述问题,那就不是我本身工程的问题了,属于Unity自带的问题。然而这个确实不知道是个啥东西。原创 2022-10-31 12:38:10 · 4275 阅读 · 6 评论 -
【Unity】俯视角相机地面视野范围的计算
在SLG等游戏中,相机总是固定为俯视角(上帝视角)。为了更好地管理游戏数据,需要对地图进行分块,只处理视野内的部分。判定某个单位是否在视野内有很多方法了,但是要么不够精确,要么性能不够,要么无法与AOI配合。 一个可行的方案就是将相机在地面上的视野计算出一个AABB 2D 包围盒,然后基于此包围盒来计算 AOI、显隐等。这个方案效率够高,而且对俯视角适配较好。原创 2022-10-26 12:12:33 · 4023 阅读 · 5 评论 -
【Unity】关于DrawMeshInstanced does not support the shader 的问题
关于 Graphics.DrawMeshInstanced 报 Shader 不支持的错误,这里做个问题收集总结。原创 2022-10-26 11:11:58 · 2190 阅读 · 1 评论 -
【Unity】关于 Unity Package 的 Version 格式。
在自定义 Unity 的Package插件的时候,我们需要编写一个Json文件:package.json 。 其中有个 version 字段,表示其版本,其值是一个字符串。本文旨在简单解释这个version字段的格式和规则。原创 2022-10-17 10:18:52 · 1250 阅读 · 0 评论 -
【Unity】相机视锥体剔除算法
视锥体剔除是Unity常用的剔除方法,其原理就是通过判定目标包围盒与组成相机视锥体的6个平面进行同侧判定,只要在6个平面之间的包围盒即为可见。本文根据其原理,给出一个视锥体裁剪的剔除算法的实现,并兼容ECS。原创 2022-09-27 21:03:36 · 3872 阅读 · 8 评论 -
【Unity】二维坐标映射成ID
在平面上,格子坐标通常是个二维坐标(X,Y),但是二维坐标有很多不方便的地方,且如果作为键值,其取值效率不高。因此大部分情况下,需要将二维坐标转换成ID来使用(且能从ID转换回坐标)。 常用的方式就是X*N+Y,N为一个足够大的数。但是这种方式有问题,其只能支持全正数或者全负数,一旦有正有负,就会坐标转换失败。因此需要一种较为便捷的算法,能将二维坐标映射成ID,且能互相转换。......原创 2022-07-14 11:05:01 · 1045 阅读 · 1 评论 -
【Unity】关于GPU异步回读Android兼容性问题
有时我们需要使用Unity的GPU 异步回读的功能,也就是使用如下API:AsyncGPUReadback 。那么这个API是否能无脑使用呢?他的兼容性如何呢?原创 2022-06-16 19:58:59 · 2084 阅读 · 0 评论 -
【Unity】六边形地图格子基础
这里的六边形地图,指SLG游戏中的大世界地图,用六边形的网格进行平铺。例如文明,以及部分SLG手游。这里介绍六边形地图格子的基本概念,以及具体数学实现代码。原创 2022-06-02 15:51:42 · 7980 阅读 · 0 评论 -
【C#】一个简单的伪随机方法
伪随机是游戏中常用的功能,但是我看网上的实现都比较复杂,或者不够随机(比如用线性同余法)。所以就自己实现一个算了,用最简单的方式。需求类似于抽卡那种,例如10连抽必中1张(概率10%),然后这1张在这10次里面是随机出现的。如果第一张就抽中了,那后面9张都不会中;同理,如果前9张都每中,则最后一张必中。实现算法基本思路如下:先获取一个概率(P),然后得到当前概率下的...原创 2022-02-17 20:10:53 · 1691 阅读 · 0 评论 -
【Unity】Camera.WorldToViewportPoint 计算原理及实现
具体原理我是参考的这篇文章:https://gameinstitute.qq.com/community/detail/116994本地具体实现实现方法(不调用Camera的API)如下:1、获取相机的VP矩阵: 物体顶点坐标转换成屏幕坐标是用MVP矩阵,但是因为我们这边本来就使用的世界坐标进行转换,所以只需要VP矩阵即可。获取VP矩阵的方法如下: private Matrix4x4 Matix_V...原创 2021-09-06 15:15:28 · 3915 阅读 · 0 评论 -
【Unity】确保3D物体显示在最前的几种方法
前言:最近项目里有一个需求,要求某个单位(3D)一直显示在所有物体的最上层,哪怕他在其他物体后面。经过一番折腾解决了,这里提供几种思路。这里先起一个Demo,如下图:可以看到,黄色方块是在白色方块后面的。在Game视图中可以看到,黄色方块是被白色方块挡住了一部分。现在我们用一些操作把黄色方块提到最前。一、使用2个相机这种可以说是最简单的了:把主相机复制一份,然后剔除掉黄色方块的层。再在复制出来的相机里设置为Depth Only并且只照黄色方块的层:可以看到这个黄.原创 2021-04-01 17:54:59 · 8332 阅读 · 5 评论 -
【Unity】【UGUI】映射3D坐标到UI上(血条、人物状态)
把3D坐标映射到UI上,这种操作多用于类似血条、人物名之类的东西。这种其实是可以整个通用的方法来解决的:通过3D坐标直接修改UI控件的位置:原创 2020-12-27 14:47:51 · 1329 阅读 · 1 评论 -
【Unity】【Odin Inspector】关于AOT Generation
首先:Odin是一个绝对需要用的插件(稳赚不赔)但是Odin Inspector在手机上可能会有些问题……原创 2020-12-27 14:29:26 · 3826 阅读 · 5 评论 -
【Unity】判断 物体/坐标 是否在相机范围内
如何判定一个物体/坐标是否在视野范围内?本文提供三种解决方案。原创 2020-12-03 22:18:04 · 10291 阅读 · 4 评论 -
【Unity】:从【3ds Max】为人形骨骼 humanoid 添加动画
众所周知,Unity有的Fbx模型可以有一种人形动画,通过这种人形动画可以实现各种人形骨骼动画之间的复用。那么问题来了,如果我再3dsMax里做了一个动画,要怎样才可以用到我目前的动画中呢?原创 2020-09-04 14:41:21 · 4345 阅读 · 0 评论 -
【学习总结】Unity内存解析
前言之前看的一个Unity官方的视频:浅谈Unity内存管理(https://www.bilibili.com/video/BV1aJ411t7N6);觉得干货满满,但是一时又不能完全记下来,当时就想记个笔记。但是后面要么忘了,要么没时间,一直没有实现(主要还是懒)。这一次重新看一遍视频,再结合我自己的一些理解,一边学习一边总结。正文1、什么是内存内存分为物理内存、虚拟内存。关于物理内存:关于物理内存需要记住:CPU访问内存是一个满速过程。CPU在需要访问内存时,先是..原创 2020-08-25 23:11:40 · 1760 阅读 · 0 评论 -
【Steam】成就系统的制作及本地化
Steam的成就系统还是比较简单好做的,大部分API都已经弄好了。这里就把大概流程总结一下,方便以后查阅。1、SteamWork的设置在Steamworks网页的成就面板中,可以添加成就,默认是英文的。点击新成就可以添加一个成就:这个表格还是比较清晰的。值得注意的是,这个API名称就是你在程序里需要用到的名字,所以这个命名一定要规范。然后显示名称和描述就随便填了,看策划的配置。然后还有一个进度状态,一开始时没有进度的,只能选无。这个进度需要在统计选单里设置:...原创 2020-08-14 20:49:57 · 4186 阅读 · 0 评论 -
【Unity】FBX Exporter 的使用 (To 3ds Max 2018)
Unity版本:Unity 2019.4.4f13ds Max 版本:2018 (至少要 2017 以上的版本)1、导入FBX Exporter在Unity中,点击Window→Package Manager,然后找FBX Exporter;如果在左边的列表中找不到,则在Advanced中勾选 Show preview packages :选中FBX Exproter,然后点Instailling进行导入。之后选择Edit→Project Settings→Fbx Expo.原创 2020-07-25 18:53:15 · 19384 阅读 · 4 评论 -
【Unity】【UI Shader】关于用Shader实现字体的描边和阴影
前言描边和阴影,Unity本来是由自带的组件的(Outline和Shadow)。Unity自己的实现方式如下:Outline:把原文字/图片以往的网格复制4份,然后上下左右各偏移一点距离(相当于多绘制了4遍)。Shadow:把原文字/图片的网格复制1份,然后往某个方向偏移一点(相当于多绘制了1遍)。我觉得是挺蛋疼的,所以就突发奇想干脆用Shader来实现会不会好一点。正文:由于本人水平有限,所以大部分代码都是参考网上的。这里先上代码:// Upgrade NOTE: re.原创 2020-07-06 12:54:45 · 6971 阅读 · 1 评论 -
【Unity】【PC】【错误上报】Bug上报插件 Trello Bug Tracker 使用介绍 (二):错误抓取部分
前言上一章(https://blog.csdn.net/cyf649669121/article/details/105637064)说了关于Trello这个插件的使用和用户自定义上报的部分,不过还需要实现的一个就是错误抓取的功能。这个就和手机上用的Bugly就很像了,就是抓取Unity控制台输出的报错和异常,然后分类上报。不过这个插件没有自己实现,需要我们自己来实现他。设想...原创 2020-04-21 12:39:27 · 1239 阅读 · 1 评论 -
【Unity】【PC】【错误上报】Bug上报插件 Trello Bug Tracker 使用介绍 (一):用户上报部分
前言最近需要做一个在PC端的Bug上报功能,之前的Bugly是用在移动端的,其实不是很适合。所以需要一个在PC端的Bug上报,然后在网上找到一个还不错的插件:Trello Bug Trackerhttps://assetstore.unity.com/packages/tools/integration/trello-bug-tracker-pro-75613不过网上对这个的介...原创 2020-04-20 20:22:36 · 1884 阅读 · 3 评论 -
【Unity】简易游戏存档
前言游戏存档的功能和重要性不需要过多叙述,实现的方法也很多样。对于Unity来讲,最简单的就是用PlayerPrefs来搞。但是就因为简单,所以能实现的功能也比较少。目前PlayerPrefs存些Int、String显然是不够的。所以推荐一个C#自带的序列化来做存档,简单易用,功能全面,而且简单,会一点C#就能会。原理用FileStream 和BinaryFormat...原创 2020-04-19 01:30:32 · 2471 阅读 · 0 评论 -
Unity3D插件 Doozy UI 学习(三):UI Element
前言之前写过一些关于DoozyUI的开发介绍,比较基础。后面用DoozyUI开发了一段时间,现在已经有了更深入的一些了解。这篇主要讲一下UI Elemenet这个脚本的使用。正文1、关于UI Element:如下图所示,Doozy UI的UI Element主要有以下内容。UI Element顾名思义,就是一个UI的最小元素。是作为打开、关闭的单位。通俗来讲,就是我们...原创 2019-10-12 12:06:57 · 3358 阅读 · 0 评论 -
Unity开发时遇到的各种需要注意的地方
前言:最近在做东西的时候突然想到,自己以前做过的项目有很多地方需要注意的,然而并没有记录下来,导致下次还会出现这样的问题。于是就有了这个想法,把之前各种各样奇奇怪怪的问题都记录下来,解决方案也写下了。一是加深记忆,二是万一又遇到了好歹也有个参考;正文:1、Transform.GetComponentsInChildren找不到组件!?这是因为Transform.G...原创 2018-09-28 16:26:22 · 6849 阅读 · 3 评论