在Inspector面板右上角的下拉菜单中,选择Debug命令,启动调试模式,此时将显示组件包含的全部变量,包括私有变量,当运行编辑器时,能够实时查看各组件全部变量的变化。数组
当使用Debug.Log方法输出信息时,可将gameObject做为此方法的第二个参数,当程序运行时,点击Console面板中对应的输出信息,可在Hierarchy面板中高亮显示挂载了此脚本的游戏对象。缓存
void Start() { Debug.Log("this is a message",gameObject); }
当Debug.Log方法的输出消息是字符串时,可使用富文本标记来强调内容。以下代码所示:性能优化
Debug.Log("<color=red>Fatal error:</color> AssetBundle not found");
输出效果:编辑器
当变量随着时间的推动而改变时,可以使用AnimationCurve实例在程序运行时绘制此数据,以下代码所示:ide
public AnimationCurve plot = new AnimationCurve(); void Update() { float value = Mathf.Sin(Time.time); plot.AddKey(Time.realtimeSinceStartup, value); }
返回Unity编辑器,运行程序,点击plot属性,此时会随着时间动态绘制数据的变化状况,以下图所示:函数
选择游戏对象,在Inspector面板上点击Add Component按钮,在搜索框中输入新建的脚本名称并回车,可新建脚本并挂载到目标游戏对象上,双击脚本名称进行脚本编写。工具
Unity可以读取部分第三方创做工具保存的项目文件,好比Photoshop的PSD,Blender的源文件等,不须要从这些软件导出中转文件格式,好比Jpg、FBX等。性能
将PSD文件另存为PSB格式,将其导入Unity后可保留文件图层结构,此时须要在Package Manager中安装2D PSD Importer,而且在文件的导入属性中设置Texture Type 为Sprite (2D and UI)。测试
点击游戏对象Inspector面板左上角的下拉菜单,可为游戏对象指定一个特定颜色的标识,这对空游戏对象的可视化也比较有用。点击Other...按钮,能够用本身的图片来进行标识。优化
点击Scene面板右上角的Gizmo下拉列表,能够选择显示或隐藏某类组件的图标和Gizmo标识;也可点击Game面板右上角的Gizmo按钮,显示或隐藏全部资源的图标和Gizmo。
可以使用StringBuilder进行字符串的拼接,不要使用字符串相加的形式,由于这样会带来额外的内存垃圾。以下代码所示:
StringBuilder myStr = new StringBuilder(); myStr.Append("Hello").Append("The").Append("World");
不建议:
string myStr = "Hello" + "the" + "world";
使用StringBuilder须要引用命名空间System.Text。
对于游戏数据好比武器、成就等,可以使用ScriptableObjects在编辑器中进行有效组织。以下代码所示:
using UnityEngine; [CreateAssetMenu(fileName = "New Item", menuName = "Item")] public class NewBehaviourScript : ScriptableObject { public string ItemName; public int ItemLevel; public Texture2D ItemIcon; }
选择 Edit > Preferences > General 命令,在Script Changes While Playing中,能够设置编辑器在播放状态下若是脚本发生改变后的处理,好比中止播放从新编译等。
将类继承自EditorWindow,能够添加自定义窗口,在此基础上编写一些命令和工具,以下代码所示:
using UnityEngine; using UnityEditor; public class ExampleWindow : EditorWindow { [MenuItem("Window/Example")] public static void ShowWindow() { GetWindow<ExampleWindow>("Example"); } }
执行效果:
也可对Inspector进行自定义,添加一些控件。以下代码所示:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Sphere))] public class SphereEditor : Editor { public override void OnInspectorGUI() { GUILayout.Label("自定义Inspector"); GUILayout.Button("肯定"); } }
执行效果:
使用快捷键Q、W、E、R、T、Y切换移动、旋转、缩放等工具。
RectTransform工具通常用于缩放2D物体,对3D物体使用该工具能够在某个二维平面对其进行缩放,这取决于物体与视口的关系。
按下Ctrl键对游戏对象进行移动、旋转、缩放,将以步进的形式进行操做,选择Editor > Snap Settings...命令,可设置步进大小。
按下V键,在游戏对象上选择顶点进行拖放,将以此顶点为基础,把游戏对象吸附到其它顶点的位置。
在Project面板中选择Create > Assembly Definition 命令,建立程序集文件,而后将其拖放到指定的文件夹中,定义脚本依赖关系,能够确保脚本更改后,只会从新生成必需的程序集,从而减小编译时间。
当时间缩放为0时(即Time.timeScale=0f),waitForSeconds方法将不会中止等待,后续代码也不会执行,此时可以使用WaitForSecondsRealtime方法,以下代码所示:
Time.timeScale = 0f; yield return new WaitForSecondsRealtime(1f);
当某组件须要被频繁访问时,可在初始化时预先获取该组件的引用,从而避免在访问时因为重复获取引发的性能开销。
private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void Update() { rb.AddForce(0f, -2f, 0f); }
一样的状况,也不要在使用Camera.main获取摄像机组件,尤为避免使用相似如下方法:
Camera cam = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
这样会带来更大的性能消耗。
若是某字符串在整个应用过程当中不会改变且被频繁使用,可将其存储在静态只读变量中,从而节省内存分配,以下代码所示:
static readonly string Fire1 = "Fire1"; void Update() { Input.GetAxis(Fire1); }
不建议:
void Update() { Input.GetAxis("Fire1"); }
为变量添加一些属性可以使它们在Inspector面板中更容易被使用。在变量前添加Range属性可将其限定在某个范围内使用滑块进行调节,以下代码所示:
[Range(0f,10f)] public float speed = 1f;
执行效果:
两个变量声明之间加入[Space]可在Inspector中添加一个空行;添加Header可在Inspector面板中加入一段文字,以下代码所示:
[Header("Player Settings")] public float speed = 1f; public int size = 10;
执行效果:
在变量前加入Tooltip,当鼠标悬停在Inspector面板中的变量上时,可显示关于此变量的说明,以下代码所示:
[Tooltip("移动速度")] public float speed = 1f;
执行效果:
在Project面板中,将一个场景文件拖到另一个上,可将场景进行合并。
选择一个游戏对象,使用快捷键Ctrl+D可快速建立该游戏对象的副本,一样的方法可建立数组元素的副本。
当完成某个组件的属性设置后,可点击组件右上角的预设按钮,将当前属性设置保存为预设,方便后续进行组件设置时使用。
可以使用foreach循环遍历游戏对象的全部子物体,以下代码所示:
foreach (Transform child in transform) { Debug.Log(child.name); }
使用transform.SetSiblingIndex方法能够设置游戏对象在Hierarchy面板中的顺序,以下代码所示:
transform.SetSiblingIndex(1);
以上代码实如今游戏运行时,设置游戏对象在Hierarchy面板中的顺序为同级节点中的第二个。
当选择了多个游戏对象后,可在 Edit > Selection 的子菜单中选择一个Save Selection项,暂存当前选择状态。选择Load Selection+对应的序号,便可恢复某个选择状态。此方法对跨节点选择多个对象的状况很是适用,这样将没必要依次展开节点从新进行查找选择。
使用#region 和 #endregion能够将二者之间包含的代码折叠,方便阅读。
使用EditorApplication.isPaused可经过代码在编辑器播放时将其暂停,以下代码所示:
void Update() { if (Time.time >= 10f) { EditorApplication.isPaused = true; } }
须要引用命名空间UnityEditor。
点击暂停按钮右侧的步进(Step)按钮,能够在程序运行时逐帧查看程序运行状态。
点击Game窗口右上角的Stats按钮能够查看游戏性能统计数据,如帧率、批处理等指标。
查看更加详细的分析数据,可以使用Window > Analysis > Profiler工具;使用Profiler.BeginSample和Profiler.EndSample方法可在Profiler中查看函数的资源使用状况,以下代码所示:
Profiler.BeginSample("expensive"); CalculateSomething(); Profiler.EndSample();
须要引入UnityEngine.Profiling命名空间。
一般状况下,项目资源在Inspector面板底部均有一个预览窗口。鼠标右键点击预览窗口顶部,可将该窗口弹出,做为独立窗口,放置在编辑器的任意位置。
点击Game窗口右上角的Mute Audio按钮,可在编辑器播放时将全部声音关闭。
InvokeRepeating可以按照必定的时间间隔反复执行某个函数,若不使用CancelInvoke方法,InvokeRepeating将持续执行,即便将方法所在的脚本关闭。
使用Frame Debugger(Window > Analysis > Frame Debugger)能够查看每一帧的渲染过程。
使用Physics Debugger(Window > Analysis > Physics Debugger)能够查看碰撞引发的异常,当开启Collision Geometry选项后,场景中全部游戏对象的碰撞体都将被绘制出来,而不用依次选择游戏对象进行检查。以下图所示,球体由于添加了不正确的Box Collider,在物理碰撞时必然不能达到预期的表现效果。