干货 unity小贴士
3.以Y轴为依据进行Sprite排序
对于2D游戏,将Transparency Sort Mode (Edit > Project Settings > Graphics ) 设置为Custom Axis,然后设置Transparency Sort Axis,场景中的Sprite可以根据Y轴进行排序。如下图所示,当设置为(0,1,0)时,Y坐标相对较大的Sprite排在Y坐标相对较小的Sprite之下,当设置为(0,-1,0)时,则相反。
5. 快速新建基于自定义Shader的材质
在Project面板中选中一个自定义Shader,右键选择新建材质(Create>Material),则材质默认使用的着色器为z之前选择的Shader,同时材质名称为Shader的名称。
12. Animation 中 Add Property 可以修改脚本的变量
16.快速比较距离
将两点之间的距离与一个固定距离进行比较时,可使两点相减然后取平方(即sqrMagnitude),然后用该值与某个距离值的平方进行比较。不建议使用Vector3.Distance方法获取两点之间距离,然后与给定的距离值进行比较。因为Vector3.Distance(a,b) 相当于 (a-b).magnitude,即求平方后开根,而sqrMagnitude方法省去了求平方根的操作,所以比magnitude执行快。
建议:
if ((pointA - pointB).sqrMagnitude < dist * dist) {
// ...
}
不建议:
if (Vector3.Distance(pointA, pointB) < dist) {
}
18.
[SerializeField]标记的私有变量可以在 Inspector 面板中显示.
25. CompareTag方法
当对游戏对象的Tag进行比对时,从性能考虑,可使用CompareTag方法,不建议使用双等号进行判断。
27. 查找含有某组件的游戏对象
如果需要查找挂载了某个组件的游戏对象,直接在Hierarchy面板的搜索框中输入组件名称即可,需要注意组件名称中的空格,比如搜索”MeshCollider“而不是”Mesh Collider“
38.ContextMenu
使用ContextMenu属性标记函数,能够在脚本所在的上下文菜单中调用
45.最大化窗口
使用快捷键Shift+空格键,可以快速最大化鼠标所在的窗口,而不用选择窗口右上角的Maximize命令
50.锁定Inspector
点击Inspector右上角的锁定按钮,或在上下文菜单中选择Lock命令,可以将当前选中游戏对象的Inspector面板锁定。然后选择Add Tab > Inspector命令,添加一个Inspector,这样能够方便在两个游戏对象之间互相拷贝组件数据。
51.Inspector调试模式
在Inspector面板右上角的上下文菜单中,选择Debug命令,启动调试模式,此时将显示组件包含的所有变量,包括私有变量,当运行编辑器时,可以实时查看各组件所有变量的变化。
53.风格化Debug.Log的输出信息
当Debug.Log方法的输出消息是字符串时,可以使用富文本标记来强调内容。
Debug.Log("<color=red>红色文本</color> AssetBundle not found");
54.绘制调试数据
当变量随着时间的推进而改变时,可使用AnimationCurve实例在程序运行时绘制此数据,如下代码所示:
public AnimationCurve plot = new AnimationCurve();
void Update()
{
float value = Mathf.Sin(Time.time);
plot.AddKey(Time.realtimeSinceStartup, value);
}
返回Unity编辑器,运行程序,点击plot属性,此时会随着时间动态绘制数据的变化情况
57.Blender (三维动画制作软件)
58. Inspector面板中物体的图标下拉可以给游戏对象指定一个特定颜色.
65.自定义窗口
将类继承自EditorWindow,可以添加自定义窗口,在此基础上编写一些命令和工具,如下代码所示:
using UnityEngine;
using UnityEditor;
public class ExampleWindow : EditorWindow
{
[MenuItem("Window/Example")]
public static void ShowWindow()
{
GetWindow<ExampleWindow>("Example");
}
}
72. 管理程序集
在Project面板中选择Create > Assembly Definition 命令,创建程序集文件,然后将其拖放到指定的文件夹中,定义脚本依赖关系,可以确保脚本更改后,只会重新生成必需的程序集,从而减少编译时间。
73.WaitForSecondsRealtime
当时间缩放为0时(即Time.timeScale=0f),waitForSeconds方法将不会停止等待,后续代码也不会执行,此时可使用WaitForSecondsRealtime方法
77/78/79. Inspector 方便属性修饰
[Range(0f, 10f)] // 滑块
[Header("自定义文字")]
[ToolTip("鼠标悬停, 提示文本")]
85. 组件预设
在Inspector 面板中组件的右上角帮助和上下文菜单按钮中间的调节按钮,点击可以使用或保存组件预设.
86. foreach遍历游戏对象的所有子物体
foreach (Transform child in transform) {
Debug.Log(child.name);
}
87. 使用 transform.SetSibilingIndex 方法设置游戏对象在 Hierachy 面板中的顺序
90. 脚本暂停编辑器播放
EditorApplication.isPaused = true;
91. 编辑器上方的播放暂停右边的步进(Step)按钮,可以逐帧查看程序运行状态.
92. Profiler工具分析, 查看函数资源的使用情况
引入 UnityEngine.Profiling 命名空间;
Profiler.BeginSample("expensive");
CalculateSomething();
Profiler.EndSample();
97. InvokeRepeating方法
按照一定的时间间隔反复执行一个函数, 若不使用CancelInvoke 将会持续执行, 即使将方法所在的脚本关闭.
98. Frame Debugger(Window -> Analysis -> Frame Debugger)
查看每一帧的渲染过程
99. Physics Debugger(Window -> Analysis -> Physics Debugger)
绘制出来所有游戏对象的碰撞体.