【基础知识】Unity查漏补缺
最近发现了一些平时不太注重的知识点,特此建立个专题,把零散的东西、疏忽的东西临时记录下来。
Mecanim动画系统:
1)设置AnimatorController时,如果某个动作播放不正常。
首先打开不正常的FBX动作的Inspector面板的Animations属性
然后对如下选项进行检查:
LoopTime:动画结束后是否进行循环播放(在走、跑等动作中,要注意勾选此选项)
----LoopPose:无缝循环动作(勾选)
Root Transform Rotation:根旋转变换
Root Transform Position(Y):根位置变换(Y)
Root Transform Position(XZ):根位置变换(XZ)
----Bake into Pose:是否将根运动保存进骨骼里面。(关闭此选项后,游戏对象的旋转、位置将不受动画的影响)
再检查时间轴的起始点和终止点,根据需求确认4个loop match的灯状态(绿灯时表示开始帧和结束帧为同样的一个造型)。
2)对一次性动画,比如Run动画过程中发生的Jump动画,在Jump结束后的转换状态条件中,必须要添加ExitTime属性,确保动画播放完成。
Network类:
1)服务器端和客户端的代码分两个场景保存导出,避免使用RPC发送消息时,客户端无法接受到消息的情况发生。
预制件:
使用多个预制件进行场景动态加载时,需要注意两方面内容:
1.各个预制件的实例化顺序:摄像机、灯光、场景、UI、其他功能(注意依赖关系)
2.各个预制件之间的引用关系。避免在预制件的Inspector窗口中引用其他预制件的组件。
例如预制件A和预制件B,预制件A的Inspector窗口中引用了预制件的B。
在这两个预制件进行实例化后,游戏对象A的Inspector窗口中仍然引用的是预制件B。
因此,解决方法目前想到两种:
1.采用单例模式引用预制件B
1 /// <summary> 2 /// 响应切换按钮,切换摄像机 3 /// </summary> 4 public void SwitchCamera() 5 { 6 SwitchCameraController.Instance.SwitchCamera(); 7 }
2.采用代码动态加载其他预制件
1 private GameObject[] m_EnemyPath; // 敌人移动路径 2 void Awake() 3 { 4 // 获取敌人移动路径 5 m_EnemyPath = GameObject.FindGameObjectsWithTag(TagManage.PathTag); 6 }