- 博客(57)
- 资源 (2)
- 收藏
- 关注
原创 Unity LayerMask避坑笔记
而LayerMask.GetMask(第五句输出)获取到的值也是枚举的实际值,注意LayerMask.GetMask的传参的不定长的字符串数组,获取到的是传入的字符串转换成LyaerMask后做“和”运算的结果。物理引擎中,Layer检测一般是检测很多种类的,所以应该用实际值。可以看到,对我们定义的LayerMask类型,无论是强转还是直接取值(前两句输出),获取到的值是枚举的实际值,是1<<6的结果, 而直接获取对象的Layer和通过LayerMask.NameToLayer。
2024-05-24 18:07:26
508
原创 Unity2D正交相机Camera.size的含义和计算方式,及自适应分辨率的实现
可以看到,比例是对的,但是SpriteRenderer大小超过了相机的框,这样的话,在Game视图就看不到全部的SpriteRenderer内容了,而如果想要相机看到完整的SpriteRenderer,即SpriteRenderer完全填充在相机的框内,就需要调整的相机的Size值,那么以什么标准去调整呢?以上面为例,垂直方向上,我们期望看到完整的SpriteRenderer,而SpriteRenderer垂直方向为“10.8”个单位,那么Camera.size = 10.8 / 2 = 5.4。
2024-05-16 16:50:07
1643
原创 Unity Pixels Per Unit 与 Sprite Renderer Scale的逻辑关系,为什么平铺的Sprite Renderer会变形?
而出现这样的情况,是因为导入图片的分辨率Pixel与PPU设置值不匹配而导致的,根据上面的逻辑,我们可以知道,width设置为20,表示水平占据 20个 “单位”,根据上面我们算的结果,这个图片水平方向的 “单位”值是0.92,不能整除 “20”单位,所以显示的结果一定是经过缩放的,但是垂直方向没有进行缩放,所以看起来才会变形,如果我们把height也修改为20,那么水平垂直同比缩放,就不会有变形的问题了,但是那样的结果只能是正方形,不符合我们的预期。答案当然是否定的,但是上面的结果又如何解释呢?
2024-05-14 15:09:33
1303
1
原创 C#判断字符是否为utf16编码
unity截取显示微信昵称后,出现异常Error: UTF-16 to UTF-8 conversion failed because the input string is invalid,原因是截取字符串刚好截到了表情后面,解决思路是从截取到的索引向前遍历,找第一个不是utf16编码的字符,然后显示。
2023-09-05 15:18:21
672
原创 huatuo(hybridclr)热更新踩坑笔记
测试3:依然把热更框架单独生成asmdef,但是不放在热更asmdef列表,而是放在Assembly-CSharp文件夹,然后其他热更资源再对其进行引用,此时因为热更框架本身就在Assembly-CSharp文件夹,所以主工程不需要再设置成asmdef,可以直接使用,结果成功!但实际情况是,A作为最先启动的热更Asmdef,加载代码是写在主项目里的,没办法热更代码,此时可以换一种方式,通过反射加载,代码示例如下,其中新加脚本HotUpdate3_1为B的asmdef中的另一个类,也可以加载到。
2023-08-02 13:58:48
1372
原创 Unity优化材质,清除空引用贴图
美术创建材质的时候如果没有选择shader,那么创建的是默认shader材质,文本编辑器打开材质文件(.mat),会发现有很多没有默认的texture,如下图,此时美术切换材质到目标shader,虽然编辑器里面的inspector会变化,但是查看材质文件(.mat),发现那些贴图的定义还是在,这种情况下会被uwa检测为 “包含空纹理采样的材质”。如果在创建材质时选中shader,则没有这个问题。注:该问题不清楚unity打包时是否会自动清除,因为没法检测。
2023-04-04 11:45:21
637
原创 Unity导出Fbx文件的动画片段并优化
导出Fbx的动画片段,这里导出单个动画片段,需要导出多个的,使用AssetDataBase.LoadAllAssetsAtPath,然后对asset进行遍历,判断是否为动画片段,再进行下一步操作。代码中包含项目中使用的非关键代码,并不影响查看。对生成的动画片段进行压缩优化,AnimationOptimize.OptionalFloatCurves逻辑实现如下,注释比较完整。
2023-03-28 16:39:50
1135
原创 UGUI 摇杆
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;/// <summary>/// 基于UGUI的摇杆/// </summary>public class JoystickUGUI : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHand.
2022-05-19 15:03:16
152
原创 Unity2020.3.23 + Visual Studio2022生成项目时不生成dll文件
用这两个版本结合开发ILRuntime时,发现生成Hotfix工程一直失败,原因是找不到model工程的dll文件,搜索了半天没有解决,各种换.Net版本也无效,新建空项目也是没有dll生成,不清楚到底是怎么回事。再另一台机器上用Unity2020.3.23 + Visual Studio2017创建并打开项目,就可以生成 dll文件。然后下载Visual Studio2017测试,确实没问题。没办法只好更换版本了。其他版本不知道什么情况,可能新版本需要设置什么地方我不清楚,但是因为这个再耽误开发感觉划不来
2021-12-29 14:42:10
3082
5
原创 Unity 禁止Inspector视图编辑
没有找到有该功能的宏,曲线实现一下,主要应用在某些不想让手动编辑的Asset。#if UNITY_EDITOR[CustomEditor(typeof(******))]public class ******Editor : Editor{ public override void OnInspectorGUI() { GUI.enabled = false; base.OnInspectorGUI(); }}#end...
2021-12-28 17:04:12
2380
原创 c# 反射修改父类的私有变量
Unity写工具的时候碰到的问题,要自动给预制体添加组件并赋值,但是组件有一个变量是私有的,无法修改,而且因为组件脚本是在Package里面,所以无法修改,如果把组件源码放到项目中的话修改使用的话又不利于组件更新,所以想到了用反射去修改私有变量并赋值。 如果一个类没有继承关系,修改时获取字段并修改即可,代码如下。 var t = gameObject.GetComPonent<T>(); t.interactionLayer...
2021-12-15 18:41:49
2242
原创 List.Sort异常笔记
list随机排序一直用的重写比较器,然后random返回数据排的。没想到会有这个问题,之前运行时报错:Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields differe...
2021-12-07 11:55:24
1718
原创 UGUI InputField 无法唤起键盘
unity2018.4.18版本存在的bug,在unity2020.3.21版本已修复,具体开始修复的版本未知。bug表现为在点击InputField输入后,点击输入法键盘上的“完成/确定”等字样隐藏键盘(以下称正常方式),可再次点击InputField唤起输入法,不点击输入法键盘上的“完成/确定”等字样,直接点击屏幕上输入法键盘外位置(以下称异常方式),会自动隐藏输入法键盘,此时点击同一个InputField,会无法唤起输入法键盘,无法输入。此时再次点击InputField外其他位置,接着...
2021-10-28 15:14:25
2634
原创 qq互联ios sdk导入后编译报错Redefinition of ***
报错脚本是sdk 的TencentOAuth.h脚本,各种百度谷歌找不到答案,结果客服回复是需要修改sdk的文件。修改sdk目录下的module.modulemap文件,修改成以下内容:framework module TencentOpenAPI { header "QQApiInterface.h" header "QQApiInterfaceObject.h" header "TencentOAuth.h" header "TencentOpenApiUmbrel...
2021-10-18 16:05:54
2211
3
原创 unity打包报错,又是血压升高的一天
unity打包遇到的报错,部分在androidstudio里同样方式解决首先说一个还没搞明白的问题。项目之前打包一直使用的Internal模式,一直没有问题,在没动过所有与sdk有关的文件(包括架包,清单文件等)的情况下,突然打包输出了问题1的错误。意思是清单文件配置了这个占位符,需要在gradle里提供占位符对应的值。比较奇怪的是,之前一直用的Interneal模式打包,没有使用自定义gradle文件,理论上是必不可能打出来包的,但是之前确确实实没问题,实在不清楚为什么会突然这样,猜想唯一...
2021-08-10 17:45:55
1269
原创 Unity WebCameraTexture笔记
记录下代码,其中很多问题没弄清楚,只是可以这样使用。using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class Main : MonoBehaviour{ public int index; public RawImage targetImg; public WebCamTexture current
2021-06-22 15:39:12
455
原创 xlua使用unity协程笔记
记录一下,代码及注释如下,具体使用还需加工,需要单独写类去管理local util = require 'xlua.util' --xlua封装好的工具类,路径xlua/Resources/xlua/util.lua.txtlocal go = CS.UnityEngine.GameObject("corGo") --创建对象,不需要new关键字local coroutineCom = go:AddComponent(typeof(CS.CoroutineMine)) --空脚本,无逻辑代码,只
2021-05-11 17:51:44
626
原创 二进制在数据存储上的应用
分享一个二进制的应用。应用场景举例,在游戏中,存在一些非固定顺序的新手引导,需要存储玩家引导的数据,各个引导是否执行过,依次来判断是否触发。比如有十个步骤,我们可以通过使用键值对来存储这些引导的状态,key为引导id,value为引导状态,修改的时候直接去赋值即可。今天分享另一种更为高效,节能的存储方式。代码及运行结果如下:class Program { static Dictionary<string, int> datas = new Dictionary&
2021-03-01 15:34:25
248
原创 监听Unity编辑器事件,修改Unity编辑器标题
下午看到有这样需求,然后想到前些天做的去除窗口标题,应该是类似的效果,就去试了下。使用场景,接手别人的项目时,需要同时开两个或多个项目进行运行对比,由于项目名一样,编辑器版本一样,无法区分,所以需要修改编辑器窗口标题依次来区分。最初想到的是直接在editor模式下修改标题即可,结果发现,当编辑器切换到运行以及编辑器切换到结束状态时,标题都会重置。所以需要监听状态,修改标题,可以用EditorApplication.playModeStateChanged监听编辑器的状态改变。代码如下,两个脚本,一个
2021-02-04 18:21:54
1024
原创 Amplify Shader Editor 案例解析系列——(6)HologramSimple
前言该篇分析第六个案例,HologramSimple。后面会发现,很多知识都是之前案例中用过的,所以相关方面不再进行分析。正文按照Comment的顺序分析,首先观察效果,为方便观察效果,这里新建球体赋予材质,因为案例中的效果,不单单是这个shader的效果,还与模型有关,模型分三个材质渲染三层网格,最外层的材质是本文要分析的shader,修改透明度为1,加深效果,由于shader中常量值设置问题,这里有两张效果图,方便观察,第二张图是对第一张图的球缩放10倍的效果,后面会分析为什么要这样做:
2021-01-25 18:23:06
538
2
原创 Amplify Shader Editor 案例解析系列——(5)HighlightAnimated
前言该篇分析第五个案例,HighlightAnimated。正文按照Comment的顺序分析,首先观察效果,为方便对比,关闭了中间球的效果:发现有以下效果:1.对象表面有高亮,即外发光,但是同一个表面上,高亮程度不同2.对象表面的高亮,有闪烁效果,该效果需要材质参数,默认参数效果不明显分析Comment:1.Textures Comment注册各个贴图,以及贴图与颜色的混合,不做赘述2.Highlight Level (Ping pong animation) .
2021-01-15 18:03:19
575
原创 Amplify Shader Editor 案例解析系列——(4)ForceShield
前言该篇分析第四个案例,ForceShield。正文由于该案例中shader使用了大量的局部变量,按照效果分析时,会有变量还“未定义”,不知道其含义的情况存在,从而导致过于杂乱,所以这个案例我们按照comment从左上顺序开始分析,分析各个变量的输出意义。不过首先我们看一下该案例的效果。发现效果有以下几处:1.球体表面在不规则的像水波纹一样在浮动2.球体表面的六边形在缓缓像下平移3.球体与立方体相交的位置,显示不同,如被切开4.图2中,被子弹击中的位置,呈现白色.
2021-01-15 12:30:30
1388
原创 Amplify Shader Editor 案例解析系列——(3)EnvironmentGradient
前言该篇分析第三个案例,EnvironmentGradient。正文首先观察效果发现效果有以下几点(不考虑法线贴图,无影响) :1.相同的海拔,地面平缓度不同,颜色不同,越陡峭的地方,颜色越冷;2.不同的海拔,地面平缓度相同,颜色不同,海拔越高,颜色越冷;3.修改shader后可预览,无法言传...只是一个纹理合并的效果,使效果更加真实;然后对效果进行一一解析:1.区分平缓度,使用的是世界空间下的物体的法线,然后对其进行处理,输入到lerp 的alpha,对颜色.
2021-01-12 14:36:09
535
原创 Amplify Shader Editor 案例解析系列——(2)DissolveBurn
前言该篇分析第二个案例,DissolveBurn。正文这里我们同样拿cube去分析效果,没必要使用原模型,原理是一样的,首先复制案例中的shader,创建新的材质,赋予给一个cube,修改Dissolve Amount值,可以看到消融效果,分别展示Dissolve Amount 为0,0.5时的效果发现效果有以下几处(不考虑模型纹理贴图与法线贴图,与效果无影响):1.cube内部也可以渲染出来2.cube表面有透明区域,并不是完全铺满的,修改Dissolve Amount值也可.
2021-01-12 14:35:55
693
2
原创 Amplify Shader Editor 案例解析系列——(1)2Sided
前言该系列文章对ase官方案例进行流程分析,旨在记录自己的理解,如有错误之处恳请指出。尽量保持持续更新。使用插件版本为1.64,下载地址https://download.csdn.net/download/a598211757/13985994,该篇分析第一个案例,2sided。正文这里对cube的效果进行分析,首先看从不同角度看向目标的效果图: 发现效...
2021-01-12 14:35:42
909
原创 c# Environment.GetCommandLineArgs
官方释义:返回包含当前进程的命令行参数的字符串数组最开始接触这个api是unity自动打包时读取传入参数的,但是当时一直不清楚这个参数是通过什么样的形式去传递的,直到今天写批处理时才明白是怎么回事。首先这个参数获取到的值默认有一个,即该进程的文件名(“***.exe”),然后其他参数参数才是命令行传入的参数,传入方式为在命令行执行程序,后接参数。测试一下,首先写一个c#控制台程序,做简单的输出,代码如下: static void Main(string[] args)
2020-11-04 16:43:58
3132
原创 程序的魅力,自动化执行应用程序进行批处理操作
再次感叹下程序的魅力,节省了太多的成本。开发中需要用到Criware插件cpk类型的视频文件,没有cpk文件,只能找工具进行转化,墙了好久才找到一款工具,但是奈何工具只能单个单个文件的操作,而且需要手动命名,八百个文件,不谈时间,耐心也不够用,所以想到写批处理执行应用程序来实现自动化解决问题。由于没有操作过其他程序,所以这里只拿这个举例......可能不尽相同那么面临的第一个问题就是程序里面用到的参数,怎么去赋值传递。首先看一下该程序的目录文件以及界面:其中有两个exe应用程序文件,
2020-11-04 16:06:48
844
原创 Unity Ugui快速定位选中UI组件
项目开发到后期之后,考虑性能优化,Ugui需要创建多个Canvas渲染不同的界面,然后会导致想要在scnec视图选中某个组件时,点击许多次都无法正确选中目标对象,给调试带来不便,这里使用EventSystem实现快速选中的效果。代码注释如下using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;using UnityEngine.UI;using UnityE
2020-10-16 17:33:19
1859
1
原创 MemorySystem笔记
属性,函数见https://docs.microsoft.com/zh-cn/dotnet/api/system.io.memorystream?view=net-5.0using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;using System.Runtime.Serialization;
2020-06-14 16:16:22
416
原创 记一次unity3d 游戏帧率踩坑的过程
优化方面,除了平时顺手做的代码方面优化,对象池以外,基本上没怎么去关注过,所以这一方面蛮白痴的。今天发现游戏帧率从一开始的100左右,会随着运行时间逐渐降低,甚至降到个位数,所以只能去查阅这方面的资料进行优化了。文章没有一点干货....没有具体的优化方法(因为我也不知道.....),旨在记录一次分析过程,以便后续碰到类似问题时不会无从下手。首先使用的分析工具是unity的framedebugger,去对边前后drawcall的数量,发现即使已经勾选了动态批处理,但是场景中的同一种对象,竟然每个是一个
2020-05-29 01:38:16
5792
原创 Unity移动过快导致射线检测失效的原因及处理方式
直入正题,检测失效的原因如图,设此时子弹,射线,碰撞体属性都如图所示,这里射线从子弹的坐标位置发出,发出位置可以通过修改预设或者增加偏移量的方式进行修改。可以看到,第一帧进行射线检测时,子弹距离碰撞体太远(或者说射线长度不够)导致并没有检测到碰撞,结果第二帧时,子弹已经飞过了碰撞体,此时再次进行射线检测,当然也不会检测到,如此就导致了射线检测失效。怎么去解决这个问题,很简单,增加射线的长度即可,但是增加多少呢?假如这里把射线长度增加到2000,那么第一帧必然能检测到碰撞体,但是如果像下面这种情况
2020-05-23 17:09:40
2213
原创 FairyGui 代码给组件赋值控制器
以显示控制器为例,代码如下//GearXXX对象是控制器和属性之间的连接。0-显示控制,1-位置控制,2-大小控制,// 3-外观控制,4-颜色控制,5-动画控制,6-文字控制,7-图标控制GearDisplay gear = (GearDisplay)yourGobject.GetGear(0);gear.controller = yourController;gear.pages...
2020-04-16 14:23:50
1084
原创 使用build.gradle 配置签名信息与多渠道打包参数配置笔记
最近看一个热更的demo,看到了多渠道配置,比较感兴趣,记录一下,备用。使用的是flavorDimensions(风味维度???),首先在build.gradle 的android{}闭包里面定义一个flavorDimensions,这里我取名“channel”。然后同样在android{}闭包里面定义并配置productFlavors。这里配置了包名与androidmanifest 的met...
2020-03-18 15:21:14
680
原创 Lua实现另类计算器
Lua的使用现在基本上属于游戏行业的必备技能了,由于项目中没有使用,所以看过几次教程,实验过几次,一直没有系统的写点东西,导致看完过了多久就忘了。这两天又看了遍,准备着手随便做点什么,熟悉下,做什么呢,当时是做计算器啊~以前用c#做过另类计算器,思路上基本是一样的,即把没有括号的式子的数字和符号分割,然后遍历符号计算结果,计算之后替换原式子,把括号消完就好了,具体描述见另一篇文章https:/...
2019-08-29 16:54:29
1128
原创 热更新之Assetbundle——加载
加载的类型有很多种,比如预设,图集,字体,shader,但是项目用中用到的只有预设和图集这两个,其实这两个完全可以写在一个方法里面,但是一开始就分开写了,所以就写了两个方法。我这里选择把加载过的bundle存入一个字典,下次需要加载的时候去直接获取(其实一个字典就足够了)。加载的步骤是先根据传入的bundle名字,通过主配置文件manifest去获取该bundle的依赖,然后把加载这些依赖之后,再...
2019-07-09 14:29:55
324
原创 热更新之Assetbundle——下载
Assetbundle的下载这一块,是耗时最久的,也是最复杂的。步骤为对比版本号,不同则对比信息配置文件,然后去差异下载更新。做之前听网友们说已经不用www了,说是besthttp插件,非常好用。然后去试了下,确实好用,但是后面下载写入的时候会偶尔报异常,下载0kb的文件,而且看log根本看不出个所以然,没办法又换回了www。besthttp有个比较好的地方是可以设置下载到一定的量就去触发下载回调...
2019-07-09 11:10:22
531
2
原创 热更新之Assetbundle——上传
目前使用的是NetBox2,模拟当前文件夹为文件服务器,这个就.....没什么好说了,以后使用实际文件服务器时候再补充。
2019-07-08 18:33:52
285
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人