如何让敌人角色停止盘旋玩家?

时间:2018-06-03 23:18:47

标签: c# unity3d artificial-intelligence

我现在已经试图解决这个问题几天了,而且我非常确定它与我的代码有关。我希望敌人怪物做的是当玩家紧挨着它并且运行攻击动画时停止向前移动。它实际上做的是在像行星一样围绕玩家的轨道运行攻击动画,你无法真正超越它。

我使用Unity3d作为引擎,我的代码是用C#编写的。它非常简单,所以我担心我错过了一些重要的东西。

public class enemyAITest : MonoBehaviour 
{
    public Transform player;      // target
    public float playerDistance;  // determines how far from target before action takes place
    public float rotationDamping; // determines how quickly rotation occurs
    public float chaseSpeed;      // determines how quickly to pursue target
    public float wanderSpeed;     // determines how quickly to move around map
    public float maxDist;

    static Animator anim;
    Vector3 wayPoint;


    void Awake()
    {
       anim = GetComponent<Animator>();
    } 

    // Update is called once per frame
    void Update () 
    {
        transform.position += transform.TransformDirection(Vector3.forward) * wanderSpeed * Time.deltaTime;
        playerDistance = Vector3.Distance(player.position, transform.position);

            while ((transform.position - wayPoint).magnitude < 3)
                Wander();

            if (playerDistance < 20f)
            {
               LookAtPlayer();
               wanderSpeed = 0;
               anim.SetBool("isIdle", true);
            }

            if (playerDistance < 10f)
            {
               Chase();
               anim.SetBool("isIdle", false);
               anim.SetBool("isWalking", false);
               anim.SetBool("isRunning", true);                           
            }

            if(playerDistance < 1f)
            {
                wanderSpeed = 0;
                anim.SetBool("isRunning", false);
                anim.SetBool("isAttacking", true);
            }
       else anim.SetBool("isWalking", true);
    }

    void LookAtPlayer()
    {
        Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * rotationDamping);
        wanderSpeed = 0;
    }

    void Chase()
    {
        Vector3 direction = player.position - transform.position;
        direction.y = 0;
        transform.Translate(Vector3.forward * chaseSpeed * Time.deltaTime);
    }

       void Wander()
    {
        Vector3 MonsterPosition = new Vector3(Random.Range(transform.position.x - maxDist, transform.position.x + maxDist), 1, Random.Range(transform.position.z - maxDist, transform.position.z + maxDist));
        wayPoint.y = 1;
        transform.LookAt(wayPoint);
        //Debug.Log(wayPoint + " and " + (transform.position - wayPoint).magnitude);
    }
}

任何建议都会有所帮助(请原谅奇怪的格式化,我在保存整个Wander方法和代码块中的Awake行时遇到问题。)

0 个答案:

没有答案