using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class PlayerController : ActorController { private Rigidbody2D rigidbody2d; private bool walking = false; private EDirectionType direction; protected new void Awake() { base.Awake(); // 绑定玩家控制器 GameManager.Instance.PlayerManager.BindPlayer(this); // 绑定输入事件 GameManager.Instance.EventManager.OnMoveInput = OnMoveInputEvent; rigidbody2d = GetComponent(); } private void OnEnable() { walking = false; } void Update() { CheckAnimator(); } private void OnTriggerEnter2D(Collider2D collision) { // 捡东西 if (collision.CompareTag("Item")) { // 宝石自动使用 if (collision.GetComponent().ID == 7) { GameManager.Instance.PlayerManager.PlayerInfo.Attack += 3; GameManager.Instance.UIManager.ShowInfo($"获得 {GameManager.Instance.ResourceManager.GetResourceInfo(EResourceType.Item, 7).Name} 1 个,增加 3 点攻击力。"); GameManager.Instance.PoolManager.RecycleResource(collision.gameObject); GameManager.Instance.SoundManager.PlaySound(ESoundType.Effect, "PickUp"); } else if (collision.GetComponent().ID == 8) { GameManager.Instance.PlayerManager.PlayerInfo.Defence += 3; GameManager.Instance.UIManager.ShowInfo($"获得 {GameManager.Instance.ResourceManager.GetResourceInfo(EResourceType.Item, 8).Name} 1 个,增加 3 点防御力。"); GameManager.Instance.PoolManager.RecycleResource(collision.gameObject); GameManager.Instance.SoundManager.PlaySound(ESoundType.Effect, "PickUp"); } else GameManager.Instance.BackpackManager.PickUp(collision.GetComponent()); } // 打怪 else if (collision.CompareTag("Enemy")) GameManager.Instance.CombatManager.StartFight(collision.GetComponent()); } private void OnDestroy() { // 解绑输入事件 GameManager.Instance.PlayerManager.UnbindPlayer(); } /// /// 检测动画状态机 /// private void CheckAnimator() { _animator.SetBool("attacking", GameManager.Instance.CombatManager.Fighting); _animator.SetBool("walking", walking); _animator.SetFloat("direction", (int)direction); } /// /// 获取角色输入 /// /// 输入类型 private void OnMoveInputEvent(EDirectionType inputType) { if (walking || GameManager.Instance.CombatManager.Fighting) return; // 状态赋值 direction = GameManager.Instance.CombatManager.Fighting ? direction : inputType; // 尝试获取面前的物体 Vector2 targetPoint = Vector2.zero; switch (direction) { case EDirectionType.UP: targetPoint.y = 1; break; case EDirectionType.DOWN: targetPoint.y = -1; break; case EDirectionType.LEFT: targetPoint.x = -1; break; case EDirectionType.RIGHT: targetPoint.x = 1; break; default: break; } targetPoint += (Vector2)transform.position; RaycastHit2D[] hits = Physics2D.RaycastAll(targetPoint, (targetPoint - (Vector2)transform.position), .1f); // 如果有可交互的物体 if (hits.Length > 0) { // 筛选最上层可物体 int maxOrder = -100; GameObject obj = null; foreach (var hit in hits) { if (hit.collider.GetComponent().sortingOrder > maxOrder) { maxOrder = hit.collider.GetComponent().sortingOrder; obj = hit.collider.gameObject; } } if (null != obj.GetComponent()) { // 进行交互 视情况停止移动 if (!obj.GetComponent().Interaction()) return; } } // 匀速移动 StartCoroutine(Moving(transform.position, targetPoint)); } /// /// 移动 /// IEnumerator Moving(Vector2 oldPoint, Vector2 newPoint) { float speed = 8f; float timer = 0; walking = true; while ((Vector2)transform.position != newPoint) { timer += Time.deltaTime; float t = timer / (oldPoint - newPoint).sqrMagnitude * speed; Vector2 point = Vector2.Lerp(oldPoint, newPoint, t); rigidbody2d.MovePosition(point); yield return null; } walking = false; // 移动完成后触发事件 GameManager.Instance.EventManager.OnPlayerArrive?.Invoke(newPoint); } }