using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { public PlayerInputControl inputControl; public Vector2 inputDirection; private Rigidbody2D rb; private PhysicsCheck physicsCheck; private PlayerAnimation playerAnimation; [Header("基本参数")] public float speed; public float jumpForce; [Header("状态")] public bool isDead; public bool isAttack; [Header("受伤反弹参数")] public bool isHurt; public float hurtForce;//反弹的力 [Header("物理材质")] public PhysicsMaterial2D Normal; public PhysicsMaterial2D Wall; private CapsuleCollider2D coll; private void Awake() { rb = GetComponent(); physicsCheck = GetComponent(); playerAnimation = GetComponent(); coll = GetComponent(); inputControl = new PlayerInputControl(); //跳跃 inputControl.GamePlayerInput.Jump.started += Jump; //攻击 inputControl.GamePlayerInput.Attack.started += PlayerAttack; } private void OnEnable() { inputControl.Enable(); } private void OnDisable() { inputControl.Disable(); } void Start() { } // Update is called once per frame void Update() { inputDirection = inputControl.GamePlayerInput.Move.ReadValue(); CheckState();//检查切换光滑不光滑材质 } private void FixedUpdate() { if(!isHurt && !isAttack) { Move(); } } //移动 public void Move() { rb.velocity = new Vector2(inputDirection.x*speed * Time.deltaTime, rb.velocity.y); //翻转 int faceDir = (int)transform.localScale.x; if(inputDirection.x > 0 ) { faceDir = 1; } if (inputDirection.x < 0) { faceDir = -1; } transform.localScale = new Vector3(faceDir, transform.localScale.y, transform.localScale.z); } //跳跃 private void Jump(InputAction.CallbackContext context) { if(physicsCheck.isGround) { rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse); } } //攻击 private void PlayerAttack(InputAction.CallbackContext context) { if (!physicsCheck.isGround) { return; } playerAnimation.PlayAttack(); isAttack = true; } //受伤反弹 public void GetHurt(Transform attacker) { isHurt = true; rb.velocity = Vector2.zero; Vector2 dir = new Vector2((transform.position.x - attacker.position.x),0).normalized;//归一取1,定方向 rb.AddForce(dir*hurtForce, ForceMode2D.Impulse); } //死亡暂停一切动作 public void PlayerDead() { isDead = true; inputControl.GamePlayerInput.Disable(); } //切换材质 public void CheckState() { coll.sharedMaterial = physicsCheck.isGround ? Normal : Wall; } }