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
- This topic has 0 replies, 1 voice, and was last updated 1 week, 3 days ago by
Nirvik Rajbhandari.
-
AuthorPosts
-
April 14, 2026 at 9:47 am #19403::
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; } }}
-
AuthorPosts
- You must be logged in to reply to this topic.
Advertisement below: