【基础知识】Unity查漏补缺
阅读原文时间:2023年07月09日阅读:1

最近发现了一些平时不太注重的知识点,特此建立个专题,把零散的东西、疏忽的东西临时记录下来。

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 ///

/// 响应切换按钮,切换摄像机 ///
public void SwitchCamera()
{
SwitchCameraController.Instance.SwitchCamera();
}

2.采用代码动态加载其他预制件

 private GameObject\[\] m\_EnemyPath;                       // 敌人移动路径  
 void Awake()  
 {  
     // 获取敌人移动路径  
     m\_EnemyPath = GameObject.FindGameObjectsWithTag(TagManage.PathTag);  
 }