
1.设置转身事件 (1.当触发转身,翻转角色Scale 2.实现发射镰刀功能 (1.发射有CD,CD之内无法再次发射 (2.若未击中怪物,镰刀飞出屏幕后销毁 (3.镰刀飞行方向由玩家发射时面部朝向决定 ❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤
241 lines
8.9 KiB
C#
241 lines
8.9 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using UnityEngine.InputSystem;
|
||
using DG.Tweening;
|
||
using Sirenix.OdinInspector;
|
||
|
||
// _
|
||
// | |
|
||
// _ __ | | __ _ _ _ ___ _ __
|
||
// | '_ \| |/ _` | | | |/ _ \ '__|
|
||
// | |_) | | (_| | |_| | __/ |
|
||
// | .__/|_|\__,_|\__, |\___|_|
|
||
// | | __/ |
|
||
// |_| |___/
|
||
|
||
[RequireComponent(typeof(Rigidbody2D))]
|
||
public class MyPlayer : MonoBehaviour
|
||
{
|
||
|
||
// _____ _ _ _
|
||
// | __ \ | | | (_)
|
||
// | |__) | _| |__ | |_ ___
|
||
// | ___/ | | | '_ \| | |/ __|
|
||
// | | | |_| | |_) | | | (__
|
||
// |_| \__,_|_.__/|_|_|\___|
|
||
|
||
|
||
[Header("玩家平时地面移动的速度")][FoldoutGroup("Info")]
|
||
|
||
public float speed = 10f;
|
||
[Header("玩家跳跃力度的大小")][FoldoutGroup("Info")]
|
||
|
||
public float jumpForce = 10f;
|
||
[BoxGroup("CD")]
|
||
[Header("挥动锤子的CD时长")]
|
||
public float hammerCD = 1f;
|
||
[BoxGroup("CD")]
|
||
[Header("发射镰刀的CD时长")]
|
||
public float sickleCD = 10f;
|
||
[Header("镰刀发射点Transform")]
|
||
[BoxGroup("预制体")]
|
||
public GameObject sicklePrefab;
|
||
|
||
// _____ _ _
|
||
// | __ \ (_) | |
|
||
// | |__) | __ ___ ____ _| |_ ___
|
||
// | ___/ '__| \ \ / / _` | __/ _ \
|
||
// | | | | | |\ V / (_| | || __/
|
||
// |_| |_| |_| \_/ \__,_|\__\___|
|
||
|
||
private Rigidbody2D m_rigidbody;//自身刚体组件
|
||
[SerializeField][ReadOnly][FoldoutGroup("Info")]
|
||
private int inputDir;//当前输入方向,-1左,1右,0静止
|
||
[SerializeField][ReadOnly][FoldoutGroup("Info")]
|
||
private bool isLanding;//记录自己当前是否着地
|
||
private DOTweenAnimation wavingAnimation;//锤子挥动动画组件
|
||
private SpriteRenderer hammerSprite;
|
||
private BoxCollider2D hammerCollider;
|
||
[BoxGroup("CD")][Header("挥动锤子的CD还剩多长时间")][SerializeField][ReadOnly]
|
||
private float hammerCDLeft = 0f;
|
||
[BoxGroup("CD")][Header("发射镰刀的CD还剩多长时间")][SerializeField][ReadOnly]
|
||
private float sickleCDLeft = 0f;
|
||
private int faceDir = 1;//面部朝向
|
||
private Transform sickleFirePoint;
|
||
private Transform sickleClearerL;
|
||
private Transform sickleClearerR;
|
||
|
||
void Start()
|
||
{
|
||
Init();//初始化一些参数
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
CountCD();
|
||
}
|
||
|
||
void FixedUpdate()
|
||
{
|
||
Move();//处理水平移动
|
||
}
|
||
|
||
//初始化函数
|
||
private void Init()
|
||
{
|
||
m_rigidbody = GetComponent<Rigidbody2D>();//找到自己身上的刚体组件
|
||
wavingAnimation = transform.Find("锤子的旋转中心").GetComponent<DOTweenAnimation>();
|
||
hammerSprite = transform.Find("锤子的旋转中心").Find("锤子").GetComponent<SpriteRenderer>();
|
||
hammerCollider = transform.Find("锤子的旋转中心").Find("锤子").GetComponent<BoxCollider2D>();
|
||
sickleFirePoint = transform.Find("镰刀发射点");
|
||
sickleClearerL = transform.Find("镰刀飞出消除触发器左");
|
||
sickleClearerL.gameObject.AddComponent<SickleClearer>();
|
||
sickleClearerR = transform.Find("镰刀飞出消除触发器右");
|
||
sickleClearerR.gameObject.AddComponent<SickleClearer>();
|
||
}
|
||
|
||
//移动函数,处理水平方向移动
|
||
private void Move()
|
||
{
|
||
//直接修改刚体速度
|
||
m_rigidbody.velocity = new Vector2(inputDir * speed,//水平方向以输入方向乘以预设速度大小
|
||
m_rigidbody.velocity.y);//垂直方向不变
|
||
}
|
||
|
||
//计算CD的函数,每帧调用
|
||
private void CountCD()
|
||
{
|
||
if(hammerCDLeft > 0) hammerCDLeft -= Time.deltaTime;
|
||
if(sickleCDLeft > 0) sickleCDLeft -= Time.deltaTime;
|
||
}
|
||
|
||
private void OnTurnAround()
|
||
{
|
||
faceDir = inputDir;
|
||
transform.localScale = new Vector3( //x乘-1以显示转身
|
||
transform.localScale.x * -1,
|
||
//y、z不变
|
||
transform.localScale.y, transform.localScale.z);
|
||
|
||
|
||
}
|
||
|
||
//碰撞检测代码
|
||
// _____ _ _ _ _
|
||
// / ____| | | (_) (_)
|
||
// | | ___ | | |_ ___ _ ___ _ __
|
||
// | | / _ \| | | / __| |/ _ \| '_ \
|
||
// | |___| (_) | | | \__ \ | (_) | | | |
|
||
// \_____\___/|_|_|_|___/_|\___/|_| |_|
|
||
private void OnCollisionEnter2D(Collision2D collision)//当有物体碰上
|
||
{
|
||
if(collision.transform.tag == "地面")
|
||
isLanding = true;//若碰撞物体标签为地面,标记自身着地
|
||
}
|
||
private void OnCollisionExit2D(Collision2D collision)//当有碰撞体离开
|
||
{
|
||
if(collision.transform.tag == "地面")
|
||
isLanding = false;//若碰撞物体标签为地面,标记自身未着地
|
||
}
|
||
|
||
// 以下为操作监听事件
|
||
// _____ _ _____ _
|
||
// |_ _| | | / ____| | |
|
||
// | | _ __ _ __ _ _| |_| (___ _ _ ___| |_ ___ _ __ ___
|
||
// | | | '_ \| '_ \| | | | __|\___ \| | | / __| __/ _ \ '_ ` _ \
|
||
// _| |_| | | | |_) | |_| | |_ ____) | |_| \__ \ || __/ | | | | |
|
||
// |_____|_| |_| .__/ \__,_|\__|_____/ \__, |___/\__\___|_| |_| |_|
|
||
// | | __/ |
|
||
// |_| |___/
|
||
public void OnMove(InputAction.CallbackContext context)//OnMove事件
|
||
{
|
||
//决定输入方向inputDir
|
||
if(!context.ReadValue<float>().Equals(0))
|
||
inputDir = (context.ReadValue<float>() > 0) ? 1 : -1;
|
||
else inputDir = 0;
|
||
|
||
if(faceDir * inputDir < 0)
|
||
{
|
||
OnTurnAround();
|
||
}
|
||
}
|
||
|
||
public void OnJump(InputAction.CallbackContext context)//OnJump事件
|
||
{
|
||
//当按下跳跃键
|
||
if(context.performed)
|
||
{
|
||
if(isLanding)//如果当前着地
|
||
//给予自身刚体
|
||
m_rigidbody.velocity = new Vector2(m_rigidbody.velocity.x,//水平方向速度不变
|
||
jumpForce);//垂直方向给予预设跳跃速度
|
||
}
|
||
}
|
||
|
||
public void OnWave(InputAction.CallbackContext context)
|
||
{
|
||
//当执行Wave动作
|
||
if (context.performed && hammerCDLeft <= 0)
|
||
{
|
||
hammerSprite.DOFade(1, 0f);//把锤子显示,Debug用,后期请删除
|
||
hammerCollider.enabled = true;//
|
||
wavingAnimation.DOPlay();//播放挥动锤子动画
|
||
hammerCDLeft = hammerCD;//挥动成功,重置CD剩余时间
|
||
}
|
||
}
|
||
|
||
public void OnSickle(InputAction.CallbackContext context)
|
||
{
|
||
if(context.started && sickleCDLeft <= 0)
|
||
{
|
||
Sickle sickle = Instantiate(
|
||
sicklePrefab,
|
||
sickleFirePoint.position,
|
||
Quaternion.identity).
|
||
GetComponent<Sickle>();
|
||
sickle.dir = faceDir;
|
||
sickleCDLeft = sickleCD;
|
||
}
|
||
}
|
||
|
||
// ______ _
|
||
// | ____| | |
|
||
// | |____ _____ _ __ | |_
|
||
// | __\ \ / / _ \ '_ \| __|
|
||
// | |___\ V / __/ | | | |_
|
||
// |______\_/ \___|_| |_|\__|
|
||
|
||
//当挥动锤子动画结束后触发
|
||
public void OnWaveEnd()
|
||
{
|
||
//为挥动动画倒带
|
||
wavingAnimation.DORewind();
|
||
//把锤子隐藏,Debug用,后期请删除
|
||
hammerSprite.DOFade(0,0f);
|
||
//关闭锤子的碰撞体
|
||
hammerCollider.enabled = false;
|
||
}
|
||
|
||
// _______ _ _____ _
|
||
// |__ __| | |/ ____| |
|
||
// | | ___ ___ | | | | | __ _ ___ ___
|
||
// | |/ _ \ / _ \| | | | |/ _` / __/ __|
|
||
// | | (_) | (_) | | |____| | (_| \__ \__ \
|
||
// |_|\___/ \___/|_|\_____|_|\__,_|___/___/
|
||
|
||
|
||
|
||
private class SickleClearer : MonoBehaviour
|
||
{
|
||
//一个工具小插件,单独写脚本实在太浪费,所以在这里写一下。
|
||
//当触发器检测到有东西进入,会试图获取它身上的镰刀脚本,如果有就说明镰刀到屏幕边缘了,把这个镰刀删除
|
||
//没有的话说明是其他物体,不作处理
|
||
void OnTriggerEnter2D(Collider2D other)
|
||
{
|
||
if(other.TryGetComponent<Sickle>(out Sickle temp))
|
||
Destroy(temp.gameObject);
|
||
}
|
||
}
|
||
}
|