我正在尝试在Unity中制作一个高级敌人AI脚本,但我对此有点挣扎。我已经导入了动画和所有内容,但是脚本部分进展得并不顺利。
我想做什么:NPC应该在一定半径内行走(isWalking),空闲(isIdle)几秒钟,然后再次行走(isWalking)。
当玩家进入NPC的视野半径内时,NPC应该追赶玩家(isRunning),并在玩家在近距离内时进行攻击(isAttacking)。当玩家超出范围时,NPC 应播放一次第二个空闲动画 (isIdle2),然后返回到第一个空闲动画 (isIdle)。
最后,当按下E键时,NPC应该播放一次谈话动画(isTalking)。
这是我当前的脚本:
using UnityEngine;
using System.Collections;
public class guardAttack: MonoBehaviour
{
public Transform player;
static Animator anim;
// Use this for initialization
public void Start()
{
anim = GetComponent<Animator>();
}
// Update is called once per frame
public void Update()
{
Vector3 direction = player.position - this.transform.position;
float angle = Vector3.Angle(direction, this.transform.forward);
if (Vector3.Distance(player.position, this.transform.position) < 10 && angle < 30)
{
direction.y = 0;
this.transform.rotation = Quaternion.Slerp(this.transform.rotation,
Quaternion.LookRotation(direction), 0.1 f);
anim.SetBool("isIdle", false);
if ((direction.magnitude > 5))
{
this.transform.Translate(0, 0, 0.10 f);
anim.SetBool("isRunning", true);
anim.SetBool("isAttacking", false);
anim.SetBool("isTalking", false);
anim.SetBool("isIdle2", false);
}
else
{
anim.SetBool("isRunning", false);
anim.SetBool("isAttacking", true);
anim.SetBool("isTalking", false);
anim.SetBool("isIdle2", false);
}
}
else
{
anim.SetBool("isIdle", true);
anim.SetBool("isRunning", false);
anim.SetBool("isAttacking", false);
anim.SetBool("isIdle2", false);
if (Input.GetKeyDown(KeyCode.E))
{
anim.SetBool("isTalking", true);
}
}
}
}
你想要使用的是有限状态机——我的意思不是 Mecanim——用于 AI 逻辑。这是一个很酷的教程,它使用接口,并将添加到您的脚本"知识工具箱"中。它可能看起来有点压倒性,但如果你试一试,它将准确地解决你打算做的事情,并在你的游戏中的其他方面提供帮助。
请记住,这种"反射"行为只是人工智能领域的表面。
https://unity3d.com/learn/tutorials/topics/scripting/using-interfaces-make-state-machine-ai?playlist=17117