Forum begins after the advertisement:


[part 6] crawler enemy bugging

Home Forums Video Game Tutorial Series Creating a Metroidvania in Unity [part 6] crawler enemy bugging

  • This topic has 3 replies, 3 voices, and was last updated 1 year ago by Aka.
Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #12549
    Niyam Shah
    Level 8
    Participant
    Helpful?
    Up
    0
    ::

    my crawler enemies movement distance is depending on the speed i set

    50 speed will be fast with a long distance while 10 speed will be slow with a rlly short distance

    also plssssss allow the blog part 6-10 to be free bc they r so vital to check if you have code errors bc the videos r sooo fast

    using UnityEngine;
    
    public class Crawler : Enemy
    {
        [SerializeField] private float flipWaitTime;
        [SerializeField] private float ledgeCheckX;
        [SerializeField] private float ledgeChecky;
        [SerializeField] private LayerMask whatIsGround;
    
    
        float timer;
    
        // Start is called before the first frame update
        protected override void Start()
        {
            base.Start();
            rb.gravityScale = 12f;
        }
    
        // Update is called once per frame
    
        protected override void UpdateEnemyStates()
        {
            switch (currentEnemyStates)
            {
                case EnemyStates.Crawler_Idle:
                    Vector3 _ledgeCheckStart = transform.localScale.x > 0 ? new Vector3(ledgeCheckX, 0) : new Vector3(-ledgeCheckX, 0);
                    Vector2 _wallCheckDir = transform.localScale.x > 0 ? transform.right : -transform.right;
    
                    if (!Physics2D.Raycast(transform.position + _ledgeCheckStart, Vector2.down, ledgeChecky, whatIsGround)
                        || Physics2D.Raycast(transform.position, _wallCheckDir, ledgeCheckX, whatIsGround))
                    {
                        ChangeState(EnemyStates.Crawler_Flip);
                    }
    
                    if (transform.localScale.x > 0)
                    {
                        rb.velocity = new Vector2(speed, rb.velocity.y);
                    }
                    else
                    {
                        rb.velocity = new Vector2(-speed, rb.velocity.y);
                    }
                    break;
    
                case EnemyStates.Crawler_Flip:
                    timer += Time.deltaTime;
    
                    if (timer > flipWaitTime)
                    {
                        timer = 0;
                        transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
                        ChangeState(EnemyStates.Crawler_Idle);
                    }
                    break;
            }
        }
    }
    
    using UnityEngine;
    
    public class Enemy : MonoBehaviour
    {
        [SerializeField] protected float health;
        [SerializeField] protected float recoilLength;
        [SerializeField] protected float recoilFactor;
        [SerializeField] protected bool isRecoiling = false;
    
        [SerializeField] protected float speed;
    
        [SerializeField] protected float damage;
    
        protected float recoilTimer;
        protected Rigidbody2D rb;
    
        protected enum EnemyStates
        {
            //crawler
            Crawler_Idle,
            Crawler_Flip
        }
        protected EnemyStates currentEnemyStates;
    
        // Start is called before the first frame update
        protected virtual void Start()
        {
            rb = GetComponent<Rigidbody2D>();
        }
    
        // Update is called once per frame
        //enemy death and recoil
        protected virtual void Update()
        {
    
            if (isRecoiling)
            {
                if (recoilTimer < recoilLength)
                {
                    recoilTimer += Time.deltaTime;
                }
                else
                {
                    isRecoiling = false;
                    recoilTimer = 0;
                }
            }
            else
            {
                UpdateEnemyStates();
            }
        }
    
        //enemy takes damage and has recoil
        public virtual void EnemyHit(float _damageDone, Vector2 _hitDirection, float _hitForce)
        {
            health -= _damageDone;
    
            if (!isRecoiling)
            {
                rb.AddForce(-_hitForce * recoilFactor * _hitDirection);
            }
        }
    
        //make player take damage when trigger collider touches player collider - not when player is invincible
        protected void OnCollisionStay2D(Collision2D _other)
        {
            if (_other.gameObject.CompareTag("Player") && !PlayerController.Instance.pState.invincible)
            {
                Attack();
                PlayerController.Instance.HitStopTime(0, 5, 0.5f);
            }
        }
    
        protected virtual void UpdateEnemyStates() { }
    
            protected void ChangeState(EnemyStates _newState)
        {
            currentEnemyStates = _newState;
        }
    
        protected virtual void Attack()
        {
            PlayerController.Instance.TakeDamage(damage);
        }
    
    }
    #12550
    Niyam Shah
    Level 8
    Participant
    Helpful?
    Up
    0
    ::

    ok i found the fix

    the ledge check y value was too low – not sure why but a really low value makes it constantly detect a ledge – i set mine to 1.5

    the ledge check value should be higher – i set mine to 3

    they work in opposites]

    really strange but it works now

    #12566
    Terence
    Level 30
    Keymaster
    Helpful?
    Up
    0
    ::

    Glad you managed to find the solution Niyam.

    #12728
    Aka
    Level 4
    Former Patron
    Helpful?
    Up
    0
    ::

    Always use Gizmos when you use Raycast. The ray check depend of your asset. If you dont use exactly the same asset, the value must be different. Gizmos help you

    Here by example :

    private void OnDrawGizmosSelected() { _ledgeCheckStart = transform.localScale.x > 0 ? new Vector3(ledgeCheckX, 0) : new Vector3(-ledgeCheckX, 0); Gizmos.color = Color.blue; Gizmos.DrawRay(transform.position + _ledgeCheckStart, Vector2.down * ledgeCheckY); }

Viewing 4 posts - 1 through 4 (of 4 total)
  • You must be logged in to reply to this topic.

Go to Login Page →


Advertisement below: