-
代码生成Perlin噪点图
概述 最近在弄的游戏项目需要一些渲染特效,所以在弄shader。大部分实现复杂特效的shader都需要一个甚至多个噪点图进行随机采样。但网上往往下不到合适的噪点图,而且也不可能一张噪点图从头用到尾,所以我就翻了翻官方文档,弄了一个自动生成Perlin噪点图的编辑器拓展。PS: 这期内容有点水,因为最近都在忙this-is-ib这个项目,好不容易抽点时间写篇博客(一月两更可不能忘🌚)。思路基本思路是使用Mathf.PerlinNoise(float x, float y)方法获得特定uv...…
-
Unity中输入系统的设计
概述 游戏,作为一种交互式艺术,玩家的操作是必不可少的。事实上,对于游戏中操作系统的设计也是非常耗费精力的。本篇博文不是从游戏设计角度上来叙述怎样设计游戏的操作,而是从程序设计的角度提出一种更通用和抽象的输入系统。PS:本篇内容特别多,本来是想拆成两篇的,但考虑到内容的连贯,还是放到一篇里解决。Unity的输入系统作为一个非常强大的游戏引擎,Unity已经为开发者提供了一层高级的输入抽象。大部分的开发我们都使用UnityEngine.Input类来解决问题。Input类提供了诸如按键检测...…
-
Unity游戏开发优化 —— 通用对象池与复用(二)
概述 上一篇博文实现了一个简单的对象池基类,对所有继承自IReusable的对象实例进行回收利用。然而在实际的开发过程中,不少Unity独有的GameObject对象也需要进行对象池优化,比如说FPS游戏里的枪口火花以及各种反复出现的粒子特效,甚至是批量出现的NPC敌人。由于Unity机制的特殊性,GameObject对象的生命周期被Unity托管,无法通过构造器初始化等等。这样一来我们就需要对之前的对象池进行改进。##注意!本篇博文的代码风格骤变,主要是最近看了一些C#规范,自己也就稍...…
-
Project Plan -- This Is IB
Project Plan – This Is IB The Game Project I am currently working on.Project Info Key Value Name This Is IB Organization NFLS.IO Type Game Tag Low Poly, P...…
-
Unity游戏开发优化 —— 通用对象池与复用(一)
概述 游戏开发的一个大坑就是优化。这边博客主要讨论什么是对象池缓存技术以及如何基于Unity设计一个通用的对象池缓存框架。为什么要用对象池?引入对象池的概念是为了减少内存碎片的产生与降低创建实例时的cpu消耗,一般适用于各种粒子特效,或是射击游戏里的子弹之类的大量重复出现的游戏物体。什么是内存碎片?当一个实例的所有引用都被赋予null时,这个实例就变成了内存垃圾,即将被系统清理。当它被GC清理掉后,内存里就会留下一条空的可以使用的内存。然而问题来了,假设这段空余内存有4个...…
-
Unity游戏开发中对本地文件的加密读写
概述在实际项目中,总是需要将一些数据持久化在本地,比如游戏存档,偏好设置或是热更新的一些资源。对于其中一些需求如偏好设置来说,直接以明文的方式写入PlayerPrefs就可以了,但是对于存档这类的文件一般都是在写入在项目的Application.persistentDataPath路径下。然而直接明文读写的话可能会导致存档被玩家篡改,或者重要的信息被第三方获取到(比如与服务器通讯的秘钥),因此,对于敏感的文件,我们需要对它进行加密操作。实现二进制存储第一种实现的方法非常简单,...…
-
Unity中自定义Coroutine的yield return返回条件
概述 当游戏开发涉及到人工智能设计的部分时,判断人物动画/寻路等这类持续一段时间而不是单帧的操作何时结束是一个能扰乱代码质量的地方。一种最简单的方法是在update()中每帧进行检验,但这种方式会使用大量的if else结构,使得代码混论难懂,耦合高,同时即使该帧没有操作正在进行也需要一个if else判断是否需要检测操作进度,消耗cpu性能。如果我们能使用coroutine协程来解决这个问题,进度检测代码就可以和主更新方法分离开了来了。然而如果仍然使用if else判断动作是否结束,...…
-
Waste Of Water
It is often heard by people like me living in a wet city of water scarcity. However, fewer people really gets a figure of what is really happening just around us - the human-beings are now touching on the bottom of the earth’s well.It is hard to...…
-
Unity中实现简单的非连续的随时间变化而改变的光照效果
概述 最近在开发一个移动端项目,涉及到了一天之内场景的光线随时间变化而改变,比如午后的阳光和黄昏的光线就是不一样的。这可以使场景更动态,但是却对机器的机能有了更高的要求。下面我简单的说说我的实现方法。实现最简单的一种实现最简单的方法我想大家一定都能想到,用代码动态改变light组件的color属性和transform信息,从而实现连续的,真实的动态光照。这种做法的优势是十分明显的,即实现起来简单,而且是连续的,效果相对真实,但是对设备的机能要求比较苛刻,因为是实时渲染光...…
-
Unity中使用Delegate, Action, Func, Reflection, UnityAction动态调用函数优劣对比
概述在游戏开发中(其实别的领域也一样啦),为了保证代码框架的灵活,低耦合,拓展性强,许多时候需要动态地调用函数。在C++里面,一种特殊的指针,函数指针,承担了传递函数的功能。Javascript里也有高级函数这么一说来将函数也作为参数使用。C#作为一门拥有许多特性的现代编程语言来说,提供了多种解决方法。比较 以下内容不会特别具体介绍各个方法该如何使用,而是从实现机制这一角度来分析运行效率等方面(如果有错,请指出😂)。使用Delegate机制Delegate,直接翻译就是委托,本质上是像C...…