原帖地址:https://zhuanlan.zhihu.com/p/54763553html
在Scene面板右上角的Gizmo下拉列表中,能够经过设置Selection Outline选项决定是否在选中物体时显示边缘高亮的标识。数据结构
在摄像机上挂载Pixel Perfect Camera组件可以使2D像素风格的游戏画面更加整洁清晰。此组件须要使用Package Manager安装2D Pixel Perfect包。dom
对于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)时,则相反。编辑器
默认状况下,使用Destroy()方法会当即销毁游戏对象,若是想延迟一段时间再销毁,可在此方法中传递一个时间参数,以下:ide
Destroy(gameObject,2f);
在Project面板中选中一个自定义Shader,右键选择新建材质(Create>Material),则材质默认使用的着色器为z以前选择的Shader,同时材质名称为Shader的名称。函数
一般状况下,新建的脚本要挂载到游戏对象上才能运行,若是在脚本中的方法前使用[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)],能够不用挂载到任何游戏对象上便可在程序运行时执行此方法,方便在在程序初始化前作一些额外的初始化工做。以下代码所示:工具
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] public static void DoSomething() { Debug.Log("It's the start of the game"); }
在程序运行时改变组件的各属性值,当中止运行后,这些改变将重置为编辑状态下的数值,。程序运行时改变了组件的属性值,能够点击组件右上角的齿轮按钮,选择Copy Component命令,中止播放后,在相同的组件上,执行Paste Component Value,从而可以保存在运行时对该组件作出的改变。布局
咱们知道Random.value可以返回0~1之间的随机数,因此让此随机数与0.5f进行比较,就可以获取一个随机的布尔值True或者False,以下代码所示:性能
bool trueOrFalse = (Random.value > 0.5f);
若是数据结构仅保存了有限的几个数值变量,能够考虑使用struct代替Class,由于Class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后当即自动解除内存分配。动画
当使用Visual Studio进行代码编写时,可双击Tab键来辅助完成像if、for、switch等语句的补全。
在一个协程里开启另一个协程,可以使用如下方法:
void Start() { StartCoroutine(FirstCo()); } IEnumerator FirstCo() { yield return StartCoroutine(SecondCo()); } IEnumerator SecondCo() { yield return 0; }
使用Animation工具还能够改变脚本的变量。
在Animation窗口中,按下Ctrl+A,全部关键帧将集中显示在窗口中;选择某些关键帧,按下F键,可将它们居中显示在窗口中;按下C键,能够在曲线视图和关键帧视图间切换;按下K键添加关键帧。
在Animator窗口中,设置动画的Speed属性为-1可以使动画片断反向播放。
将两点之间的距离与一个固定距离进行比较时,可以使两点相减而后取平方(即sqrMagnitude),而后用该值与某个距离值的平方进行比较。不建议使用Vector3.Distance方法获取两点之间距离,而后与给定的距离值进行比较。由于Vector3.Distance(a,b) 至关于 (a-b).magnitude,即求平方后开根,而sqrMagnitude方法省去了求平方根的操做,因此比magnitude执行快。
建议:
if ((pointA - pointB).sqrMagnitude < dist * dist) { }
不建议:
if (Vector3.Distance(pointA, pointB) < dist) { }
使用TextMeshPro可以得到更多的文字控制自由度,而且可以有效防止文字边缘模糊。以下图所示,第一行文字经过"Create > UI > Text"命令建立,第二行文字经过"Create > UI > TextMeshPro - Text"命令建立。
将私有变量标记为SerializeField,可在Inspector面板中将其显示。
[SerializeField] private int myNumber = 20;
若是不但愿在Inspector面板中显示公有变量,可将其标记为[HideInInspector]。
[HideInInspector] public int myNumber = 20;
当变量重命名后,若是但愿继续保留其数值,可以使用FormerlySerializedAs,以下代码所示:
[FormerlySerializedAs("hp")] public int myNumber = 20;
须要引用命名空间:
using UnityEngine.Serialization;
可将常常访问的文件夹的快捷方式拖入Project面板中,双击快捷方式可快速打开此目录。
选择游戏对象,按下F键,可将Scene的视口中央移动到该游戏对象处;按下Shift+F,可将视口与该游戏对象锁定,即不管如何移动游戏对象,视口中央始终跟随此游戏对象。
在Hierarchy面板中选择摄像机,按下Ctrl+Shift+F,可将摄像机移动到可以呈现Scene窗口中内容的位置。
当对游戏对象的Tag进行比对时,从性能考虑,可以使用CompareTag方法,不建议使用双等号进行判断。由于CompareTag不须要内存分配以及垃圾回收,而从游戏对象中检索字符串的话,会分配内存而且须要垃圾回收。
建议:
if (gameObject.CompareTag("Enemy")) { }
不建议:
if (gameObject.tag == "Enemy") { }
在Hierarchy面板中,可使用名称中带有分隔符的空游戏对象进行组织管理。
若是须要查找挂载了某个组件的游戏对象,直接在Hierarchy面板的搜索框中输入组件名称便可,须要注意组件名称中的空格,好比搜索”MeshCollider“而不是”Mesh Collider“。
在Project面板中的搜索框中输入"t:"+资源类型,能够过滤显示某种类型的资源,好比输入"t:scene",会过滤出全部场景文件,输入"t:texture",则会显示全部贴图。
在Visual Studio中,使用快捷键Alt+上下键,能够在代码块中快速上移/下移光标所在的代码行,不用复制粘贴。
点击组件右上角的文档按钮,可快速打开关于当前组件的文档。建议下载离线文档,以便更加快速打开文档,若是没有下载,Unity将打开在线文档。
在Unity文档中点击Documentation Version连接,可查看不一样版本的文档。
在Hierarchy面板中,按下Alt键,鼠标左键点击树形节点,可展开/折叠当前节点下的全部子节点。
Unity窗口布局可自定义,调整完毕之后,若是但愿之后继续沿用此布局,点击编辑器右上角的Layout下拉列表,选择命令Save Layout,可将当前窗口布局进行保存。
选择命令Editor > Preferences命令,可自定义编辑器当前主题的颜色。
修改Playmode tint的颜色值,能够改变编辑器在运行模式时的颜色,以提醒开发者此时为运行模式。
在Scene面板顶部的图片下拉列表中,可选择开关某种类型的特效。
要在编辑器的菜单栏中选择执行编写的函数,可在函数前添加MenuItem属性,以下代码所示:
[MenuItem("MyMenu/Do Something")] static void DoSomething() { }
使用ContextMenu属性标记函数,可以在脚本所在的上下文菜单中调用,以下代码所示:
[ContextMenu("Do Something")] void DoSomething() { }
在编辑器右上角的Layers下拉列表中,点击对应层右侧的眼睛按钮,能够隐藏或显示某个层上的对象;点击锁按钮,可对某个层进行锁定或解锁,当被锁定后,该层上的全部对象将不能被选择。
当建立层时,使用斜杠符进行路径式命名能够为层添加子菜单,能够更好地组织项目。
在不一样的目标平台下添加 Scripting Define Symbols(Project Settings > Player > Scripting Define Symbols),以分号分隔,能够将这些符号像使用Unity内置标签同样用做#if指令的条件。
在使用Color控件的滴管工具进行颜色选择时,能够拾取Unity编辑器以外的颜色。
在颜色属性之间也可使用右键命令进行复制粘贴。
使用快捷键Shift+空格键,能够快速最大化鼠标所在的窗口,而不用选择窗口右上角的Maximize命令。
在数据类型Struct和Class声明前使用[System.Serializable],能够将其显示在Inspector面板中进行赋值。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { public A[] AList; public B[] BList; public A a; public B b; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } } [System.Serializable] public struct A { public int a; public GameObject b; public Vector3 c; } public struct B { public int a; public GameObject b; public Vector3 c; }
能够看到,结构体B的数据没法再面板内显示,而A的则能够显示。
在 Edit > Project Settings... > Physics 中,经过设置Layer Collision Matrix 能够决定可以互相碰撞的层。
当两个对象发生碰撞时,会发送不一样的碰撞事件,如OnTriggerEnter、OnCollisionEnter等等,这取决于具体的碰撞体设置,下表列出了不一样类型的碰撞体发生碰撞时所能发出的事件类型。详情可参考Unity 官方文档:https://docs.unity3d.com/Manual/CollidersOverview.html
在Inspector面板中涉及到数值输入的字段,不只能够直接输入数据,还能够在输入框中输入数学表达式,按下回车后Unity会将计算结果填充到输入框中。
点击Inspector右上角的锁定按钮,或在上下文菜单中选择Lock命令,能够将当前选中游戏对象的Inspector面板锁定。而后选择Add Tab > Inspector命令,添加一个Inspector,这样可以方便在两个游戏对象之间互相拷贝组件数据。