using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using Sirenix.OdinInspector; /// /// 玩家的控制器部分,玩家主类必须继承这个类才能对控制做出反应 /// public class PlayerControl : MonoBehaviour { private PlayerC playerC; /// /// 此帧输入方向,-1为左,1为右,0此帧不输入 /// [SerializeField][ReadOnly][Header("此帧输入方向,-1为左,1为右,0表示此帧不输入")] protected int inputDir; protected PlayerInteract playerInteract; 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;//设置碰撞盒位置 } /// /// 当有移动输入的时候触发,因为涉及读值,重些的时候记得必须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(){} }