Unity 知识总结
//单纯的日常总结, 会持续不断更新
UI部分
1.UI组件 ——InputField . onEndEdit.AddListener(事件) 当输入完成,摁下回车(Enter)键 也会触发事件响应
2. 设置当前选择的游戏物体: EventSystem.current.SetSelectedGameObject(gameObject);
目的是为了在触发OnDeselect 之前 设置当前物体为选择状态;在激活UI面板的时候使用 (结合EventTrigger)
3.在加载图片时出现问号 ? 有可能是路径的问题(Window 路径 和Unity 路径是不同的 需要进行分隔符‘\’的转换);
4. 在使用Scrollbar时,这个组件只会根据其 Content(内容组件的长度)来改变自身的大小,而在控制Content随子物体进行改变时,需要添加一个重要的组件 Content Size Fitter
5. 控制背景图片随着文本的内容进行缩放处理:
(1)在父物体背景图片上添加Horizontal Layout Group,以及Content Size Fitter 组件,控制本身使用子物体的长,宽,
(2)在文本内容上添加Content Size Fitter 组件,是文本框随着文本内容的多少改变大小。
(3)然后将本文框的锚点设置到左上角,是文本框向下进行延伸。
6.使用鼠标滚轮可以直接控制Scroll View的滑动,只不过 官方设置的默认值比较小: 只需增加 Scroll Sensitivity属性的数值。
7.在初始状态下需要UI组件默认处于激活/点击状态 ? 只需要调用 Select()方法即可。
8.在使用代码对Image的颜色进行赋值时:需要/255: imageBg.color = new Color(2/255.0f, 193/255.0f, 226/255.0f);
将颜色字符串格式转换为Color 时:API为:ColorUtility.TryParseHtmlString("#00A8C5", out color) ;
将Color转换为颜色字符串时:API为:ColorUtility.ToHtmlStringRGB(Color.red);
9.再Scroll Bar组件的使用当中:有时需要取消拖拽(滑动效果),只再ScrollBar当中相应:只需要取消ScrollRect源码脚本当中 IBeginDragHandler, IEndDragHandler, IDragHandler,接口的调用,即可 。
建议:最好重写这个脚本,特殊情况,特殊处理。
10,在动态修改ScrollBar value值,因为需要记录当前阅读的位置,所以需要记录当前ScrollBar value的值,然后在下一次打开之后动态赋值,但是在实操过程中修改后没有起作用:
解决办法:因为记录的当前Value值是float类型,在赋值过程中,出现了NaN的情况,所以不会有作用
只需要将保存的值,转化为1~n个小数点的float值 就可以成功赋值,并且有了效果。
如果仍然没有效果,可以尝试在打开后下一帧调用赋值方法。
11,在排序时,需要使用的Layout Group,如果需要子物体的排序根据生成顺序从下到上逆序的话,只需要勾选ReverseArrangement即可(新版本(2020之后的)才有这个参数)
12. Slider组件,用AD键会改变值, 只需要将Slider组件 Navigation 属性 修改为None 即可
13.LineRenderer 再绘制的时候,需要的Points 坐标为世界坐标,需要将点进行转换
转换
1. float 转换为double 时,不会直接转换,而是转换为无限趋近的值,所以在转换的过程中,可以先将float转换为String,然后在转换为Double,进行过渡转换。
2. 动画控制 -CrossFade() 不需要在状态机添加任何的逻辑,只需要在CrossFade 当中设置指定的动画即可完成动画的切换。
3.stirng.Trim(’*‘), 针对的只是 一个字符串 首尾 首位字符。如果首尾的首位字符不是需要删除的字符 则结束该方法;
4. 获取小数点后几位: Math.Round();
5.物体朝向目标位置:
Vector3 rotateVec = target.position - this.position;
Quaternion newRotation = Quaternion.LookRotation(rotateVec);
this.rotation = Quaternion.RotateTowards(this.rotation, newRotation, speed);
6.将物体朝向目标物体
//在更新帧中调用
Vector3 rotateVec = pointGam.transform.position - this.Transform.position;
Vector3 newVec = new Vector3(rotateVec.x, 0, rotateVec.z);
Quaternion newRotation = Quaternion.LookRotation(newVec);
this.transform.rotation = Quaternion.RotateTowards(this.transform.rotation, newRotation, 100);
7. 将2*8 用其他形式进行表示:
2<<3 :意思是将2 左移三位,2 二进制数是00000010,左移三位就是00010000.转换为十进制就是1*2*2*2*2 = 16
其实左移一位相当于乘2,
8.数字前后补零
数字左补零:int.ToString().PadLeft(2,'0');
数字右补零: int.ToString().PadRight(2,'0')
拓展
1.在方法的参数前+this 代表拓展 该类,也就是说 在当前类下新添加一个静态方法,
例子: public static string HotFixTypeFullName(this string typeName)
{
return Utility.Text.Format("{0}.{1}", “当前的类型名称”, typeName);
}
在其他方法当中调用:
string str = "123";
string newStr = str.HotFixTypeFullName;
拓展的类型时 类(class),在测试的时候 才发现 int 是结构体 尴尬!!!!!!!!!!
被自己忽略Unity API
1.transform.find("名称/名称");
可以按照名称或者子物体嵌套子物体,查找到任意一个子物体
2. protected void OnValidate(){}
当脚本进行编译或者检视面板的值被修改是会被调用;(仅在编辑器中调用)
知识小结:
1.值类型是有无参构造函数的,而 引用类型 string 是没有无参构造函数的。
2.ref 关键字让形参成为实参的别名;
In:过程不会改写In的内容 ,默认的传递方式,即向函数内部传送值。(在实参为引用类型时可以避免不修改)
Out和out:传入的值不会被过程所读取,Out在传入的时候,参数的数值会清空,但过程可以写 。只出不进
ref:可以把参数的数值传递进函数 ,过程会读,会写 。有进有出。
大家有发现的有趣的小问题,可以分享出来,一起进步

浙公网安备 33010602011771号