0

我目前正在使用 c# 学习统一,并使用某人的教程制作了以下代码,但我认为我目前用作参考的教程并没有为我提供有关此当前错误的太多信息。我已经添加了一个名为 dead 的 bool,我将它放在 FixedUpdate() 和 Update() 上以检查是否接受输入。如果我在没有按方向键的情况下死亡,例如在攻击时死亡和在空闲时死亡......我想知道我的代码有什么问题。我会很高兴得到一些提示。这是我的 C# 代码。

播放器管理器.cs

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class PlayerManager : MonoBehaviour
 {
     Rigidbody rb;
     public float x, y, ms = 3;
     Animator animator;
     public Collider weaponCollider;
     public PlayerUIManager playerUIManager;
     public int maxHp = 100;
     public int hp;
     bool dead;
  
     // Start is called before the first frame update
     void Start()
     {
         hp = maxHp;
         ms = 3;        
         playerUIManager.Init(this);
         rb = GetComponent<Rigidbody>();
         animator = GetComponent<Animator>();
         DisableWeaponCollider();
     }
 
     void Update()
     {
         if (dead) return;
         x = Input.GetAxisRaw("Horizontal");
         y = Input.GetAxisRaw("Vertical");
         if(Input.GetKeyDown(KeyCode.Space))
         {
             animator.SetTrigger("Attack");
         }
     }
 
     void GetDamage(int damage)
     {
         hp -= damage;
         if (hp <= 0)
         {
             hp = 0;
             dead = true;
             animator.SetTrigger("Die");
         }
         playerUIManager.UpdateHp(hp);
     }
 
     private void FixedUpdate()
     {
         if (dead) return;
         Debug.Log("fixed updating");
         Vector3 velocity = new Vector3(x, 0, y) * 0.29f;
         Vector3 direction = transform.position + velocity;
         transform.LookAt(direction);
         rb.velocity = velocity;
         animator.SetFloat("Speed", rb.velocity.magnitude);
     }
 
     private void OnTriggerEnter(Collider other)
     {
         if (dead) return;
         Damager damager = other.GetComponent<Damager>();
         if (damager != null)
         {
             animator.SetTrigger("DamageReceive");
             GetDamage(damager.damage);
         }
     }
 
     public void EnableWeaponCollider()
     {
         weaponCollider.enabled = true;
     }
 
     public void DisableWeaponCollider()
     {
         weaponCollider.enabled = false;
     }
 }

DieBehavior.cs(用于我的模具动画)

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class DieBehavior : StateMachineBehaviour
 {
     override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
     {
         animator.GetComponent<PlayerManager>().ms = 0;
     }
 
     //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
     //{}
 
     //override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
     //{}
 
     //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
     //{}
 
     //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
     //{}
 }
 
4

1 回答 1

2

问题来自因为rb.velocity仍然设置。

所以你需要在设置死标志时一起重置速度。

if (hp <= 0)
{
     hp = 0;
     dead = true;
     animator.SetTrigger("Die");
     // Please add this
     rb.velocity = Vector3.zero;
}

Rigidbody.velocity一次不行。这意味着一旦你设置了速度,游戏对象就会移动,直到你重置速度。

Rigidbody.velocity表示刚体位置的变化率。

于 2020-12-10T15:23:34.460 回答