Forum begins after the advertisement:


[Part 6] Difficulty with Charger Enemy

Home Forums Video Game Tutorial Series Creating a Metroidvania in Unity [Part 6] Difficulty with Charger Enemy

Viewing 1 post (of 1 total)
  • Author
    Posts
  • #19403
    Nirvik Rajbhandari
    Level 6
    Participant
    Helpful?
    Up
    0
    ::

    My charger enemy is not switching to the surprised state until the player is really close to the charger. I am pretty sure the raycast starts outside the charger’s collider and I have tried using a Layermask but it has not worked. using System.Collections; using System.Collections.Generic; using UnityEngine;

    public class Charger : Enemy { float timer; [SerializeField] private float ledgeCheckX; [SerializeField] private float ledgeCheckY; [SerializeField] private float chargeSpeedMultiplier; [SerializeField] private float chargeDuration; [SerializeField] private float jumpForce; [SerializeField] private LayerMask whatIsGround;

    // Start is called before the first frame update
    protected override void Start()
    {
        base.Start();
        ChangeState(EnemyStates.Charger_Idle);
        rb.gravityScale = 12f;
    }
    
    protected override void UpdateEnemyStates()
    {
        if(health <= 0)
        {
            Destroy(gameObject, 0.05f);
        }
    
        Vector3 _ledgeCheckStart = transform.localScale.x > 0 ? new Vector3(ledgeCheckX, 0) : new Vector3(-ledgeCheckX, 0);
        Vector2 _wallCheckDir = transform.localScale.x > 0 ? transform.right : -transform.right;
    
        switch (GetCurrentEnemyState)
        {
            case EnemyStates.Charger_Idle:
            Debug.DrawRay(transform.position + _ledgeCheckStart, _wallCheckDir * ledgeCheckX * 10, Color.red);
    
            if(!Physics2D.Raycast(transform.position + _ledgeCheckStart, Vector2.down, ledgeCheckY, whatIsGround) || Physics2D.Raycast(transform.position, _wallCheckDir, ledgeCheckX, whatIsGround))
            {
                transform.localScale = new Vector2(transform.localScale.x * -1, transform.localScale.y);
            }
    
            RaycastHit2D _hit = Physics2D.Raycast(transform.position + _ledgeCheckStart, _wallCheckDir, ledgeCheckX * 10);
            if(_hit.collider != null && _hit.collider.gameObject.CompareTag("Player"))
            {
                ChangeState(EnemyStates.Charger_Surprised);
            }
    
            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.Charger_Surprised:
                rb.velocity = new Vector2(0, jumpForce);
                ChangeState(EnemyStates.Charger_Charging);
                break;
    
            case EnemyStates.Charger_Charging:
                timer += Time.deltaTime;
                if(timer < chargeDuration)
                {
                    if(Physics2D.Raycast(transform.position + _ledgeCheckStart, Vector2.down, ledgeCheckY, whatIsGround))
                    {
                        if(transform.localScale.x > 0)
                        {
                            rb.velocity = new Vector2(speed * chargeSpeedMultiplier, rb.velocity.y);
                        }
                        else
                        {
                            rb.velocity = new Vector2(-speed * chargeSpeedMultiplier, rb.velocity.y);
                        }
                    }
                    else
                    {
                        rb.velocity = new Vector2(0, rb.velocity.y);
                    }
                }
                else
                {
                    timer = 0;
                    ChangeState(EnemyStates.Charger_Idle);
                }
                break;
        }
    }
    
    protected override void ChangeEnemyAnimation()
    {
        if(GetCurrentEnemyState == EnemyStates.Charger_Idle)
        {
            anim.speed = 1;
        }
        if(GetCurrentEnemyState == EnemyStates.Charger_Charging)
        {
            anim.speed *= chargeSpeedMultiplier;
        }
    }

    }

Viewing 1 post (of 1 total)
  • You must be logged in to reply to this topic.

Go to Login Page →


Advertisement below: