0

I am currently learning unity using c# and I made the following code using someones tutorial but I think the tutorial I am currently using as a reference is not giving me much info about this current bug. I already added a bool called dead which I placed on FixedUpdate() and Update() to check whether to accept input or not. It works well if I die without pressing directional keys like dying while attacking and dying while idle... I want to know what is wrong with my code. I would be very happy for some hints. Here is my c# code.

PlayerManager.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 (for my die animation)

 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)
     //{}
 }
 
Johji
  • 240
  • 1
  • 19

1 Answers1

2

The issue comes from because rb.velocity is still set.

So you need to reset velocity together when you set dead flag.

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

Rigidbody.velocity doesn't work once. It means once you set velocity, the GameObject moves until you reset velocity.

Rigidbody.velocity represents the rate of change of Rigidbody position.

Satoshi Naoki
  • 353
  • 2
  • 10
  • Thank you very much!, any tips on how to debug and find bugs like this ? – Johji Dec 10 '20 at 16:15
  • 1
    To find a solution easily, you need to follow the code flow step by step. In this case, you had a problem with player movement. So first of all, I checked what kind of method you used to make a player moves. Once I found that you use velocity, I again checked where you set the dead flag. There, I noticed that you didn't reset velocity. – Satoshi Naoki Dec 10 '20 at 16:27