今天实现的内容:
枪械的瞄准动画层
采用了和基本移动层类似的方法,射击动画由脚本直接播放。
瞄准状态的进入和退出由一个bool参数Aim来控制。
Idle和Reload层的Idle在形式上和功能上是一样的。形式上都是一个空节点,功能是为了在当前动画权重为1并且没有播放本层其他动画时依然能够播放其他层的动画。
权重记得设置为1。之前的Reload层也可以设置为1。
枪械瞄准的逻辑实现
由于每种枪都可能有不同的瞄准逻辑(比如不同的瞄具放大倍率啥的),我们在基类Firearms中设计了抽象方法Aim,让子类来具体实现瞄准逻辑。
// 瞄准 每种枪的瞄准会有不同(也许吧) 放大会有不同(机瞄,二倍镜,三倍镜) 需要派生类来具体实现
protected abstract void Aim();
通过修改摄像机的FOV来实现瞄准放大的效果。eyeCamera是摄像机的引用,originFOV用于存储摄像机原本的FOV值。
// 摄像机 用于瞄准时修改FOV
public Camera eyeCamera;
// 摄像机FOV的原数值
protected float originFOV;
Aim方法逻辑很简单,由于大头都被动画实现了,所以我们要做的就是修改动画参数。
// 瞄准
protected override void Aim()
{
gunAnimator.SetBool("Aim", m_isAiming);
}
重点在这里,Update方法中的瞄准逻辑,我们专门做了一个bool值m_isAiming来判断当前是否处于瞄准状态。由于Aim只是修改动画参数,所以我们要实现的逻辑是 m_isAiming要能反映当前是否处于瞄准状态。按住瞄准键就能保持瞄准状态,松开瞄准键退出瞄准。
// 瞄准 按住就会瞄准
if (