using System; using UnityEngine; public class Player : Character { [SerializeField] private Transform _hammerSpawnPoint; [SerializeField] private GameObject _hammerPrefab; [SerializeField] private Sprite _regularSprite; [SerializeField] private Sprite _noHammerSprite; public int Lives=3; private int _hammerSpeed = 5; private int _totalCoins = 0; private bool _hasKey = false; public int TotalCoins => _totalCoins; public static Player Instance { get; private set; } private GameObject _hammer; private bool _isHoldingHammer = true; public event EventHandler OnPlayerTakeItem; private void Awake() { if (Instance != null) { Destroy(gameObject); Debug.Log("There's more than one player instance"); return; } PlayerPrefs.SetString("lastExitName", string.Empty); Instance = this; DontDestroyOnLoad(gameObject); } public void AddCoin() { _totalCoins++; OnPlayerTakeItem?.Invoke(this,TreasureType.Coin); print($"player have {_totalCoins} coins"); } public void SetKey() { OnPlayerTakeItem?.Invoke(this, TreasureType.Key); print($"player have key"); _hasKey = true; } public void RemoveKey() { _hasKey = false; } public bool IsHasKey() { return _hasKey; } private void Update() { if (_hammer == null && !_isHoldingHammer) { _spriteRenderer.sprite = _regularSprite; _isHoldingHammer = true; } if (Input.GetKeyDown(KeyCode.Space) && !_isFalling) { if (_hammer == null) { _animator.SetTrigger("Body_ThrowHammer"); } } base.MoveTo(Input.GetAxisRaw("Horizontal"), isAllowVertical? Input.GetAxisRaw("Vertical"):0); } public void ThrowHammerObject() { _isHoldingHammer = false; _spriteRenderer.sprite = _noHammerSprite; _hammer = Instantiate(_hammerPrefab, _hammerSpawnPoint.position, _hammerSpawnPoint.rotation); _hammer.transform.localScale = new Vector2(_hammer.transform.localScale.x * (_facingRight ? 1 : -1), _hammer.transform.localScale.y); _hammer.GetComponent().velocity = new Vector2(gameObject.transform.localScale.x * _hammerSpeed, 0); } protected override void SetWalkingAnimation(bool isWalking) { _bonesBack.SetActive(false); _bonesSide.SetActive(true); _animator.SetBool("Legs_Walk",isWalking); _animator.SetBool("Body_Walk", isWalking); } protected override void SetClimbingAnimation(bool isClimbing) { if (isClimbing) { _bonesBack.SetActive(true); _bonesSide.SetActive(false); } _animator.SetBool("Climb", isClimbing); } protected override void OnDeath() { Lives--; Spawn(); if (Lives==0) { print("game over"); } } }