可以让敌人以上图方式进行动画连线,然后设置四个布尔值进行对动画的切换控制。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class stateInfo : MonoBehaviour
{
Animator m_animator;
Transform targetTrasform;//敌人的最终目标点
NavMeshAgent m_navmeshagent;
// Use this for initialization
void Start()
{
//获取动画组件
m_animator = GetComponent<Animator>();
//获取自动寻路导航的组件
m_navmeshagent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
//获取当前动画层的信息
AnimatorStateInfo stateinfo = m_animator.GetCurrentAnimatorStateInfo(0);
//判断动画的状态 是处于哪一个动画和 是否处于过渡
if (stateinfo.fullPathHash == Animator.StringToHash("Base Layer.Run") && !m_animator.IsInTransition(0))
{
m_animator.SetBool("Run", false);
//检测玩家 与目标点的距离是否发生改变 如果是,则重新检测 navmeshagent的目标点
if (Vector3.Distance(targetTrasform.position, m_navmeshagent.destination) > 3)
{
m_navmeshagent.SetDestination(targetTrasform.position);
}
if (m_navmeshagent.remainingDistance < 1)
{
m_animator.SetBool("Attacke", true);
}
else
{
m_animator.SetBool("Run", true);
}
}
if (stateinfo.fullPathHash == Animator.StringToHash("Base Layer.Attack") && !m_animator.IsInTransition(0))
{
m_animator.SetBool("Attack", false);
if (m_navmeshagent.remainingDistance < 1)
{
m_animator.SetBool("Attack", true);
m_navmeshagent.Stop();
}
else
{
m_animator.SetBool("Run", true);
}
}
if (stateinfo.fullPathHash == Animator.StringToHash("Base Layer.Damage") && !m_animator.IsInTransition(0))
{
m_animator.SetBool("Attack", false);
m_animator.SetBool("Run", false);
if (m_navmeshagent.remainingDistance < 1)
{
m_animator.SetBool("Attack", true);
m_navmeshagent.Stop();
}
else
{
m_animator.SetBool("Run", true);
}
}
}
}
以上这个脚本挂在敌人身上即可。