lspdC 2a2a11e851 3.22
完成了跟踪雷击与玩家的碰撞判定,玩家的受击反馈
击碎石头那边还有bug,明天再改
2022-03-22 22:15:12 +08:00

240 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using Sirenix.OdinInspector;
using DG.Tweening;
public class Player : PlayerControl
{
/// <summary>
/// 玩家刚体组件喵
/// </summary>
Rigidbody2D m_rigidbody;
/// <summary>
/// 脚底位置子物体
/// </summary>
[Header("脚底位置")] [FoldoutGroup("子物体")]
public Transform groundCheck;
/// <summary>
/// 手持武器
/// </summary>
[Header("手持武器")] [FoldoutGroup("子物体")]
public Item weapon;
/// <summary>
/// 武器生成位置(需要绑在骨骼上)
/// </summary>
[Header("武器生成位置(需要绑在骨骼上)")][FoldoutGroup("子物体")]
public Vector3 weaponPos;
/// <summary>
/// 角色朝向向右为1
/// </summary>
[ReadOnly] [Header("朝向监测")]
public int isRight = 1;
/// <summary>
/// 角色是否落地
/// </summary>
[ReadOnly]
[Header("落地监测")]
public bool isGround = false;
[Header("行走速度")][FoldoutGroup("角色操作数据")]
public float speed;
[Header("跳跃力量")][FoldoutGroup("角色操作数据")]
public float jumpForce;
/// <summary>
/// 角色翻面时长
/// </summary>
[Header("角色翻面所需时长")]
public float flipDuration = 0.1f;
//布尔-------------------------
bool forceFlip = false;
bool isHurting = false;
/// <summary>
/// 玩家初始化喵
/// </summary>
override protected void Start()
{
base.Start();
m_rigidbody = gameObject.GetComponent<Rigidbody2D>();
WeaponInit();
}
//UPDATE
void Update()
{
OnInputDetect();
Flip();
}
void FixedUpdate() {
Moving();
}
/// <summary>
/// 翻面函数
/// </summary>
void Flip()
{
int lastFrameDir = isRight;
if (inputDir * lastFrameDir < 0 || forceFlip == true)
{ isRight *= -1;
//transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);
//transform.DOScale(new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z),0.1f);
//分情况定值翻转 可以规避在旋转动画未结束时再次翻转的造成的起始角度不同从而影响目标角度误差的问题
switch (isRight) {
case 1:
transform.DORotate(new Vector3(0, 0, 0), flipDuration);
break;
case -1:
transform.DORotate(new Vector3(0,180,0), flipDuration);
break;
}
}
}
/// <summary>
/// 检测是否停止摇杆输入
/// </summary>
void OnInputDetect() {
if (inputDir == 0&&isHurting==false)
Freeze();
}
/// <summary>
/// 强制静止
/// </summary>
void Freeze() {
m_rigidbody.velocity = new Vector2(0,m_rigidbody.velocity.y);
}
void Moving() {
if (isHurting == false)
{ m_rigidbody.velocity = new Vector2(inputDir * speed, m_rigidbody.velocity.y); }
}
/// <param name="ctx"></param>
override protected void OnMove(InputAction.CallbackContext ctx)
{
base.OnMove(ctx);
}
override protected void OnAtk() {
base.OnAtk();
}
override protected void OnJump() {
base.OnJump();
if (isGround == true) {
isGround = false;
m_rigidbody.velocity = new Vector2(m_rigidbody.velocity.x, jumpForce);
}
}
override protected void OnInteract() {
base.OnInteract();
}
protected override void OnLeftChange()
{
ItemController.Instance.LeftChangeItem();
}
protected override void OnRightChange()
{
//WeaponReturn();
ItemController.Instance.RightChangeItem();
//WeaponInPosition();
}
//武器更换相关函数--------------------------------------------------
public void WeaponInPosition() {
GameObject chosenOne;
chosenOne = GameObject.Find(weapon.name);
if (chosenOne.TryGetComponent<Item>(out Item chosenWeapen))
chosenWeapen.InPosition(transform,weaponPos);
}
public void WeaponReturn()
{
GameObject chosenOne;
chosenOne = GameObject.Find(weapon.name);
if (chosenOne.TryGetComponent<Item>(out Item chosenWeapon))
{
//Debug.Log(chosenOne.name + chosenWeapon.GetOriposition());
chosenWeapon.ReturnToOri(); }
}
//武器生成---------------------------------------------------------
void WeaponInit() {
WeaponInPosition();
}
//受到攻击
public void GetHurt(int count,float time,float hitter_x) {
isHurting = true;
StopInput(time);
if ((hitter_x - transform.position.x)*isRight< 0) {
forceFlip = true;
Flip();
forceFlip = false;
}
m_rigidbody.velocity = new Vector2(-isRight * 3, 3);
}
public void StopInput(float time) {
ToMap("Null");
Invoke(nameof(ResetInput), time);
}
void ResetInput() {
ToMap("Normal");
isHurting = false;
}
//跳跃判定(有点怪 后面可能会改)
private void OnCollisionEnter2D(Collision2D collision)//当有物体碰上
{
//创到地面时触发一次
if (collision.transform.CompareTag("Ground"))
{
//向脚底发射一条短射线
Ray2D ray = new Ray2D(
groundCheck.position,
Vector2.down
);
Debug.DrawRay(ray.origin, ray.direction, Color.red, 10f);
//获取射线的碰撞结果
RaycastHit2D hit2D;
hit2D = Physics2D.Raycast(ray.origin, ray.direction, 0.001f);
//如果射线有结果并且射线创到的是地面,才表示着地了
if (hit2D && hit2D.collider.transform.CompareTag("Ground"))
{
isGround = true;
}
else Debug.Log("Not Ground");
}
}
}