using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Sirenix.OdinInspector;
///
/// 地藏的手组件
///
public class DiZangsHadn : MonoBehaviour
{
// _____ _ _ _
// | __ \ | | | (_)
// | |__) | _| |__ | |_ ___
// | ___/ | | | '_ \| | |/ __|
// | | | |_| | |_) | | | (__
// |_| \__,_|_.__/|_|_|\___|
[HideInInspector]
public DiZang owner;
///
/// 手下落到目标点后会停留多长时间
///
public float TakeMoneyTime;
// _____ _ _
// | __ \ (_) | |
// | |__) | __ ___ ____ _| |_ ___
// | ___/ '__| \ \ / / _` | __/ _ \
// | | | | | |\ V / (_| | || __/
// |_| |_| |_| \_/ \__,_|\__\___|
///
/// 手拿钱移动到的目标点位
///
private Transform target;
///
/// 浮动动画,用来重启浮动动画解决Tween的一些局限性问题
///
private Tweener floatTweener;
///
/// 手在屏幕外的起点
///
private Vector3 start;
///
/// 此时是否可被攻击
///
[Header("此时能否被攻击")][SerializeField]
private bool canBeHit = false;
///
/// 是否被玩家的攻击打断了?
///
[Header("此时是否被打断")][SerializeField]
private bool wasInteruput;
private VibrationManager vibrationManager;
private Animator animator;
// _____ _ _ ____ _
// / ____| | | | _ \ | |
// | | __ _| | | |_) | __ _ ___| | __
// | | / _` | | | _ < / _` |/ __| |/ /
// | |___| (_| | | | |_) | (_| | (__| <
// \_____\__,_|_|_|____/ \__,_|\___|_|\_\
void Start(){Init();}
// _ _ _
// | \ | | | |
// | \| | ___ _ __ _ __ ___ __ _| |
// | . ` |/ _ \| '__| '_ ` _ \ / _` | |
// | |\ | (_) | | | | | | | | (_| | |
// |_| \_|\___/|_| |_| |_| |_|\__,_|_|
private void Init(){
//找到需要的物体和组件
owner = FindObjectOfType();
target = owner.transform.Find("手的终点位置");
start = transform.position;
vibrationManager = FindObjectOfType();
animator = GetComponent();
}
///
/// 主人发命令拿钱时触发
///
public void ATK(){
//创建、播放并记录一个抖动动画
Tweener floatTweener = transform.DOShakePosition(2f,0.05f,50,90,false,false);
this.floatTweener = floatTweener;
//创建、播放并记录一个下移动画
Tweener tweener = transform.DOMoveY(
target.position.y,
2f
);
//震动手柄和屏幕
vibrationManager.ShakeScream(Vector2.up,1f);
StartCoroutine(vibrationManager.ShakePad(0.4f,0.2f,2f,VibrationManager.PadShakeitem.伸手拿钱));
//创建并给予下移动画结束事件
TweenCallback action = () =>{
//下移结束,标记为可被攻击
canBeHit = true;
//删掉正在播放的抖动动画
floatTweener.Kill();
//拿走钱
FindObjectOfType().OnBeTakeMoney();
//开始协程,等待拿钱时间结束后上移回去手
Invoke("TakeMoneyAndRun",TakeMoneyTime);
//开始抓握动画
animator.SetBool("isTaking",true);
};
tweener.OnComplete(action);
}
///
/// 手到塞钱箱后触发,执行等待和返回操作
///
private void TakeMoneyAndRun(){
//如果没有被打断,才会执行正常的上移
if(!wasInteruput){
//创建、播放并记录一个抖动动画
Tweener floatTweener = transform.DOShakePosition(2f,0.05f,50,90,false,false);
this.floatTweener = floatTweener;
//创建、播放并记录一个上移动画
Tweener tweener = transform.DOMoveY(
start.y,
2f
);
//创建并给予下移动画结束事件
TweenCallback action = () =>{
//为下一次下移做准备,标记自身不可再被击中
canBeHit = false;
//删掉抖动动画
floatTweener.Kill();
//通知主人,攻击结束
owner.ATKEnd();
//重置一下自己的状态
transform.position = start;
GetComponent().velocity = Vector2.zero;
animator.SetBool("isTaking",false);
};
tweener.OnComplete(action);
//震动手柄和屏幕
vibrationManager.ShakeScream(Vector2.up,1f);
StartCoroutine(vibrationManager.ShakePad(0.4f,0.2f,2f,VibrationManager.PadShakeitem.伸手拿钱));
}
}
// ______ _
// | ____| | |
// | |____ _____ _ __ | |_
// | __\ \ / / _ \ '_ \| __|
// | |___\ V / __/ | | | |_
// |______\_/ \___|_| |_|\__|
///
/// 当创到玩家触发,触发玩家的被击功能
///
private void OnTouchThePlayer(MyPlayer player){
//告诉玩家,你被攻击了
player.OnBeHit(owner.ATK,
((transform.position.x -
player.transform.position.x)
> 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向
}
///
/// 当手被攻击触发
///
public void OnBeHit(MyPlayer.AtkMethod hitMethod, int hitDir){
//标记此时被打断
wasInteruput = true;
CancelInvoke("TakeMoneyAndRun");
//突然抬起一段,伴随着剧烈的震动
//创建、播放并记录一个抖动动画
Tweener floatTweener = transform.DOShakePosition(0.5f,0.5f,50,90,false,false);
this.floatTweener = floatTweener;
//创建一个猛烈上移动画
Tweener tweener = transform.DOMoveY(
transform.position.y + 2f,
0.5f
);
//给猛烈上移动画添加结束事件
TweenCallback action = () =>{
floatTweener.Kill();
canBeHit = false;
wasInteruput = false;
Invoke("TakeMoneyAndRun",TakeMoneyTime);
};
tweener.OnComplete(action);
//结算生命值
owner.HPLeft -= MyPlayer.atkMethodMagnification[hitMethod];
//看下死了没
if(owner.CheckDead()) {}
//震动手柄和屏幕
vibrationManager.ShakeScream(Vector2.up,1f);
StartCoroutine(vibrationManager.ShakePad(0.4f,0.2f,0.2f,VibrationManager.PadShakeitem.伸手拿钱));
}
// _____ _ _ _ _
// / ____| | | (_) (_)
// | | ___ | | |_ ___ _ ___ _ __
// | | / _ \| | | / __| |/ _ \| '_ \
// | |___| (_) | | | \__ \ | (_) | | | |
// \_____\___/|_|_|_|___/_|\___/|_| |_|
protected void OnCollisionEnter2D(Collision2D other)//当有物体碰上
{
if(other.collider.gameObject.TryGetComponent(out MyPlayer player))
{OnTouchThePlayer(player);}//如果创到的是玩家,则Call事件
//如果被镰刀创到,Call一下OnBeHit事件,传入攻击方式和攻击来袭方向
else if(other.collider.gameObject.TryGetComponent(out Sickle sickle)){
if(canBeHit)
OnBeHit(MyPlayer.AtkMethod.镰刀,
(transform.position.x - sickle.transform.position.x > 0) ? -1 : 1);
Destroy(sickle.gameObject);}
}
}