我正在尝试在Unity中制作一个先进的敌人AI脚本,但我正在努力解决这个问题。我已经导入了动画和所有动画,但脚本编写部分并没有那么顺利。
我正在尝试做什么: NPC应该在一定半径内行走( isWalking ),闲置( isIdle )几秒钟,然后再次行走( isWalking )。
当玩家进入NPC的视野半径时,NPC应该在玩家(运动)之后运行,并在玩家处于近距离( isAttacking )时进行攻击。当玩家超出范围时,NPC应播放第二个空闲动画( isIdle2 ),然后返回第一个空闲动画( isIdle )。
最后,当按下电子琴键时,NPC应播放一次谈话动画( isTalking )。
这是我目前的剧本:
using UnityEngine;
using System.Collections;
public class guardAttack : MonoBehaviour {
public Transform player;
static Animator anim;
// Use this for initialization
void Start ()
{
anim = GetComponent<Animator>();
}
// Update is called once per frame
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.1f);
anim.SetBool ("isIdle", false);
if ((direction.magnitude > 5)) {
this.transform.Translate (0, 0, 0.10f);
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);
}
}
}
}
答案 0 :(得分:0)
你想要使用的是有限状态机 - 我并不是指Mecanim - 用于AI逻辑。这是一个很酷的教程,它使用接口并将添加到您的脚本知识工具箱中#34;。它可能看起来有点压倒性,但如果你试一试,它将准确解决你打算做什么,并帮助你的游戏中的其他方面。
请记住,这种&#34;反射&#34; - 行为只是在人工智能领域的表面。