Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Four Effective Ways to Halt Player Actions After a Unity Game Ends

Tech May 9 3

Disable Dedicated Player Control Scripts

For projects organizing movement, jumping, shooting, etc., into a single controller script, add a public toggle method and lock all logic when triggered. You can disable the component entirely or use a private boolean flag to block input updates.

public class PlayerCharacterMotor : MonoBehaviour
{
    private bool _canAct = true;
    private float _moveSpeed = 5f;
    private float _jumpForce = 8f;
    private Rigidbody2D _rb;

    void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (!_canAct) return;
        HandleHorizontalInput();
        HandleJumpInput();
    }

    void HandleHorizontalInput()
    {
        float xInput = Input.GetAxisRaw("Horizontal");
        _rb.velocity = new Vector2(xInput * _moveSpeed, _rb.velocity.y);
    }

    void HandleJumpInput()
    {
        if (Input.GetButtonDown("Jump") && Mathf.Abs(_rb.velocity.y) < 0.01f)
        {
            _rb.AddForce(Vector2.up * _jumpForce, ForceMode2D.Impulse);
        }
    }

    public void LockAllActions()
    {
        _canAct = false;
        _rb.velocity = Vector2.zero;
    }
}

Delete the Player GameObject

Destroying the root player object automatically terminates all attached scripts, colliders, physics, and visuals, making it ideal for games where the player doesn’t need to remain visible post-gameover.

public class SessionController : MonoBehaviour
{
    [SerializeField] private Transform _playerSpawnPoint;
    private GameObject _activePlayer;

    void Start()
    {
        // Example player instantiation
        _activePlayer = Instantiate(Resources.Load<GameObject>("Prefabs/PlayerHero"), _playerSpawnPoint.position, Quaternion.identity);
    }

    public void WrapUpSession()
    {
        if (_activePlayer != null)
        {
            Destroy(_activePlayer);
        }
        // Additional session cleanup here
    }
}

Terminate All Player-Specific Coroutines

If actions like auto-firing, dash cooldowns, or environmental interactions rely on coroutines, explicitly cancel them to avoid leftover logic execution.

public class PlayerCombatSystem : MonoBehaviour
{
    private Coroutine _autoFireLoop;
    private bool _isCombatEnabled = true;

    void Update()
    {
        if (!_isCombatEnabled) return;
        if (Input.GetMouseButtonDown(0) && _autoFireLoop == null)
        {
            _autoFireLoop = StartCoroutine(FireContinuously());
        }
        if (Input.GetMouseButtonUp(0) && _autoFireLoop != null)
        {
            StopCoroutine(_autoFireLoop);
            _autoFireLoop = null;
        }
    }

    IEnumerator FireContinuously()
    {
        while (true)
        {
            SpawnProjectile();
            yield return new WaitForSeconds(0.15f);
        }
    }

    void SpawnProjectile() { /* Projectile logic */ }

    public void DisableCombatAndCoroutines()
    {
        _isCombatEnabled = false;
        StopAllCoroutines();
    }
}

Broadcast via a Singleton Game Menager

Use a static singleton manager to notify every player controller in the scane, perfect for local co-op or multiplayer setups.

public class GlobalGameState : MonoBehaviour
{
    public static GlobalGameState Instance { get; private set; }
    public bool IsGameOver { get; private set; }

    void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
        DontDestroyOnLoad(gameObject);
    }

    public void TriggerGameOver()
    {
        if (IsGameOver) return;
        IsGameOver = true;
        PlayerCharacterMotor[] allControllers = FindObjectsOfType<PlayerCharacterMotor>();
        PlayerCombatSystem[] allCombat = FindObjectsOfType<PlayerCombatSystem>();
        foreach (var controller in allControllers)
        {
            controller.LockAllActions();
        }
        foreach (var combat in allCombat)
        {
            combat.DisableCombatAndCoroutines();
        }
    }
}
  • Always validate references before calling disable/destroy methods to prevent null reference exceptions.
  • For split-script player setups, ensure every relevant script (motor, combat, UI input) receives a stop signal.
  • Add physics velocity resets when using flags or script disabling to prevent sliding or residual movement.
  • Use FindObjectsOfType overloasd with includeInactive: true if players might be hidden before gameover.

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.