Add player controller, state management, and input handling

- Implemented PlayerController.cs to manage player movement and actions.
- Created PlayerState.cs to track player lives, coins, and key status.
- Added CameraFollow.cs for smooth camera movement following the player.
- Developed Character.cs as an abstract class for character behavior.
- Introduced Enums.cs for defining TreasureType and MapElementType.
- Added IDoor interface for door interactions.
- Created InputActions.cs for handling player input actions.
- Implemented MainMenu.cs for basic menu functionality including play and exit options.
This commit is contained in:
2026-06-17 22:43:59 +03:00
parent dabd056e8b
commit 39e4e51866
70 changed files with 1807 additions and 99 deletions
@@ -2,6 +2,9 @@
public class BreakableWall : MapElement
{
[SerializeField] private float _noiseRadius = 10f;
[SerializeField] private bool _emitNoiseOnBreak = true;
private float _respawnElementTimer;
private int _respawnTimeout = 4;
private bool _needRespawn = false;
@@ -16,18 +19,24 @@ public class BreakableWall : MapElement
private void Start()
{
_respawnElementTimer = _respawnTimeout;
_boxCollider =GetComponent<BoxCollider2D>();
_spriteRenderer= GetComponentInChildren<SpriteRenderer>();
_boxCollider = GetComponent<BoxCollider2D>();
_spriteRenderer = GetComponentInChildren<SpriteRenderer>();
}
public override void Hit()
{
IsEnabled = false;
_boxCollider.isTrigger=true;
_boxCollider.isTrigger = true;
_spriteRenderer.enabled = IsEnabled;
Instantiate(_hitParticles, transform.position, Quaternion.identity);
// Emit noise when wall breaks
if (_emitNoiseOnBreak && NoiseSystem.Instance != null)
{
NoiseSystem.Instance.Emit(transform.position, _noiseRadius);
}
_respawnElementTimer = _respawnTimeout;
_needRespawn = true;
}
@@ -41,7 +50,7 @@ public class BreakableWall : MapElement
{
_respawnElementTimer = _respawnTimeout;
if(_characterInRange)
if (_characterInRange)
{
print("Character is dead");
}
@@ -70,6 +79,4 @@ public class BreakableWall : MapElement
_characterInRange = false;
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 8251b2e2708d87d4ebc446c84ec5ed01
+17 -5
View File
@@ -8,31 +8,43 @@ public class Chest : MonoBehaviour
private TreasureSO _treasureSO;
private Transform _treasureObject;
private bool _isOpen=false;
private bool _isOpen = false;
private void Awake()
{
_treasureObject=transform.GetChild(1);
var spriteRenderer=_treasureObject.GetComponent<SpriteRenderer>();
_treasureObject = transform.GetChild(1);
var spriteRenderer = _treasureObject.GetComponent<SpriteRenderer>();
spriteRenderer.sprite = _treasureSO.Image;
}
private void OnTriggerEnter2D(Collider2D collider)
{
var playerState=collider.GetComponent<PlayerState>();
var playerState = collider.GetComponent<PlayerState>();
if (playerState != null && !_isOpen)
{
_isOpen = true;
animator.SetTrigger("OpenChest");
switch (_treasureSO.Treasure)
{
case TreasureType.Coin:
playerState.AddCoin();
if (GameManager.Instance != null)
{
GameManager.Instance.AddTreasure(1);
}
break;
case TreasureType.Key:
playerState.SetKey();
if (GameManager.Instance != null)
{
GameManager.Instance.SetKeyState(true);
}
if (LevelManager.Instance != null)
{
LevelManager.Instance.NotifyKeyCollected();
}
break;
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: ded23e667cffbfd46b2633ae22204797
+51 -5
View File
@@ -1,17 +1,63 @@
using Assets.Scripts;
using System;
using UnityEngine;
public class Door : MonoBehaviour,IDoor
public class Door : MonoBehaviour, IDoor
{
[SerializeField]
private Sprite _openDoor;
[SerializeField]
private bool _debugMode = false;
private SpriteRenderer _spriteRenderer;
private BoxCollider2D _boxCollider;
private bool _isLocked = true;
public bool IsLocked => _isLocked;
public event EventHandler OnDoorOpened;
private void Awake()
{
_spriteRenderer = GetComponentInChildren<SpriteRenderer>();
_boxCollider = gameObject.GetComponent<BoxCollider2D>();
}
public void OpenDoor()
{
//PlayOpenAnimation
GetComponentInChildren<SpriteRenderer>().sprite= _openDoor;
//Disable box collider
gameObject.GetComponent<BoxCollider2D>().enabled=false;
if (!_isLocked)
return;
_isLocked = false;
// Update visuals
if (_spriteRenderer != null && _openDoor != null)
{
_spriteRenderer.sprite = _openDoor;
}
// Disable collision
if (_boxCollider != null)
{
_boxCollider.enabled = false;
}
if (_debugMode)
Debug.Log("[Door] Door opened!");
OnDoorOpened?.Invoke(this, EventArgs.Empty);
}
public void LockDoor()
{
_isLocked = true;
if (_boxCollider != null)
{
_boxCollider.enabled = true;
}
if (_debugMode)
Debug.Log("[Door] Door locked!");
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: af69aa896ad8a3947947ed21a9b9cacd
@@ -4,21 +4,41 @@ using UnityEngine;
public class DoorInteract : MonoBehaviour
{
[SerializeField] private GameObject _doorGameObject;
[SerializeField] private bool _debugMode = false;
private IDoor _door;
private bool _hasTriggered = false;
private void Awake()
{
_door =_doorGameObject.GetComponent<IDoor>();
_door = _doorGameObject.GetComponent<IDoor>();
}
private void OnTriggerEnter2D(Collider2D collider)
{
if (_hasTriggered)
return;
var playerState = collider.GetComponent<PlayerState>();
if (playerState!=null)
if (playerState != null)
{
if (playerState.HasKey)
// Check if player has key through GameManager
if (GameManager.Instance != null && GameManager.Instance.HasKey)
{
_door.OpenDoor();
_hasTriggered = true;
if (_debugMode)
Debug.Log("[DoorInteract] Player exiting with key!");
// Notify LevelManager that level is complete
if (LevelManager.Instance != null)
{
LevelManager.Instance.NotifyLevelComplete();
}
}
else if (_debugMode)
{
Debug.Log("[DoorInteract] Player reached door but does not have key!");
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 73fd9f6c116c2de4ab3d773fbb908df4