Forum begins after the advertisement:
[Part 3] Problem with my Zombie enemy script
Home › Forums › Video Game Tutorial Series › Creating a Metroidvania in Unity › [Part 3] Problem with my Zombie enemy script
- This topic has 3 replies, 2 voices, and was last updated 11 months, 2 weeks ago by Terence.
-
AuthorPosts
-
January 8, 2024 at 9:02 am #13052::
So, not sure what my issue is but after my player hits my zombie player the third time (first hit and second hit are fine!), my zombie just goes backwards. I wrote this also on the video comments on YouTube.
Here’s my enemy script. I’ve tried playing around with it to get this to stop. And I am just at a loss:
<code>using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { [SerializeField] protected Animator animator; [Header("Enemy Stats")] [SerializeField] protected float health; [SerializeField] protected float speed; [SerializeField] protected float attackDamage; [Header("Enemy Recoil")] [SerializeField] protected float recoilLength; [SerializeField] protected float recoilFactor; [SerializeField] protected bool isRecoiling = false; protected float recoilTimer; protected Rigidbody2D rb; protected bool takenDamage = false; protected virtual void Awake() { rb = GetComponent<Rigidbody2D>(); } // Update is called once per frame protected virtual void Update() { takenDamage = false; //every frame sets the takenDamage bool to false Death(); Recoil(); } protected virtual void Recoil() { //Recoils the Enemy if (isRecoiling) { if(recoilTimer < recoilLength) { recoilTimer += Time.deltaTime; } else { isRecoiling = false; recoilTimer = 0; } } } public virtual void EnemyHit(float damageDone, Vector2 hitDir, float hitForce) { if (takenDamage) return; //if Enemy is hit, damage is done and recoils from hit health -= damageDone; animator.SetTrigger("Hit"); if(!isRecoiling ) { isRecoiling = true; rb.AddForce(-hitForce * recoilFactor * hitDir); } takenDamage = true; } protected void OnTriggerStay2D(Collider2D other) { if (other.CompareTag("Player") && !(PlayerController.Instance.pState.invincible)) { Attack(); } } protected virtual void Attack() { PlayerController.Instance.TakeDamage(attackDamage); isRecoiling = true; } protected virtual void Death() { //When enemy loses all health, they will be destroyed if (health <= 0) { Destroy(gameObject); } } }</code>
And Here is my Zombie Code:
<code>using System.Collections; using System.Collections.Generic; using UnityEngine; public class Zombie : Enemy { [SerializeField] private GameObject player; protected override void Awake() { rb = GetComponentInParent<Rigidbody2D>(); //My Zombie GameOBject is in my Main Enemy gameObject for organization purposes. } private void Start() { rb.gravityScale = 12f; } protected override void Update() { base.Update(); Flip(); ChasePlayer(); } public override void EnemyHit(float damageDone, Vector2 hitDir, float hitForce) { base.EnemyHit(damageDone, hitDir, hitForce); } protected void ChasePlayer() { if (!isRecoiling) { transform.position = Vector2.MoveTowards(transform.position, new Vector2(player.transform.position.x, transform.position.y), speed * Time.deltaTime); animator.SetInteger("State", 1); animator.SetBool("IsZombie", true); } } protected void Flip() { if (player.transform.position.x < transform.position.x) { transform.localScale = new Vector2(-1, transform.localScale.y); } else if (player.transform.position.x >= transform.position.x) { transform.localScale = new Vector2(1, transform.localScale.y); } } }</code>
January 8, 2024 at 4:45 pm #13061::Hi Kristine, thanks for making the post.
Can you show me a recording of this happening? If you know how to, select your Zombie in the recording as well with the Rigidbody exposed on the Inspector so I can have a look.
January 9, 2024 at 2:07 pm #13066::I actually fixed it by making a new enemy and setting it up. Not sure why the first enemy caused issues, but it now works. Thanks for the tutorials. They are great!
January 9, 2024 at 10:37 pm #13072 -
AuthorPosts
- You must be logged in to reply to this topic.
Advertisement below: