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);} } }