一般情况我们都用的是动画状态机(Animator)来实现动画相互转化的效果
比较少用Animation 现在这篇博客将介绍一下这种方法
这篇博客的和之前第一人称控制器的那篇博客的项目是同一个 可以参照前边
之前那篇是控制行走 旋转 发射 检测击中等 这篇将加上动画 更加完整一点
1.准备工作
首先我们整一个枚举,为了更改的时候方便
public enum GunState
{
Idle,//站立状态
Shoot,//射击状态
Bolt//装弹状态
}
public GunState state = GunState.Idle;//默认赋值为站立状态
然后我介绍一下Animation.CrossFade(“动画名称”);
这个方法是播放动画的语句 很好理解
我们专门写一个方法
private void PlayAnim(string name)//播放动画
{
anim.CrossFade(name);
}
``
这样给它传参数即可 比较方便
然后我们再整一个更新状态的方法
```csharp
private void UpdateGunState()
{
//更新枪的状态
switch (state)
{
case GunState.Idle:
PlayAnim("Idle");
break;
case GunState.Shoot:
PlayAnim("Shoot");
break;
case GunState.Bolt:
PlayAnim("Bolt");
break;
}
}
一个简单的switch语句里边更新状态
2.处理装弹和射击动画的逻辑
由于开枪的逻辑是开始是站立状态 然后鼠标左键按下 播放射击动画 然后播放装弹动画
于是我们用协程来实现
private IEnumerator ShootReturnIdle()//射击转装弹转站立
{
yield return new WaitForSeconds(0.7f);
AuidoManager.Instance.PlaySound("装弹");
state = GunState.Bolt;
yield return new WaitForSeconds(0.9f);
state = GunState.Idle;
}//射击之后动画变化(步枪)
然后按R键是装弹效果
private IEnumerator IdleReturnBole()//站立转装弹转站立
{
state = GunState.Bolt;
yield return new WaitForSeconds(0.4f);
state = GunState.Idle;
}
yield return new WaitForSeconds(时间间隔); 表示延迟调用之后的语句 延迟时间为中间的时间间隔
其中的 AuidoManager.Instance.PlaySound(“装弹”);是用之前博客的一种播放音效的方法 如果有兴趣可以去查看
3.完整代码
public enum GunState
{
Idle,
Shoot,
Bolt
}
public class GunStart : MonoBehaviour {
#region
private Animation anim;
private float AttackTimer = 2;
public GunState state = GunState.Idle;
#endregion
private void Start()
{
anim = GetComponent<Animation>();
}
private void Update()
{
UpdateGunState();
if (AttackTimer >= 2)
{
ShootS();
}
else
{
AttackTimer += Time.deltaTime;
}
}
private void ShootS()
{
if(Input.GetMouseButtonDown(0))
{
AttackTimer =0;
state = GunState.Shoot;
StartCoroutine(ShootReturnIdle());
}
if(Input.GetKeyDown (KeyCode .R))
{
AttackTimer = 0;
StartCoroutine(IdleReturnBole());
AuidoManager.Instance.PlaySound("装弹");
}
}
private void UpdateGunState()
{
//更新枪的状态
switch (state)
{
case GunState.Idle:
PlayAnim("Idle");
break;
case GunState.Shoot:
PlayAnim("Shoot");
break;
case GunState.Bolt:
PlayAnim("Bolt");
break;
}
}
private void PlayAnim(string name)//播放动画
{
anim.CrossFade(name);
}
private IEnumerator ShootReturnIdle()
{
yield return new WaitForSeconds(0.7f);
AuidoManager.Instance.PlaySound("装弹");
state = GunState.Bolt;
yield return new WaitForSeconds(0.9f);
state = GunState.Idle;
}//射击之后动画变化(步枪)
private IEnumerator IdleReturnBole()
{
state = GunState.Bolt;
yield return new WaitForSeconds(0.4f);
state = GunState.Idle;
}
}
这个脚本挂在带有动画的枪上边 然后配合之前的第一人称脚本会有不错的效果
然后 本人qq 1149293885 特别喜欢交朋友