
Unity技术开发干货
Unity技术开发干货
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅博主任意付费专栏,享有该博主全部专栏一年阅读权限。
本专栏为虚拟产品,一经付款概不退款,敬请谅解。
PassionY
不积跬步无以至千里,不及小河无以致江海。
-
原创 unity实现游戏帧同步之确定性物理引擎
一.前言近几年,市面上出现了越来越多IO游戏,Moba游戏,这些游戏有一个共同的特点,就是需要多人同时进行对战,做多人同步对战游戏,有两个技术点是绕不开的:1.实时网络同步技术,2.确定性物理引擎。首先网络的话,如果游戏要求是帧同步,为了保证网络传输的速度,那一定是udp首选,但是需要处理下丢包的问题。这个问题我们不在这里多说。我们今天主要说的时确定性物理引擎的问题。那么什么是确定性物理引擎呢?确定性物理引擎这个要从普通的物理引擎来说起,比如Unity3D内置的NVIDIA出品的PhysX物理引擎和G2021-01-12 12:40:3590
0
-
原创 unity 使用lua处理byte数组
前言一般untiy中网络处理都是使用C#,但是如果使用lua做热更开发的话,很多逻辑需要在lua端写,比如网络协议,会使用lua-protobuf,lua-pbc等。那么网络的字节拼接就需要在lua端拼接好,再回传给C#,目前拼接字节有两种方案:1.使用C#的MemoryBuffer+BinaryReader和BinaryWriter进行拼接2.使用lua的string.pack和string.unpack进行拼接如果使用C#进行拼接,那么最好是在C#端直接做,如果在lua端做,就需要lua调用C2020-12-31 18:48:1991
0
-
原创 GameFramwork框架详解之(七)资源打包和加密
一.Resource Builder编辑器面板我们根据GameFramework的demo:Star Force 进行拆解GF的资源打包和加密逻辑参数:productName:产品名称。companyName:公司名称。gameIdentifier:游戏识别号。gameFrameworkVersion:游戏框架版本。unityVersion:Unity 版本。applicableGameVersion:适用游戏版本。internalResourceVersion:内部资源版本。bui2020-12-21 22:00:03102
0
-
原创 Unity如何动态修改TextMeshProUGUI的参数
TextMeshPro是Unity的一个内置插件,性能和效果均强于UGUI的Text,甚至效果方面强国了美术的PS,所以当我们需要使用TextMeshPro制作一些炫酷的字体效果时,免不了使用程序动态修改某些参数,不管是C#还是Lua语言,都可以直接设置TextMeshProUGUI的所有参数。下面直接上代码:修改基础参数:TextMeshProUGUI pro = this.GetComponent<TextMeshProUGUI>();pro.text = "文本";//修改字体属2020-12-03 22:22:07248
0
-
原创 Unity 如何实现一个高效的对象池
前言当我们频繁创建和销毁某个游戏对象的时候,可能对GC是一个很大的开销,这时一般我们都会引入对象池模块。对象池:顾名思义,就是对象的一个缓存池子,可以存取对象,方便对象的回收和复用。避免了大量对象创建和销毁时产生GC。1.对象池v1.0首先我们先来写一个最简单的对象池,针对单个游戏对象的对象池,可以对一个指定的预制体,进行对象实例的创建和回收,对象池子其实就是一个Queue队列,为什么是一个队列呢?主要原因是因为队列Queue和栈Stack的存取效率是最高的,而我偏向使用Queue的原因是因为它是一2020-11-07 20:30:58147
0
-
原创 Unity ILRuntime项目优化的若干建议
前言关于Unity项目的优化点,有很多博客介绍过,我也曾经发过很多,今天呢把一些具体的数据拿出来和大家分享优化测试点测试1foreach 和 for循环的比较测试代码/gcms/1w次foreach循环遍历数组gc:1.0MB30msfor循环遍历数组 i<list.Lengthgc:0B14.05msfor循环遍历数组 length缓存gc:0B7.9ms public static void TestListLoop()2020-09-19 23:19:07406
0
-
原创 Unity 编辑器实现UGUI批量修改RaycastTarget
前言UGUI中创建Image,Text,默认会勾选RaycastTarget,这一点容易被大家所忽略,然而,不管是我们自己测试还是官方建议,其实Raycast会在运行时不停的进行射线检测点击,会产生不小的性能瓶颈。所以建议大家把没用的Image或者Text上面的RaycastTarget勾选掉,所以我们写了一个编辑器工具,可以批量处理UI的RaycastTarget,使用方式如下:实现代码如下:using System.Collections;using System.Collections2020-09-19 22:48:1279
0
-
原创 unity 如何实现一个日志上报系统
前言unity开发游戏,对于日志系统,一般我们都会碰到两个问题?1.发布到手机后,去掉日志打印,节省性能2.部分错误日志,需要上报到服务端。方便后期维护解决方案1.对于问题1,UnityEngine已经给了一个解决方案,代码如下:Debug.unityLogger.logEnabled = false;这样虽然可以关闭日志,但是就全部关闭了,有不方便我们截获异常了。2.对于问题2,一般我们最常截获并上报的就是Error,当然有时也会截获部分Debug日志。这样的话,我们就不能直2020-09-12 18:17:05229
0
-
原创 unity 如何实现AssetBundle资源管理
unity实现AssetBundle资源管理1、最上层是 AssetBundleManager,它提供了一些列的接口,同步和异步的都有。给lua导出的接口不使用泛型。SetAssetBundleResidentLoadAssetAsyncLoadAssetBundleAsyncUnloadAssetBundleUnloadUnusedAssetBundle2、Asset 对应一个资源对象,一个资源加载完毕之后,通过Asset.asset就可以获取到对应的资源。它可以指定是否是引用计数的模式,以2020-09-05 19:09:06186
0
-
原创 Unity 如何使用命令模式
命令模式游戏中,当你想通过一种通用的方式来存储命令并能够撤消命令时,那么命令模式最有用。在“示例”中,你将看到一个可以通过GUI按钮移动的简单点。采取行动后,您可以撤消并重做。我在屏幕上添加了一个简单的OnGUI标签输出,因此您可以看到命令列表,并指出哪个是当前命令。在此示例中使用了4个类:Command-这是任何命令模式都可以继承的基本结构(抽象类)。您可以在任何项目中使用此类。MoveCommand-这是从Command类继承的结构,将使用Execute和UnExecute(撤消)。每个移2020-08-29 18:34:59212
0
-
原创 Unity 包体优化之png拆分为JPG和Alpha Mask
Unity 应用ImageMagicalpng图片占用空间很大,如果没有透明通道,可以转成jpg,从而使包体变得很小。而有透明通道的图片就没有办法改成jpg了。但是,有一个库,叫ImageMagick,可以实现这个操作。原理是把一张png,拆分成两张jpg(一张图片.jpg+一张plphaMask.jpg)。原图284k,拆分后,一张52k,一张38k。基本可以压缩掉200k的大小。下面看下效果:拆分后:该算法在Android和IOS上应用颇为广泛,尤其是国外。我们搞Unity游戏开发的,2020-08-19 16:03:38274
0
-
原创 Unity 如何实现自定义编辑器工具
Unity自定义Inspector界面在开发游戏的过程中,经常碰到需要开发编辑器的功能,Unity商店里面不乏一些非常出色的编辑器工具。当然还有一种开发编辑器工具的工具,比如:Odin,这个工具让开发编辑器变得异常简单,但是里面有大量的Attribute重写,我担心影响Unity编辑器的性能,没敢轻易使用,而且一般的编辑器工具,直接动手就写了,根本也不需要什么插件。今天我把他的源码简单看了一下,实现了它的一个功能,扩展Inspector,期间查阅各种资料,又把Unity自定义编辑器的API给过了一遍,这2020-08-11 18:29:06553
0
-
原创 Unity 如何实现基于UI的画线组件
UGUI画线组件Unity自带有一个LineRender,在3D中使用还挺方便,但是如果要在UI上使用,来回转换坐标系,非常的麻烦。本篇文章就是集成Image组件,然后重写了OnPopulateMesh函数,实现了自定义UI划线组件。代码:using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class LineDrawer : Image{ public List<Vect2020-08-05 10:57:23923
2
-
原创 Unity 如何实现AssetBundle加密
前言随着Unity的普及,越来越多的公司使用Unity来开发手游,Unity的手游市场占有率越来越高。有很多小白和小公司就使用AssetStudio来破解别人的资源来使用。AssetBundle的资源加密,对于我们来说越来越重要。方案1过去,通过官方文档的了解,我们主要可以通过,AssetBundle.LoadFromMemory(Async)的方案来实现资源包加密,官方文档对这个方法是这样描述的:Use this method to create an AssetBundle from an2020-08-03 18:39:14336
0
-
原创 Unity 如何实现动态启动页
前言大家都见过天美的游戏启动页,Tim…,一个自定义的序列帧动画,非常漂亮且流畅,但是显然,Unity本身不具备这个功能。虽然unity2017之后,添加了fade和dolly效果的启动页,但还是无法真正的自定义动态启动页,更别提加入自定义的gif或者帧动画了。那么如何添加真正的序列帧动画呢,那就要使用原生脚本来写启动页了,所以我们需要横跨IOS+Android+Unity,三个不同的领域来实现这一功能。针对这个功能本身,其实对于ios和android原生的开发一点都不难,但是要把这个功能融入unity2020-07-24 20:32:33535
0
-
原创 Unity 如何实现苹果动态模糊遮罩
前言使用过苹果手机的都知道,苹果手机在上banner滑下来的时候,会有一个动态模糊的透明背景,其实就是一个毛玻璃效果,用户可以看到毛玻璃下面的应用或者列表,依然时活动的状态,这就是我说的苹果的动态模糊效果。见下图1.实现原理先说原理,要实现一个动态模糊的遮罩,主要有两个技术难点。1.模糊效果:模糊的效果肯定是使用shader,有一种模糊大家应该都听说过,那就是’'高斯模糊",高斯模糊的算法是一个最长常用的模糊图像算法,因为高斯模糊的效果非常的好。2.动态遮罩:动态遮罩,什么意思呢?就是说,我们有一2020-07-24 19:28:30485
0
-
原创 Unity 如何实现一个通用的新手引导框架
前言在游戏开发中,新手教程是必不可缺的一项功能,一个方便增删改查的教程框架是非常重要的,可以为项目提高很高的效率。一般不同的游戏项目,新手引导也不太一样,比如,在一些复杂的3D游戏中,有关人物的技能,杀怪,副本等等的流程引导,常常会习惯创建一个Base基类,然后针对不同类型的引导,继承一些子引导类,然后配合一些关卡配置表,来实现不同的引导。而一些简单的2D游戏,比如棋牌,卡牌,休闲等游戏,因为大量的引导都是基于UI或者2D平面的,所以使用一套通用的引导代码,加上配置表,可以完成90%的新手引导。我今天2020-07-16 22:35:582182
0
-
原创 Unity 如何实现一个强大的MMO技能系统!
1. 如何实现一个强大的MMO技能系统——序章前言技能系统可以说是游戏中广泛存在而又最重要的系统了,它是整个游戏战斗体验的核心。一套强大的技能系统可以让游戏的策略性,可玩性得到极大的提升。然而技能系统牵涉到的模块非常多,又会面对策划各种各样的奇葩需求,同时技能模块中很多系统的设计不仅仅对程序员的编码能力提出了一定的要求,而且还需要程序员对游戏机制有着深入的理解。可以说要实现一套强力的高可用高扩展的技能系统还是有一定复杂度的。如果作为一个游戏玩家,谈论到技能系统,我们一定会对War3的技能编辑器印象深刻2020-07-09 11:06:161636
0
-
翻译 用一个用户场景来掌握它们
翻译自一篇博文,原文:One user scenario to rule them all异步系列剖析C#中的异步方法扩展C#中的异步方法C#中异步方法的性能特点。用一个用户场景来掌握它们c#中异步方法的几乎所有重要行为都可以基于一个用户场景进行解释:尽可能简单地将现有的同步代码迁移到异步。你应该能在方法的返回类型前面加上async关键字,在方法名最后加上Async后缀,在方法内部加上一些await关键字,就能得到一个功能完整的异步方法。这个“简单”场景以许多不同的方式极大地影响异步方2020-07-04 18:29:38232
0
-
翻译 C#中异步方法的性能特点
翻译自一篇博文,原文:The performance characteristics of async methods in C#异步系列剖析C#中的异步方法扩展C#中的异步方法C#中异步方法的性能特点用一个用户场景来掌握它们在前两篇中,我们介绍了C#中异步方法的内部原理,以及C#编译器提供的可扩展性从而自定义异步方法的行为。今天我们将探讨异步方法的性能特点。正如第一篇所述,编译器进行了大量的转换,使异步编程体验非常类似于同步编程。但要做到这一点,编译器会创建一个状态机实例,将其传递给异2020-07-04 17:36:38200
0
-
翻译 扩展C#中的异步方法
翻译自一篇博文,原文:Extending the async methods in C#异步系列剖析C#中的异步方法扩展C#中的异步方法C#中异步方法的性能特点。用一个用户场景来掌握它们在上一篇中我们讨论了C#编译器是如何转换异步方法的。在这一篇,我们将重点讨论C#编译器为自定义异步方法的行为提供的可扩展性。关于如何控制异步方法机制有3种方法:在System.Runtime.CompilerServices命名空间中提供你自己的async method builder。使用自定义的ta2020-07-04 17:27:16142
0
-
翻译 剖析C#中的异步方法
翻译自一篇博文,原文:Dissecting the async methods in C#异步系列剖析C#中的异步方法扩展C#中的异步方法C#中异步方法的性能特点。用一个用户场景来掌握它们C#这门语言对开发者的生产效率有很大帮助,我很高兴最近的推动让它变得对高性能应用更加合适。举例来说:C# 5引入了“async”方法(async表示异步,也是关键字)。这个特性从用户的角度看是很实用的,因为它能将几个基于Task的操作合并为一个。但是这种抽象是需要代价的。Task是引用类型,每次实例化的时候2020-07-04 17:17:53186
0
-
翻译 Unity 2018中使用Async-Await替代 coroutines
在Unity中使用协程通常是解决某些问题的好方法,但是它也具有某些缺点:协程不能返回值。这鼓励程序员创建巨大的整体协程方法,而不是用许多较小的方法组成它们。存在一些变通办法,例如将Action <>类型的回调参数传递给协程,或在协程完成后强制转换从协程产生的最终未类型化值,但是这些方法使用起来很麻烦并且容易出错。协程使错误处理变得困难。您不能将yield放入try-catch中,因此无法处理异常。另外,当确实发生异常时,堆栈跟踪只会告诉您协程在何处抛出了异常,因此您必须猜测可能从哪个协程中调2020-07-01 18:48:54861
0
-
原创 ILRuntime官方Demo笔记
调用/执行 热更中的方法#调用热更代码中方法,写在AppDomain中,记录一下主要几个方法:AppDomain.LoadAssembly 加载热更dll执行热更代码的方法,有两种方式:appdomain.Invoke(“HotFix_Project.InstanceClass”, “StaticFunTest”, null, null);预先获得IMethod,可以减低每次调用查找方法耗用的时间,代码如下://预先获得IMethod,可以减低每次调用查找方法耗用的时间ITyp2020-06-28 10:09:53174
0
-
原创 最新 XLua 与 ILRuntime 性能对比
现在很多项目都使用xlua来开发整个项目,但是实际上使用的并不是xlua标榜的“热修复”,毕竟国内游戏还是要要求可以热更新新功能的,因此如果采用热修复的方案,则需要小版本使用lua写功能,大版本又要把lua版本转换为C#代码重写一次,不太现实,因此现实中的许多公司都是使用lua来写大部分的逻辑。但是u3d是个C#语言为编程语言的引擎(当然还有JS…),一般lua项目中,我们会把逻辑运算量大,复杂度高,对性能有要求的代码写在C#代码,或者C++ DLL库中,比如加载,更新,框架,战斗等, 这就需要程序要经常2020-06-28 10:02:341534
8
-
原创 ILRuntime入门笔记
基础知识#官方地址:https://github.com/Ourpalm/ILRuntime官方文档:https://ourpalm.github.io/ILRuntime/官方Unity3D热更例子工程:https://github.com/Ourpalm/ILRuntimeU3D/本文中的名词解释:域 : 应用程序的上下文,可以理解为使用热更之后,在游戏中存在两个域,一个是游戏主程序,另一个是热更域。CLR: Unity脚本(C#)的公共运行库,公共运行环境Assembly-CSharp.2020-06-28 10:00:59248
0
-
原创 ET框架和GF框架对比
Unity 框架 GF 和 ET 哪个更好用,各自的优点,缺点是什么?随着Unity的不断发展,现在出现了很多比较牛逼的 开源 框架,其中,我觉得 最厉害的是 Game Framework 和 Egametang 这2个框架都带着ECS的思想,有都用过的朋友,说说,这2个框架 相比较 各自的优点和缺点ET:https://github.com/egametang/ETGameFramework:https://github.com/EllanJiang/UnityGameFrameworkGF框架2020-06-28 09:59:55930
0
-
原创 ET框架-组件模式
在代码复用和组织数据方面,面向对象可能是大家第一反应。面向对象三大特性继承,封装,多态,在一定程度上能解决不少代码复用,数据复用的问题。不过面向对象不是万能的,它也有极大的缺陷:数据组织耦合性及强。一旦父类中增加或删除某个字段,可能要影响到所有子类,影响到所有子类相关的逻辑。这显得非常不灵活,在一套复杂的继承体系中,往父类中改变字段会变得越来越麻烦,比方说ABC是D的子类,某天发现需要增加一个AB都有的数据,但是C没有,那么这个数据肯定不好放到父类中,只能将AB抽象出来一个父类E,E继承于D,AB共2020-06-28 09:57:11295
0
-
原创 ET框架-ECS
一切皆组件目前十分流行ECS设计,主要是守望先锋的成功,引爆了这种技术。守望先锋采用了状态帧这种网络技术,客户端会进行预测,预测不准需要进行回滚,由于组件式的设计,回滚可以只回滚某些组件即可。ECS最重要的设计是逻辑跟数据的完全分离。即EC是纯数据,System实际上就是逻辑,由数据驱动逻辑。数据驱动逻辑是什么意思呢?很简单通过Update检测数据变化,通过事件机制来订阅数据变化,这就是所谓的数据驱动了。其它的特点例如缓存命中,在编写逻辑上来说并不太重要,现代游戏都用脚本,连脚本的性能都能容忍怎么会在乎缓2020-06-28 09:47:08280
0
-
原创 ET框架简介
ET的介绍:ET是一个开源的游戏客户端(基于unity3d)服务端双端框架,服务端是使用C# .net core开发的分布式游戏服务端,其特点是开发效率高,性能强,双端共享逻辑代码,客户端服务端热更机制完善,同时支持可靠udp tcp websocket协议,支持服务端3D recast寻路等等ET的功能:1.可用VS单步调试的分布式服务端,N变1一般来说,分布式服务端要启动很多进程,一旦进程多了,单步调试就变得非常困难,导致服务端开发基本上靠打log来查找问题。平常开发游戏逻辑也得开启一大堆进程,2020-06-28 09:32:00942
0
-
原创 Unity-NGUI插件
一、NGUI – UIRoot (窗口)NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的UIRoot游戏对象的属性只有4个,分别是缩放规则,手动高度,最小高度和最大高度。UIRoot是以2为屏幕宽度的int height = Mathf.Max(2, Screen.height);manualHeight = Screen.height * 1024 / Screen.width; //基于宽度的屏幕分辨率自适应二、NGUI-Lable三、NGUI – UIPane2020-05-10 18:23:45549
0
-
原创 Unity基础-灯光
Unity中有四种类型的灯:点光源从一个位置向四面八方发出光线,就像一盏灯。方向光源(平行光) 被放置在无穷远的地方,影响场景的所有物体,就像太阳聚光灯 灯光从一点发出,只在一个方向按照一个锥形物体的范围照射,就像一辆汽车的车头灯。区域光,也叫烘焙光,是唯一的一个只能用于烘焙的灯光,形状类似于矩形的灯管。Properties 属性Type 类型1.Directional 方向光**灯光放在无穷远处。它影响着在场景里所有物体。2.Point 点光**灯光从它2020-05-10 18:20:59245
0
-
原创 Unity-Dotween插件
补间动画:又叫做中间帧动画,渐变动画,只要建立起始和结束的画面,中间部分由软件自动生成,省去了中间动画制作的复杂过程,这正是Flash的迷人之处,补间动画是Flash中最常用的动画效果。参考链接http://www.robertpenner.com/easing/easing_demo.html##Tween插件比较Dotween是众多Unity补间动画插件中效率最高,使用最方便,使用人数最多的一个。##Dotween方法前缀DO前缀:适用于所有补间快捷方式(可以直接从已知对象开始的操作,.2020-05-10 18:18:44251
0
-
原创 Unity-资源加载(Resources,AssetBundle)
##Resources类使用Resources加载资源,资源一定要放到Resources文件夹下,支持名字和路径加载。1.可以有多个Resources文件夹同时存在。2.Resources下的资源在打包后是加密压缩状态,运行时不可修改。3.加载方法 : Load<类型>(名称或路径),名称不需要加后缀。##示例public class TeachRes : MonoBehaviour { void Start () { //加载预制体,可以有路径2020-05-10 18:16:37362
0
-
原创 Unity-2D物理引擎、铰链、效应器
RigidBody2DBody TypeDynamic/动态:用于主动碰撞型,运动型的刚体Kinematic/运动:相当于3D的刚体勾选了Is Kinematic,用于运动学刚体。Static/静态:用于非主动碰撞,静态的刚体,有无限质量,节省性能。Material:用这个来指定所选的2D碰撞机关联到2D刚体上的常用材料Simulated:选中模拟选项,2D刚体将会与任何附加了2D碰撞机和2D关节发生仿真物理效果,如果禁用,则这些组件不与发生仿真物理效果,下面的更多细节会与该选项关联Use2020-05-10 18:15:05354
0
-
原创 Unity-协程入门
Unity的协程系统是基于C#的一个简单而强大的接口,IEnumerator,它允许你为自己的集合类型编写枚举器。这一点你不必关注太多。倒计时器:这是一个简单的脚本组件,只做了倒计时,并且在到达0的时候log一个信息。using Unity Engine;using System.Collections; public class Countdown : MonoBehaviour{ public float timer = 3; void Update() {2020-05-10 18:13:20131
0
-
原创 Unity2018-粒子系统
了解粒子系统,必须先了解每一个属性都代表了什么,之后才能根据这些原理来调整出自己满意的效果。##主面板ParticleSystem:Duration:粒子发射周期,如图的意思就是在发射3.32秒以后进入下一个粒子发射周期。如果没有勾选looping的话,3.32秒之后粒子会停止发射。Looping:粒子按照周期循环发射。Prewarm:预热系统,比如说我有一个空间大小的粒子系统,但是粒子发射速度有限,我想在最开始的时候让粒子充满空间,此时就应该勾选Prewarm。StartDelay:粒子延时2020-05-10 18:12:18502
0
-
原创 Unity-UGUI之Event System
##Event System新建Canvas话不是,系统自动生成的Event System里面主要有两个Components,分别是Event System和Standalone Input Module。*EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象。###1. EventSystem负责处理输入、射线投射以及发送事件一个场景中只能有一个EventSystem,否则EventSystem会失效###2. BaseInputM2020-05-10 18:09:54195
0
-
原创 Unity基础-UGUI
##Canvas渲染顺序遵循刷油漆规则(画家算法)依次由Render CameraDepth值、Sorting Layer先后顺序、Order in Layer值决定canvas有三种渲染方式1.screen space-overlay :理解为在屏幕上贴一层膜,在一切物体之上2.screen space-camera:附着在camera上3.world space:相当于一...2020-04-29 23:45:18206
0
-
原创 Unity基础-Mecanim动画系统
##Unity3D 动画系统分类1.Unity3D 3.5版本之前是旧的系统Legacy系统2.Unity3D 4.0版本新增加Mecanim动画系统##Mecanim新动画系统Mecanim优点针对人形角色提供了一种特殊的工作流,包含Avatar的创建和对肌肉的调节。动画重定向的能力,可以非常方便地把动画从一个角色模型应用到其他角色模型上。提供了可视化Ani...2020-04-29 23:43:58247
0