c# - 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 出现抖动并沿其路径跳回。我不知所措。任何帮助将不胜感激!
解决方案
推荐阅读
- pytorch - 如何在pytorch中加载tfrecord?
- python - 带有字符 u'\u2013 的 UnicodeEncodeError
- python - re.compile 是如何工作的
- c++ - 给定 X,确定 n,其中 X 是第 n 个丑数
- javascript - 不使用背景图像的水印
- javascript - 如何比较表格中的两个数字?
- php - Laravel 视频标签未在 Safari 或任何其他 IOS 设备中显示,但可以在 Chrome、Mozilla Firefox 和 IE 中显示
- c++ - 单击任意位置将最大化我用 setwindowpos() 隐藏的窗口
- java - 在随机数组中找到 10 个最高频率 - Java
- python - python中的正则表达式根据字符串的匹配过滤文件