Unity
文章平均质量分 75
Unity相关
n5
在信息时代客观障碍已不复存在所谓障碍都是主观上的如果你想研发什么新的技术你不需要几百万美元的资金你只需要在冰箱里放满比萨和可乐再有一台便宜的计算机和与之献身的决心你即可拥有任何你想拥有的编程境界- John Carmack
展开
-
Unity InputSystem基础
已知问题:当屏幕上有多个on screen control时,将某一个control deactive会导致其他control状态混乱。如果选择了Auto-Swtich,则会自动切换当前的Scheme。然后可以在这个事件里面获取当前的Scheme,然后做一些有用的操作。在Editor模式运行时,会显示当前的User(从0开始),Control Scheme和Devices,比较方便观察设备切换。使用这个组件可以快速开发,只要设定所使用的InputActionAsset,并且绑定事件代码即可。原创 2023-01-05 12:39:23 · 774 阅读 · 0 评论 -
Unity联网多人游戏技术方案调研
以上方案/插件都是可以高度集成到Unity中,都是直接使用Unity C# API写逻辑的。现在有一些开源的或者自研的服务端方案,比如使用Go,Lua, C++, Rust, Java等开发的服务器,这种基本都是独立服务器DGS,服务器端就不能使用Unity的API写逻辑了,比如物理计算和寻路等,都要是有其他方案,脱离了Unity引擎,而客户端就要使用底层的网络代码,重新封装到游戏逻辑层。UNet是早期的方案,也被称为HLAPI (High Level API),提供了一系列高层组件进行快速的联网开发。原创 2023-01-05 12:18:44 · 1986 阅读 · 0 评论 -
Unity无缝大世界实现调研
无缝大世界的技术要求。世界足够大,一个地图就完整包含一个非常大的世界,如魔兽世界的整块卡利姆多大陆。面积从几平方公里到数十乃至上百平方公里。包含室外地形,城镇,也包含一定量的室内场景。室外地形包含各种地表,植被,河流,道路,山峰山谷,天空,云雾,光线。城镇场景包含大量的建筑和装饰物。室内场景也可能非常庞大,包含多个层次。原创 2023-01-05 12:10:03 · 2436 阅读 · 0 评论 -
Unity自定义Timeline总结
自定义Timeline一定是为了满足某种需求,需要在Timeline编辑器上,编辑特定的Clip,以及对于Track绑定特定的对象。而Timeline中的clip在运行时都是Playable对象,这是Playable API中中的节点。在中,通常有Playable节点和两类节点。而Mixer节点其实也是一种特殊的Playable节点,比如。而我们自定义的Playable节点都是类型的节点。是一个泛型结构体,其泛型类型是实现接口的类。Unity提供了一个抽象类实现了。原创 2022-11-11 19:49:45 · 2358 阅读 · 0 评论 -
[Unity] 关于Unity Mirror的一点体会
Mirror可以在单机游戏中使用,用于将单机游戏改造成联网游戏,但是并不适合通常的CS模式的网络游戏。其他需要预测校正啊这种的都没有直接使用的方法,说白了除了位置同步这种有一些处理,其他的同步都只是直接发消息同步。说明用的人确实不多。我半个月在实际项目中初步使用,都发现很多地方都是需要自定义的,虽然暂时还不需要修改Mirror源码,但是至少所谓的高级功能都用到了。首先,Mirror这种HLAPI的网络库,是在一个工程中同时写服务器和客户端代码,这就造成两个问题。原创 2022-11-07 16:42:55 · 1568 阅读 · 1 评论 -
[Unity] IL2CPP编译VTable错误
原因是,项目使用了一个插件需要为AOT编译生成DLL,这个DLL里面包含了引用到的类型的stub 代码,这是为了防止这些类型被strip掉。但是由于代码重构,这个DLL中存在的一些stub类型对应的C#类型已经不存在了,但是由于DLL没有更新,导致IL2CPP处理VTable时找不到对象了。重新生成DLL就好了。这种错误会随机出现在不同的DLL上。大意是IL2CPP处理VTable时找不到一些object的引用。原创 2022-11-04 20:06:15 · 747 阅读 · 0 评论 -
Unity URP 中 GPU Instancing的使用
GPU Instacing开启的条件首先Shader必须兼容与Instancing。材质开启 Enable GPU InstancingSRP Batcher的优先级高于GPU Instancing,对于Game Objects,如果SRP Batcher能被使用(Shader兼容SRP Batcher,节点本身也兼容等),则就会使用SRP Batcher,即便材质开启了Enable GPU Instancing也没用。如果SPR Batcher的条件被破坏,例如使用了MaterialProper原创 2022-05-19 13:51:30 · 5254 阅读 · 1 评论 -
Unity内置管线Projector原理分析
Unity 内置管线的Projector功能Unity内置管理的Projector功能还是比较简单的。首先给投影体加一个 Projector组件:这个Projector定义了一个视锥体,可以是透视投影也可以是平行投影。场景中和这个视锥体相交的物体会绘制投影纹理。所以总的效果就是投影体镜头上的贴图(材质)被绘制在场景物体中,例如上图的两个Plane和一个Cube。投影纹理的原理这儿使用的技术叫做 Projective Texture Mapping,使用这个关键词可以搜索到一篇论文。基本原理是对于原创 2022-04-01 19:38:46 · 7144 阅读 · 0 评论 -
基于Unity的软光栅实现(2):CPU单线程软光栅
文章目录CPURasterizer渲染数据: CPURenderObjectData输入数据中间输出数据缓冲区缓冲区定义清除缓冲区视锥剔除顶点变换图元集成ClippingBackface cullingViewport transform光栅化三角形透视校正插值片段着色MSAA输出到贴图CPURasterizer本篇介绍基于CPU单线程的软光栅渲染器 CPURasterizer。包括数据准备,缓冲区构建,顶点变换,图元集成,光栅化和片段着色,MSAA等内容,基本就是一个完整的光栅化流水线了。渲染数据:原创 2022-03-23 16:00:53 · 2791 阅读 · 0 评论 -
基于Unity的软光栅实现(1):框架搭建和矩阵构造
提纲基于CPU的光栅化实现约定矩阵和变换左手系数据转右手系使用Compute Shader的GPU Driven光栅化实现原创 2022-03-23 00:08:58 · 3002 阅读 · 1 评论 -
[Unity] 关于UnityEngine.Object的fake null
看一段代码:Object a = new Object();Debug.Log(a);var b = a;Debug.Log(b);DestroyImmediate(a);Debug.Log(b);输出为三个null当然一开始a 和 b 不应该是null。这儿输出为null只是因为它们指向的object的ToString()返回"null"而已。同样如果使用 == 或 != 去比较 a,也会得到a指向null的假象。在Unity的逻辑中,这个没啥用的空Object就是null。然后把上原创 2021-12-14 21:26:55 · 2858 阅读 · 0 评论 -
[Unity] DontDestroyOnLoad后GameObject重复创建的问题解决
问题场景假设在 Scene A中包含一个GameObject S,在其某个MonoBehaviour脚本中,执行了如下方法:private void Awake(){ s_instance = this; GameObject.DontDestroyOnLoad(gameObject); }这样,当Scene A载入时,GameObject S在Awake之后将被放入一个名字为DontDestroyOnLoad的自动创建的S原创 2021-09-18 11:36:50 · 1381 阅读 · 0 评论 -
[Unity] 编辑器脚本中在主线程执行方法
问题来源最近在做一个Unity打包工具,使用Process开启新进程调用外部工具执行,结束后使用Exited继续流程。大概流程如下: Process pc = new Process(); //创建一个进程 pc.StartInfo.FileName = "tool.exe"; //进程名 pc.StartInfo.UseShellExecute = false; //是否使用操原创 2021-09-11 14:29:05 · 839 阅读 · 0 评论 -
Unity Prefab中MonoBehaviour脚本修改带来的序列化问题
项目中出现的问题载入一个prefab并实例化后,获取该prefab上挂载的一个MonoBehaviour组件,例如:public class Foo: MonoBehaviour{ public bool newValue = true; void Awake(){ Debug.Log(newValue); }}此时,Awake中的Log输出的是 false。分析原因Foo组件中的newValue默认为true,但是Awake时为false。这说明序列化出了问题。但是打开该pr原创 2021-02-08 15:15:11 · 1118 阅读 · 1 评论 -
Unity 编辑器中修改属性值及时查看效果
需求项目中有个需求是开发一个UI适配的脚本,根据游戏运行的平台显示不同类型的UI。根据需求,游戏在运行时自动适配就可以了。但是为了方便在编辑器中查看效果,需要可以在Inspector面板中修改属性值后直接在编辑器上执行相应的适配代码,显示效果。解决方案为了在Inspector面板中修改值,我们使用一个enum属性即可,这样对应在面板上就是一个下拉列表。注意这个属性在游戏运行时是根据所在的平台动态设置的,其实并不需要public出来,也不需要序列化。但是为了能在Inspector面板中临时修改并查看效果原创 2020-12-02 11:04:29 · 4072 阅读 · 0 评论 -
Unity input system on-screen button crash
最近在项目中遇到一个unity input system内部的crash。大概会有类似以下报错:Assertion failedUnityEngine.InputSystem.LowLevel.<>c__DisplayClass7_0:<set_onUpdate>b__0(NativeInputUpdateType, NativeInputEventBuffer*)UnityEngineInternal.Input.NativeInputSystem:NotifyUpdate(原创 2020-11-14 14:50:24 · 1159 阅读 · 1 评论 -
Unity .NET 4.x 相关知识
历史在Unity 2017.1之前,Unity使用的是一个相当于.NET 3.5的runtime,多年未更新。Unity 2017.1中,Unity引入了一个实验性的runtime版本,升级到.NET 4.6, 兼容C# 6。Unity 2018.1中,.NET 4.x不再是实验性的了,同时老的.NET 3.5 runtime被标记为legacy。Unity 2018.3中,.NET 4.x runtime被设置为默认。同时支持了C# 7。现状Unity 2019中已经不能再切换到老的.NE原创 2020-09-08 19:54:43 · 4063 阅读 · 5 评论 -
Unity Draw call batching小结
文章目录DrawCalls 和 Batchesdraw call就是你知道的那个draw calldraw call不一定意味着状态切换静态batching静态batching更费内存静态batching不限制物体顶点数且更有效率静态batching的优化选项静态batching的缓存区限制动态batching针对Mesh的动态batching模型顶点属性限制物体包含镜像的变换不能被动态batching材质实例不同则不能合并关于使用lightmap的物体的动态合并多Pass的shader会破坏合并动态bat原创 2020-08-31 00:25:26 · 920 阅读 · 0 评论 -
Unity Cg/HLSL Shader中向量和矩阵的构造方式
目录向量的构造向量使用同类型的构造器构造CG(不是所有的HLSL版本)单值构造向量使用低维向量构造高维向量CG(不是所有的HLSL版本)高维向量转换到低维向量矩阵的构造使用数值构造float3x3可以从三个向量构造从float4x4截取出float3x3参考资料向量的构造向量使用同类型的构造器构造float2 a = float2(1.0, 2.0);float3 b = float3(-1.0, 0.0, 0.0);float4 c = float4(0.0, 0.0, 0.0, 1.0);原创 2020-05-13 19:06:42 · 2598 阅读 · 0 评论 -
{Unity} c#和iOS Objective-C交互
Unity编写iOS native的Plugin, 接入一些sdk什么的,需要和OC进行交互。下面已我写的ios支付插件为例,总结一下。1)c#调用OC代码首先需要在c#中声明OC的函数:#if UNITY_IOS && !UNITY_EDITOR [DllImport ("__Internal")] private static...原创 2016-01-15 17:54:24 · 13837 阅读 · 4 评论 -
{Unity} Vector2输出log的坑
比如有一个Vector2 vec_test; Debug.Log(vec_test); 输出内容为 (0.7,0.8), 实际内容为x=0.66,y=0.81, 单独log出x和y都是对的,但整体Log出来的就是四舍五入的。 并且下断点在debugger里面看,vec_test的总体内容是(0.7,0.8),但展开后里面的值是x=0.66,y=0.81 坑!原创 2015-11-28 12:59:20 · 3201 阅读 · 2 评论 -
{Unity} iOS 9 字体的坑
我们使用的是unity 4.6.7p2,ios9上有些汉字显示不出来了,主要问题是:我们使用的自定义字体优化过度缺了很多字,在ios9之前缺少的字可以从系统字体取得并由Unity渲染出来,但ios9上则不行(具体原因不知道)。更糟糕的是美术在一些地方使用了Arial字体,这个字体据说在iOS9上已经不存在了,所以使用这个字体的地方很多问号。 解决方法是升级Unity到4.6.8p2之上。这个版本U原创 2015-11-28 13:02:11 · 4288 阅读 · 2 评论 -
{Unity} Unity2D camera size和分辨率
2d camera, unit坐标,单位换算2d游戏可以使用平行投影的camera,这种camera需要设置size (orthographicSize),size的含义为屏幕高度的一半,不过单位不是像素而是unit坐标,即通过pixels to units换算的坐标。例如:屏幕高度为640,pixels to units为100的情况下,orthographic size为640/2/100 =原创 2015-11-28 13:01:00 · 34832 阅读 · 0 评论 -
{Unity} 平台预定义
官方文档:http://docs.unity3d.com/Manual/PlatformDependentCompilation.html基本用法:#if UNITY_STANDALONE || UNITY_WEBPLAYER || UNITY_EDITOR || UNITY_WEBGL#elif UNITY_IOS || UNITY_ANDROID || UNITY_WP8 || UNITY_I原创 2016-01-08 14:16:03 · 3301 阅读 · 0 评论 -
{Unity} WebGL版本不能使用反射机制以及解决方法
我们的项目导出WebGL后运行不了,因为我们使用了System.Reflection.Assembly.GetExecutingAssembly().CreateInstance 来根据类名创建对象。解决方法是创建一个工厂类,根据类名调用不同的代码new对象。而然这样很麻烦,并且每次都需要修改这个工厂。我想了一个方法就是使用一个编辑器脚本自动生成工厂类,思路是利用反射机制获取一个assembly内原创 2016-01-08 14:20:43 · 6195 阅读 · 3 评论 -
{Unity} 单色Sprite Shader
项目中有一个需求,没获得的物品使用剪影的方式表现,如果美术去做的话需要把每个物品的图存成一张单色的剪影图。为了减少美术工作量,我写一个简单的shader来实现。基本是在Unity官方shader的基础上改的,非常简单,只是把最终的颜色改成了单色。唯一要注意的是虽然是给sprite用的shader,但是要放到UI中,所以要参考UI shader的写法,特别是要加入stencil相关的参数,否原创 2016-01-08 14:13:29 · 5599 阅读 · 4 评论 -
{Unity} Renderer SortingOrder的取值范围
SortingOrder是个int,但取值范围却是另有规定。官方文档: “Note that the value is -32768 to 32767.” 如果超出这个范围,sprite有可能不显示。原创 2015-12-26 14:03:15 · 6444 阅读 · 0 评论 -
{Unity} 2D游戏,Canvas转世界坐标
需求是在UI上放一个panel (Image), 利用Unity UGUI的自动layout机制,根据屏幕拉伸此panel, 取得此panel的尺寸,转换到世界坐标的尺寸,作为游戏区域。下面的代码中,GameArea是这个panel的RectTransform组件, 通过RectTransform的rect.size可获取panel的尺寸,这个尺寸是在canvas坐标系中的。而我们想获取世界坐标系原创 2015-12-26 14:04:30 · 5927 阅读 · 1 评论 -
{Unity} Shader初步
官方文档:http://docs.unity3d.com/Manual/ShadersOverview.htmlUnity支持三种shader: 1) Surface Shaders: 主要处理光照和阴影,利用了Unity的光照流水线,是一种较高层次的抽象。如果不使用光照则不要使用这种shader,因为会有不必要的性能消耗。使用Cg/HLSL编写shader代码,但最终的shader是需要编译生成原创 2015-12-26 14:09:29 · 4107 阅读 · 0 评论 -
{Unity} 停止播放PlayClipAtPoint播放产生的OneShotAudio音效的方法
Unity中可以使用 AudioSource.PlayClipAtPoint 方便的播放一个音效。但是AudioSource并没有提供一个静态方法去停止这个音效。正常情况确实是不需要停止的,但是有时这个音效会比较长,且符合某个条件时需要停止他,那怎么办呢?我想了一个work around,基本思路是:PlayClipAtPoint会产生一个GameObject,名字是“One shot aud原创 2016-02-04 17:04:08 · 8054 阅读 · 1 评论 -
{Unity} C#和Android Java交互
之前写过C#和iOS Obj-C交互的方法,和Android交互也一样简单,主要是Unity提供了非常方便的辅助类,基本不需要和JNI打交道了。1) C#调用java方法使用AndroidJavaClass和 AndroidJavaObject可以很方便的调用java方法。最常用的是AndroidJavaObject的Call方法,文档:http://docs.unity3d.com/Sc原创 2016-02-20 19:01:57 · 10638 阅读 · 1 评论 -
[c#] LitJson使用中的一些问题
[c#] LitJson使用中的一些问题使用C#做Untiy开发时,有解析Json的需求,选择使用了LitJson这个库,因为之前我们是使用lua的,这个库会将Json解析后保存为JsonData,这个JsonData和lua的table使用上有点类似,但有些问题要注意。取值时要先检测key是否存在 lua的table可以使用 some_table.key或 some_table[‘key’]原创 2015-04-13 18:24:42 · 14082 阅读 · 6 评论