using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices.ComTypes;
using UnityEditor.Rendering;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
public PlayerInputControl inputControl; // 用于存储玩家的输入控制器
private Rigidbody2D rb; // 用于存储玩家的刚体组件,用于物理运动
private Vector2 inputDirection; // 用于存储玩家输入的方向向量
private CapsuleCollider2D coll;
private PhysicsCheck physicsCheck; //隔壁的PhysicsCheck类
private Vector2 originalOffset;
private Vector2 originalSize;
[Header("状态显示")]
public bool isCrouch;
[Header("基本参数")]
public float speed; // 玩家移动速度
private float runSpeed;
private float walkSpeed => speed / 3f; // lambda表达式
public float jumpForce; // 玩家跳跃受力
void Awake() // Awake(): 在游戏对象创建时调用
{
physicsCheck = GetComponent<PhysicsCheck>(); // 获取PhysicsCheck的数据
rb = GetComponent<Rigidbody2D>(); // 获取Rigidbody2D的数据
coll = GetComponent<CapsuleCollider2D>(); // 获取CapsuleCollider2D数据
originalOffset = coll.offset; // 获取CapsuleCollider2D.offset初始值
originalSize = coll.size; // 获取CapsuleCollider2D.size初始值
inputControl = new PlayerInputControl(); //实例化PlayerInputControl于inputControl
inputControl.Gameplay.Jump.started += Jump; // 订阅事件Jump.started,每次事件触发启动Jump()
#region 强制步行
runSpeed = speed;
inputControl.Gameplay.WalkButton.performed += ctx => // performed: 持续按下
{
if (physicsCheck.isGround) // 若角色在地面上时按下Alt键
{
speed = walkSpeed;
}
};
inputControl.Gameplay.WalkButton.canceled += ctx => // canceled: 取消按下
{
if (physicsCheck.isGround)
{
speed = runSpeed;
}
};
#endregion
}
void OnEnable() // OnEnable(): 启用inputControl时调用
{
inputControl.Enable(); // 启用输入控制
}
void OnDisable() // OnDisable(): 禁用inputControl时调用
{
inputControl.Disable(); // 禁用输入控制
}
void Update() // Update(): 每帧调用
{
inputDirection = inputControl.Gameplay.Move.ReadValue<Vector2>();
}
void FixedUpdate() // FixedUpdate(): 每固定帧调用
{
Move();
}
private void Move() // 定义移动方法
{
#region 人物移动
if (!isCrouch)
{
rb.linearVelocity = new Vector2(speed * inputDirection.x, rb.linearVelocity.y); // 人物移动 velocity:速度 isWalk模拟轻推摇杆
}
// 实现人物朝向改变
int faceDir = (int)transform.localScale.x; // 获取人物朝向
if (inputDirection.x > 0 && faceDir != 1) // 改变人物朝向
{
transform.localScale = new Vector3(1, 1, 1);
}
else if (inputDirection.x < 0 && faceDir != -1)
{
transform.localScale = new Vector3(-1, 1, 1);
}
#endregion
isCrouch = inputDirection.y < -0.5f && physicsCheck.isGround;// 下蹲
if (isCrouch) // 碰撞箱缩小
{
coll.offset = new Vector2(-0.05f, 0.75f);
coll.size = new Vector2(0.66f, 1.5f);
}
else
{
coll.size = originalSize;
coll.offset = originalOffset;
}
}
private void Jump(InputAction.CallbackContext context) // 定义跳跃方法
{
if(physicsCheck.isGround)
{
rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse); // Rigitbody2D.AddForce(Vector2 force, ForceMode2D mode) transform.up为坐标轴正上方向,值通常为1。
}
}
}