144 lines
3.1 KiB
C#
144 lines
3.1 KiB
C#
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<Rigidbody2D>();
|
||
physicsCheck = GetComponent<PhysicsCheck>();
|
||
playerAnimation = GetComponent<PlayerAnimation>();
|
||
coll = GetComponent<CapsuleCollider2D>();
|
||
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<Vector2>();
|
||
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;
|
||
}
|
||
|
||
}
|