AssetBundle资源加载与释放
冗余 or 效率
对于每一个引用的资源,可以选择对每一次引用都打成一个Bundle,此时会存在多个重复使用的资源,但是可以减少引用次数,也就是存在冗余但是提升了效率
也可以通过对同一个资源打标记,Bundle 中相同资源只存在一个,每引用一次 +1,每次销毁引用 -1,当引用次数为 0 时释放
根据实际情况确定需要冗余还是效率
音量调整优化
https://zhuanlan.zhihu.com/p/591725347
性能优化
Unity Profiler 分析工具12345UnityEngine.Profiling.Profiler.BeginSample($"{value} UpdateType");Function()UnityEngine.Profiling.Profiler.EndThreadProfiling();
坐骑逻辑
坐骑可以看做装备
通过穿脱装备(加载坐骑资源),PutOn PutOff
通过坐骑的动画状态机切换状态
骑车移动状态RideMoveState切换玩家状态PlayerCtrl.BaseRoleAnim,车子状态切换坐骑对象本身的动画PlayerRide
封装 PlayerRide 坐骑主 PlayerRide 乘坐者 状态,装备和销毁方法挂在 Player身上
状态机基类
控制对象
当前枚举
是否进入tag(enter真 exit假)
生命周期(enter update lateUpdate Exit)
1234public CharacterState(eCharState state){ State = state;}
单独状态
生命周期具体行为(可以切换到当前状态的切换动画)
(先准备资源(根据状态拼出来资源名 ride_资源编号_zoulu_01) 有了再播放)
修改Tag (上一个动画 .?)
渐变动作 RoleAim.CrossFade 混合动画)
1234public RideMoveState() ...
Git使用
基础使用
图形化Git管理工具:Sourcetree,SmartGit等
拉取与提交
Pull(拉取同步远程仓库) -> Commit(提交本地仓库)-> Push(本地代码推送到远程仓库)
先拉取再提交,提交不成功小事,有概率蜜汁报错甚至需要回退
补充用户名和邮箱
123git config --global user.name "用户名"git config --global user.email "邮箱"
解决冲突
合并
看提交记录,ours 自己本地提交冲突的,theirs 当前主干提交的(要合并的分支),选择需要合并的主干进行合并
保存需要保留的版本
驻藏本地
提交
From:https://blog.csdn.net/james_xiaojun/article/details/100572359?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-100572359- ...
UGUI设备适配
Layout GroupVertical
竖直布局
Horizontal
水平布局
Grid
网格布局
Layout Element
布局元素
Content Size Fitter
自适应
应用
主要在外界有布局的情况下,子物体还需要自适应等各种情况
看情况Control Child Size,在外界已经挂载Content Size Fitter的情况下,子物体再挂载是无效的,默认子物体都是自适应长度的,对于不需要变化的或者特殊的处理,只需要挂Layout Element,对其进行设置即可
Pivot
轴心
父物体轴心位置决定子物体生成的位置
0.5 在中心依次向右,中心一直变
0 左边定住,第一个不变,每增加一个都向右移动
1 右边定住,每增加一个,前面的都向左移动
RectTransform动态改变布局stretch
12345678//改变RectTransform的topGetComponent<RectTransform>().offsetMax = new Vector2(GetComponent<RectTransform&g ...
UGUI常用组件
TextMeshPro
TextMeshPro支持富文本:富文本标签
TextMesh用富文本不要打空格也不要复制网页的
https://zhuanlan.zhihu.com/p/375889482
名字省略号
TextMeshPro-Dropdown12345678910111213141516171819TMP_Dropdown.OptionData m_NewData, m_NewData2;List<TMP_Dropdown.OptionData> m_Messages = new List<TMP_Dropdown.OptionData>(); /// TMP_Dropdown m_Dropdown; /// string m_MyString; /// int m_Index;m_Dropdown = GetComponent<TMP_Dropdown>();m_Dropdown.ClearOptions();m_NewData = new TMP_Dropdown.Op ...
Tips
代码习惯C# 格式
全局变量:_newList
临时变量:newlist
函数:UpdateList()
静态变量:NewList
用 foreach 而不是 for 去遍历善用 GetComponentsInChild
用 GetChild更容易受到美术调整的影响
i++ 和 ++i
i++
123var t = i;i += 1;return t;
++i
12i += 1;return i;
i = i + 1
12var t = i + 1;i = t;
++i不需要给中间变量赋值,性能会好一点
From:https://blog.csdn.net/Dr_Unknown/article/details/51363196
不要一边遍历一边删除TimeLine Directior 的单位是秒Bugunity 空引用异常
From大佬:Unity基本百分之90的报错都是 NullReferenceException: Object reference not set to an instance of an object,非常容易碰到了属于是,不过能复现出来的话这类貌 ...
Dotween常用方法
用到什么记录什么
TransformPosition改变世界坐标
第一个参数是要移动到的目标点,不是移动这个向量的距离
transform.DOMove(new Vector3(1, 1, 1), 2);
只控制x轴上的移动,其他两个方向同理
transform.DOMoveX(1, 2);
改变局部坐标
相对当前局部坐标的移动距离
transform.DOLocalMove(new Vector3(1, 1, 1), 2);
transform.DOLocalMoveX(1, 2);
Text
颜色渐变:
text.DOColor(Color.black, 2f);
透明度渐变:
text.DOFade(0, 2f);
这里有坑:如果是对UI和Text的话,需要用Canvas Group的DoFade,原因不明
Dotween常用方法动画同时播放
Sequence:Sequence quence = DOTween.Sequence();
添加动画到队列中:quence.Append(transform.DOMove(Vector3.one ...
C#语法扩展
判空?and ??1234int i; //默认值0int? ii; //默认值nullstring str = null;str = str??"" // ??判断若为空则返回某值
?. and ??
?. 为空就执行方法,常用事件传递,_action?.Invork()
?? 为空就赋值
Guard.IsNotNull
空异常抛出,若为空就抛异常,否则通过
Is and Asif(xxx is aaa x) bbb;var x = a as c;if (x != null) xxx
字符串常用API拼接1234567// Format 插值方法String s = String.Format("The current price is {0} per ounce.", price);// ${}String s = $"{The current price is {0} per ounce}";// + 加号的方法每次都new出新的字符串进 ...
Unity中的事件和委托
委托
可以看做函数指针,存放函数的容器的变量
这个指针存放的函数参数和返回值一致,函数模板
委托类型在作为参数传递时,相当于直接将参数返回值一样的函数的返回值传进去
因此可以用在多个函数功能类似的情况下
先写一个公用的功能,调用时直接传入委托
不同的地方拎出来一个一个写
符合函数模板可以通过+=添加给委托,委托执行时注册的函数都会执行
由于委托可以被其他委托赋值,存在被修改的风险
将函数作为参数传递时,在另外一个类触发该委托返回值时,可以直接触发这个函数,只关心该函数,而不需要知道传来的类
delegate创建12public delegate void TestDelegate();public delegate bool TestBoolDelegate(int i);
Action创建
delegate 被封装好的一种简写
Action
无参无构造函数的委托
Action, Action
有参数委托
12public Action testAction;public Action<int ,float> testInFloatAct ...