敌人动画控制
首先看到Player下的HoverBot:
将Animator组件下的Controller属性添加动画控制器HoverBot_AnimationController。
具体如下:
新建一个脚本命名为Ryun_HoveranimationController,具体代码实现如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ryun_HoveranimationController : MonoBehaviour
{
public float movespeed;
public bool alerted;
public bool death;//注意数据类型
public Animator Hoverani;
// Start is called before the first frame update
void Start()
{
Hoverani = this.GetComponentInChildren<Animator>();
}
// Update is called once per frame
void Update()
{
parameter();
}
private void parameter() //新建一个parameter()函数,在这里写入触发动画的操作
{
if (Hoverani == null) return;
Hoverani.SetFloat("MoveSpeed", movespeed);
//将浮点值发送到动画器以影响过渡。
//在脚本中使用 SetFloat 将浮点值发送到动画器以激活过渡。在动画器中,定义哪些值如何影响某些动画的过渡方式。这在很多情况下都很有用,尤其是在动画循环中,例如在移动动画中可需要根据所施加的按钮压力来决定走或跑。
Hoverani.SetBool("Alerted", alerted);
Hoverani.SetBool("Death", death);
//设置给定布尔参数的值。通过脚本使用 Animator.SetBool 将布尔值传递给 Death。
//用于触发动画器状态间的过渡。例如,通过将“alive”布尔值设置为 false 来触发死亡动画。有关设置动画器的更多信息,请参阅动画。
//注意:可以按名称或 ID 号识别参数,但名称或 ID 号必须与要在动画器中更改的参数相同。
}
public void TriggerDamage()
{
if (Hoverani == null) return;
Hoverani.SetTrigger("OnDamaged");
}
public void TriggerAttack()
{
if (Hoverani == null) return;
Hoverani.SetTrigger("Attack");
}//这两个参数动画需要其它脚本调用这两个函数触发.
}
在Ryun_PlayerController脚本里先定义一个
public Ryun_HoveranimationController animatorcontroller;
并在Start函数里调用:
animatorcontroller = this.GetComponent<Ryun_HoveranimationController>();
在PlayerMove()函数写入:
if (animatorcontroller)
{
animatorcontroller.movespeed = movespeed * v;
//{float v = Input.GetAxis("Vertical");并非每帧调用,故不需要写入Time.fixedDeltaTime}
animatorcontroller.alerted = v == 0 ? false:true;
}
注:
这里的animatorcontroller.alerted =v == 0 ? false:true; (返回布尔类型)
animatorcontroller在Ryun_PlayerController脚本里具体用在了:
if (animatorcontroller)
{
animatorcontroller.movespeed = movespeed * v;
animatorcontroller.alerted = v == 0 ? false:true;
}
设置玩家的移动速度以及触发alert上面
动画控制再分析
我们知道,对于这里的动画控制的脚本只是写了它的一个切换、触发等的行为包括需要SetFloat和SetBool,还有需要其它脚本调用TriggerDamge和TriggerAttacke函数的部分,我们将Ryun_Hoveranimationcontroller分别添加在Enemy_001和Player上
对于Enemy_001,我们在Ryun_Enemy Controller里面声明一个public Ryun_Hoveranimationcontroller enemyani
从这里就看出为啥要在Player里面添加这个脚本,到时候触发玩家消亡直接一个GetComponet调用就行。触发庆祝动画之类的
声明好后,我们首先看到:
当敌人追踪玩家时,应触发敌人警惕的状态,此时在后面添加
enemyani.movespeed=enemyAgent.speed;
包括enemyani.Alerted=true;
当敌人与玩家之间的距离超过mindistance
写上enemyani.Alerted=false;
当敌人受到攻击,我们应调用TriggerAttack,至于放在哪里,我们不难思考是在子弹开火的函数体内,在Ryun_BulletController脚本里,定位到当检测到Tag为Enemy时导致它的value值减少那块,在后面写上enemyani.TriggerAttack()
包括我们思考敌人血量减少时调用TriggerDamge的脚本的书写位置
不难知道应该是在Ryun_HealthController里面:
当PH大于0时,在if条件语句里写上enemyani.TriggerDamge(),后面需
要一个Destroy(this.gameObject)销毁这个对象
当然需要在开头声明一个public Ryun_Hoveranimationcontroller enemyani之类的——不确定这种方法是否能实现
实际上,教程给出的方法是直接在Ryun_BulletController里当子弹碰撞体与另一个碰撞体触发时,写下
collision.gameObject.GetComponent<Ryun_PlayerController>().animatorcontroller.TriggerDamaged();
//以及
collision.gameObject.GetComponent<Ryun_EnemyController>().enemyani.TriggerDamage();