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:
@@ -0,0 +1,82 @@
|
||||
using UnityEngine;
|
||||
|
||||
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;
|
||||
private bool _characterInRange = false;
|
||||
|
||||
private BoxCollider2D _boxCollider;
|
||||
private SpriteRenderer _spriteRenderer;
|
||||
|
||||
[SerializeField]
|
||||
private GameObject _hitParticles;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
_respawnElementTimer = _respawnTimeout;
|
||||
_boxCollider = GetComponent<BoxCollider2D>();
|
||||
_spriteRenderer = GetComponentInChildren<SpriteRenderer>();
|
||||
}
|
||||
|
||||
public override void Hit()
|
||||
{
|
||||
IsEnabled = false;
|
||||
_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;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (_needRespawn)
|
||||
{
|
||||
_respawnElementTimer -= Time.deltaTime;
|
||||
if (_respawnElementTimer <= 0)
|
||||
{
|
||||
_respawnElementTimer = _respawnTimeout;
|
||||
|
||||
if (_characterInRange)
|
||||
{
|
||||
print("Character is dead");
|
||||
}
|
||||
IsEnabled = true;
|
||||
_boxCollider.isTrigger = false;
|
||||
_spriteRenderer.enabled = IsEnabled;
|
||||
_needRespawn = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTriggerEnter2D(Collider2D collider)
|
||||
{
|
||||
var character = collider.GetComponent<Character>();
|
||||
if (character)
|
||||
{
|
||||
_characterInRange = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTriggerExit2D(Collider2D collider)
|
||||
{
|
||||
var character = collider.GetComponent<Character>();
|
||||
if (character)
|
||||
{
|
||||
_characterInRange = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8251b2e2708d87d4ebc446c84ec5ed01
|
||||
@@ -0,0 +1,52 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class Chest : MonoBehaviour
|
||||
{
|
||||
[SerializeField]
|
||||
private Animator animator;
|
||||
[SerializeField]
|
||||
private TreasureSO _treasureSO;
|
||||
|
||||
private Transform _treasureObject;
|
||||
private bool _isOpen = false;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_treasureObject = transform.GetChild(1);
|
||||
var spriteRenderer = _treasureObject.GetComponent<SpriteRenderer>();
|
||||
|
||||
spriteRenderer.sprite = _treasureSO.Image;
|
||||
}
|
||||
|
||||
private void OnTriggerEnter2D(Collider2D collider)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ded23e667cffbfd46b2633ae22204797
|
||||
@@ -0,0 +1,63 @@
|
||||
using Assets.Scripts;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
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()
|
||||
{
|
||||
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!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: af69aa896ad8a3947947ed21a9b9cacd
|
||||
@@ -0,0 +1,45 @@
|
||||
using Assets.Scripts;
|
||||
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>();
|
||||
}
|
||||
|
||||
private void OnTriggerEnter2D(Collider2D collider)
|
||||
{
|
||||
if (_hasTriggered)
|
||||
return;
|
||||
|
||||
var playerState = collider.GetComponent<PlayerState>();
|
||||
if (playerState != null)
|
||||
{
|
||||
// Check if player has key through GameManager
|
||||
if (GameManager.Instance != null && GameManager.Instance.HasKey)
|
||||
{
|
||||
_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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 73fd9f6c116c2de4ab3d773fbb908df4
|
||||
@@ -0,0 +1,37 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class KeyChest : MonoBehaviour
|
||||
{
|
||||
private bool _isOpened = false;
|
||||
|
||||
private void OnTriggerEnter2D(Collider2D collider)
|
||||
{
|
||||
if (_isOpened)
|
||||
return;
|
||||
|
||||
var playerState = collider.GetComponent<PlayerState>();
|
||||
if (playerState != null)
|
||||
{
|
||||
_isOpened = true;
|
||||
|
||||
// Update player state
|
||||
playerState.SetKey();
|
||||
|
||||
// Notify GameManager of key collection
|
||||
if (GameManager.Instance != null)
|
||||
{
|
||||
GameManager.Instance.SetKeyState(true);
|
||||
}
|
||||
|
||||
// Notify LevelManager of key collection
|
||||
if (LevelManager.Instance != null)
|
||||
{
|
||||
LevelManager.Instance.NotifyKeyCollected();
|
||||
}
|
||||
|
||||
// Destroy the chest
|
||||
Destroy(gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf81d521c74041643b3e8f0569c55a0f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 541209b3a8828a3429d3a6c93b0350f3, type: 3}
|
||||
m_Name: BreakableWall
|
||||
m_EditorClassIdentifier:
|
||||
ElementType: 4
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: da0ec95da6f0526499978941b1631c3e
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 541209b3a8828a3429d3a6c93b0350f3, type: 3}
|
||||
m_Name: Bridge
|
||||
m_EditorClassIdentifier:
|
||||
ElementType: 3
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 259faf1cdf30b1c409b6da9323046336
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,4 @@
|
||||
public interface IMapElement
|
||||
{
|
||||
void Hit();
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b86c6d8ca1e490043a8947dc9f2339a3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 541209b3a8828a3429d3a6c93b0350f3, type: 3}
|
||||
m_Name: Ladder
|
||||
m_EditorClassIdentifier:
|
||||
ElementType: 2
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8a480e639bc6f0c44815c3b3dd16e0aa
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,16 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
public class MapElement : MonoBehaviour, IMapElement
|
||||
{
|
||||
[SerializeField]
|
||||
private MapElementSO _elementSO;
|
||||
public MapElementSO ElementSO => _elementSO;
|
||||
public bool IsEnabled { get; set; } = true;
|
||||
|
||||
public Transform GlobalTransform { get; set; }
|
||||
|
||||
public virtual void Hit()
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: edf40d39eadb17a4ebb0368b3ac5399a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,7 @@
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu()]
|
||||
public class MapElementSO : ScriptableObject
|
||||
{
|
||||
public MapElementType ElementType;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 541209b3a8828a3429d3a6c93b0350f3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 541209b3a8828a3429d3a6c93b0350f3, type: 3}
|
||||
m_Name: Wall
|
||||
m_EditorClassIdentifier:
|
||||
ElementType: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3ddd02ac61c9b634aa71ab17c40521b7
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 541209b3a8828a3429d3a6c93b0350f3, type: 3}
|
||||
m_Name: Water
|
||||
m_EditorClassIdentifier:
|
||||
ElementType: 5
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 59cbe601225090b41a19270c63bc6390
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user