首页 > 解决方案 > Unity 中游戏对象的状态机似乎无法正常工作。它没有从“交错”变为“空闲”,而是一直在移动

问题描述

所以我目前正在用 Unity 开发我的第一款游戏(继 Taft 先生在 YouTube 上的一系列名为“使用 Unity 和 C# 制作像塞尔达一样的游戏”并且刚刚完成第 19 个视频)。

我目前有一个“日志”敌人,并且正在开发击退功能。我遵循本系列中的方法是创建一个状态机,将 Log 的状态更改为“交错”几秒钟,然后将其返回到“空闲”,这样它就可以将自己更改为“行走”。 "

但是,每当我击中 Log 时,它就会卡在交错状态并不停地漂移,直到它撞到对撞机(请注意,即使它确实撞到了对撞机,它也不会变回空闲/行走)。如果我能正确击中原木,有时玩家实际上也会向相反的方向漂移。

相关代码:

public class Log : Enemy {

    private Rigidbody2D myRigidBody;
    public Transform target;
    public float chaseRadius;
    public float attackRadius;
    public Transform homePosition;
    public Animator anim;

    // Use this for initialization
    void Start () {
        currentState = EnemyState.idle;
        myRigidBody = GetComponent<Rigidbody2D> ();
        anim = GetComponent<Animator> ();
        target = GameObject.FindWithTag ("Player").transform;

    }
    
    // FixedUpdate is called by physics.
    void FixedUpdate () {
        CheckDistance ();
    }

    //Log finds and walks towards Player.
    void CheckDistance(){
        if (Vector3.Distance (target.position, transform.position) <= chaseRadius && Vector3.Distance (target.position, transform.position) > attackRadius
&& currentState != EnemyState.stagger) 
        {
            Vector3 temp = Vector3.MoveTowards (transform.position, target.position, moveSpeed * Time.deltaTime);
            myRigidBody.MovePosition (temp);
            ChangeState (EnemyState.walk);
        } 
    }

    private void ChangeState(EnemyState newState){
        if (currentState != newState) 
        {
            currentState = newState;
        
        }
    }
}
public class Knockback : MonoBehaviour {

    public float thrust;
    public float knockTime;

    private void OnTriggerEnter2D(Collider2D other){

        if (other.gameObject.CompareTag ("breakable")) 
        {
            other.GetComponent<Pot>().Smash();
        }

        if(other.gameObject.CompareTag("enemy"))
        {
            Rigidbody2D enemy = other.GetComponent<Rigidbody2D>();
            if (enemy != null) 
            {
                enemy.GetComponent<Enemy> ().currentState = EnemyState.stagger;
                Vector2 difference = enemy.transform.position - transform.position;
                difference = difference.normalized * thrust;
                enemy.AddForce (difference, ForceMode2D.Impulse);
                StartCoroutine (KnockCo (enemy));
            }
        }
    }

    private IEnumerator KnockCo(Rigidbody2D enemy){
        if (enemy != null) 
        {
            yield return new WaitForSeconds (knockTime);
            enemy.velocity = Vector2.zero;
            enemy.GetComponent<Enemy>().currentState = EnemyState.idle;
        }
    }
}
public enum EnemyState{
    idle,
    walk,
    attack,
    stagger
}

public class Enemy : MonoBehaviour {

    public EnemyState currentState;
    public int enemyHealth;
    public string enemyName;
    public int baseAttack;
    public float moveSpeed;
}

我试图在 Log.cs 中的 void CheckDistance 之后添加一条 else 语句,但这导致 Log 出现抖动并沿其路径跳回。我不知所措。任何帮助将不胜感激!

标签: c#unity3d

解决方案


推荐阅读