using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using Sirenix.OdinInspector; /// /// 以撒鬼魂类,控制以撒攻击时出现的鬼魂 /// public class YiSaGoust : MonoBehaviour { /// /// 冲撞将消耗的时间 /// [Header("冲撞将消耗的时间")] public float rushTime; private YiSa owner; /// /// 落雷的游戏物体 /// [Header("落雷的游戏物体")][HideInInspector] public GameObject lightning; [Header("粒子材质")] #pragma warning disable 0108 public ParticleSystem particleSystem; private CapsuleCollider2D capsuleCollider2D; public Animator animator; void Start(){ Init(); } private void Init(){ //找到必要的组件和物体 animator = GetComponent(); owner = FindObjectOfType(); capsuleCollider2D = GetComponent(); //如果落雷没有落雷组件,则添加一个 lightning = GameObject.Find("落雷").transform.GetChild(0).gameObject; if(!lightning.TryGetComponent(out Lightning t)) lightning.AddComponent(); } public void RushATK(Vector2 rushDir){ //创建并执行一段冲锋的动画 capsuleCollider2D.enabled = true; Tweener tweener = transform.DOMove( transform.position + (Vector3)rushDir * 2, rushTime ); tweener.SetEase(Ease.InElastic); //结束后,鬼魂逐渐消隐 TweenCallback action = () => { capsuleCollider2D.enabled = false; GetComponent().DOFade(0,1); StartCoroutine(SetParticleColor(particleSystem, 0, 1f)); //消隐结束后删除自己 Invoke("DestroySelf",1.1f); //宣告攻击结束 owner.ATKEnd(); }; tweener.OnStepComplete(action); } /// /// 闪电攻击的时候触发 /// public void LightningATK(){ //激活落雷 lightning.SetActive(true); //将落雷的X位置改变到鬼魂的X lightning.transform.position = new Vector3( transform.position.x, lightning.transform.position.y, lightning.transform.position.z ); //极短的时间后关闭落雷 Invoke("TurnOffLightning",0.2f); //宣告攻击结束 owner.ATKEnd(); //淡出鬼魂 StartCoroutine(SetParticleColor(particleSystem, 0, 1f)); GetComponent().DOFade(0,1).OnStepComplete(()=>{ //淡出结束后,删除游戏物体 Destroy(gameObject); }); } private void TurnOffLightning(){lightning.SetActive(false);} private void DestroySelf(){Destroy(gameObject);} void OnTriggerEnter2D(Collider2D other) { //如果创到玩家 if(other.gameObject.TryGetComponent(out MyPlayer player)){ //告诉玩家,你被攻击了 player.OnBeHit(owner.ATK, ((transform.position.x - player.transform.position.x) > 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向 } } private class Lightning : MonoBehaviour { void OnTriggerStay2D(Collider2D other){ //如果创到玩家 if(other.gameObject.TryGetComponent(out MyPlayer player)){ //告诉玩家,你被攻击了 player.OnBeHit(FindObjectOfType().ATK, ((transform.position.x - player.transform.position.x) > 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向 } } } //修改粒子,使粒子淡出 private IEnumerator SetParticleColor(ParticleSystem particleSystem,float endValue,float speed) { #pragma warning disable 0618 Color color = particleSystem.startColor; while (particleSystem.startColor.a>0) { yield return new WaitForSeconds(speed/255); color.a -= 1; particleSystem.startColor = color; } } }