using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using Sirenix.OdinInspector; /// /// 玩家的控制器部分,玩家主类必须继承这个类才能对控制做出反应 /// public class PlayerControl : MonoBehaviour { public PlayerC playerC; /// /// 此帧输入方向,-1为左,1为右,0此帧不输入 /// [SerializeField][ReadOnly][Header("此帧输入方向,-1为左,1为右,0表示此帧不输入")] protected int inputDir; protected PlayerInteract playerInteract; protected Animator animator; protected virtual void Start() { playerC = new PlayerC(); //playerC.Enable(); playerC.Normal.Enable(); //为事件订阅方法 //为移动操作订阅方法 playerC.Normal.Move.performed += ctx => OnMove(ctx); playerC.Normal.Move.canceled += ctx => { inputDir = 0; }; //为攻击操作订阅方法 playerC.Normal.Atk.performed += ctx => OnAtk(); //为跳跃操作订阅方法 playerC.Normal.Jump.performed += ctx => OnJump(); //为交互操作订阅方法 playerC.Normal.Interact.performed += ctx => OnInteract(); //为左切换操作订阅方法 playerC.Normal.LeftChange.performed += ctx => OnLeftChange(); //为右切换操作订阅方法 playerC.Normal.RightChange.performed += ctx => OnRightChange(); //给玩家物体添加子物体:互动侦察器 GameObject checker = new GameObject("互动侦察器");//新建游戏物体:互动侦察器 checker.transform.SetParent(transform);//将其设置为玩家的子物体 playerInteract = checker.AddComponent();//增加玩家互动侦察器组件 checker.AddComponent().isTrigger = true;//增加碰撞盒,并将其设置为触发器 checker.GetComponent().size = new Vector2(1f, 1f);//设置碰撞盒大小 checker.transform.localPosition = Vector3.zero;//设置碰撞盒位置 //找到动画机 animator = GetComponentInChildren(); if (animator == null) { Debug.LogError("玩家动画机丢失!"); } //playerC.Dispose(); } public void TellMapStates(){ if(playerC.Normal.enabled){ Debug.Log("Normal is Active"); } else { Debug.Log("Normal is Inactive"); } if(playerC.Null.enabled){ Debug.Log("Null is Active"); } else { Debug.Log("Null is Inactive"); } } /// /// 当有移动输入的时候触发,因为涉及读值,重些的时候记得必须Base /// protected virtual void OnMove(InputAction.CallbackContext ctx){ //根据读值设置记录的输入方向 if(ctx.ReadValue() > 0){ inputDir = 1; }else if(ctx.ReadValue() < 0){ inputDir = -1; } if(ctx.ReadValue().Equals(0f)){ inputDir = 0; } } /// /// 按下攻击时触发 /// protected virtual void OnAtk(){} /// /// 按下跳跃时触发 /// protected virtual void OnJump(){} /// /// 按下交互时触发 /// protected virtual void OnInteract(){ //如果有交互事件,则调用事件 playerInteract.OnCall(); } /// /// 按下十字键左或者Q触发 /// protected virtual void OnLeftChange(){} /// /// 按下十字键右或者E触发 /// protected virtual void OnRightChange(){} /// /// 改变玩家的操作地图至参数值 /// /// 要改到的操作地图的名称 public void ToMap(string mapName) { //先关闭所有的 CloseAllMaps(); //再打开指定的 switch(mapName) { case "Normal": playerC.Normal.Enable(); break; case "Null" : playerC.Null.Enable(); break; default: Debug.LogError("没有叫" + mapName + "的操作地图"); break; } } protected void CloseAllMaps() { //关闭所有的操作地图 playerC.Normal.Disable(); playerC.Null.Disable(); } /// /// 触发玩家用触发器触发的动画 /// /// 触发器名 public void Behavior(string behaviorName) { try{ //触发动画 animator.SetTrigger(behaviorName); } catch(System.Exception e) { e.ToString(); Debug.LogError("没有找到触发器" + behaviorName); } } /// /// 接下来的time后,都无视输入事件 /// public void StopInputTo(float time) { ToMap("Null"); StartCoroutine(RecoverInput(time)); } private IEnumerator RecoverInput(float time) { yield return new WaitForSeconds(time); ToMap("Normal"); } }