| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- using Sirenix.OdinInspector;
- using System.Collections.Generic;
- using UnityEngine;
- public class TornadoFan : AttackTrigger
- {
- [Space(30)]
- [Title("TornadoFan属性")]
- [LabelText("相对主角距离")] public float offset;
- [LabelText("相对于轴心旋转范围")] public Vector2 rotationRangeX;
- [LabelText("Y轴差值范围")] public Vector2 rotationRangeY;
- [LabelText("重新判定距离")] public float distance;
- [LabelText("落地伤害倍率")] public float landingDamageRate;
- [LabelText("结束击飞力的斜率")] public float forceRate;
- [LabelText("结束击飞力最大值")] public float forceMax;
- [LabelText("结束击飞力最小值")] public float forceMin;
- [LabelText("落地后眩晕时间")] public float weakTime;
- [LabelText("最大速度")]public float lerpValueMax;
- [LabelText("最小速度")]public float lerpValueMin;
- [LabelText("速度斜率")]public float lerpRate;
- [DisplayOnly] public int damage;
- [DisplayOnly] public float totalTime;
- [DisplayOnly] public float time; //经过的时间
- public List<Vector3> targetPoss;
- public override void Update()
- {
- base.Update();
- time += Time.deltaTime;
- if (time >= totalTime)
- {
- for (int i = 0; i < trigedObjs.Count; i++)
- {
- BeHitTrigger beHitTrigger = trigedObjs[i];
- MoveCharacter moveCharacter = beHitTrigger.owner as MoveCharacter;
- if (moveCharacter != null)
- {
- AttackController.AttackMethod attackMethod = new AttackController.AttackMethod();
- attackMethod.attackInfo = new AttackInfo();
- attackMethod.attackInfo.attackEffect = new List<AttackEffect>();
- attackMethod.attackInfo.attackEffect.Add(AttackEffect.BlowUp);
- AttackInfo.BlowUp blowUp = attackMethod.attackInfo.blowUp;
- float dir = moveCharacter.transform.position.x - transform.position.x;
- if (dir >= 0)
- {
- blowUp.dir = new Vector3(1, 0.5f, 0);
- blowUp.force = -forceRate * dir + forceMax;
- }
- else
- {
- blowUp.dir = new Vector3(-1, 0.5f, 0);
- blowUp.force = forceRate * dir + forceMax;
- }
- if(blowUp.force >= 0)
- {
- blowUp.time = weakTime;
- blowUp.haveLandingDamage = true;
- blowUp.landingDamageRate = landingDamageRate;
- attackMethod.attackInfo.blowUp = blowUp;
- moveCharacter.attributeStatus.AddBlowUp(attackMethod, owner.bodyTrans);
- moveCharacter.bodyCollider.layer = LayerMask.NameToLayer("BodyToPlatformCollider");
- moveCharacter.attributeStatus.landingDamageFrom = owner;
- }
- else
- {
- moveCharacter.ChangeState(CharacterState.Idle);
- bool canfly = moveCharacter.canFly;
- moveCharacter.rb.useGravity = !canfly;
- moveCharacter.nowCanFly = canfly;
- }
- }
- }
- gameObject.SetActive(false);
- return;
- }
- int targetLen = targetPoss.Count;
- int trigedLen = trigedObjs.Count;
- if (targetLen < trigedLen)
- {
- for (int i = 0; i < trigedLen - targetLen; i++)
- {
- targetPoss.Add(CalculateTargetPos(trigedObjs[targetLen + i].owner.transform.position));
- }
- }
- else if (targetLen > trigedLen)
- {
- for (int i = 0; i < targetLen - trigedLen; i++)
- {
- targetPoss.RemoveAt(0);
- }
- }
- for (int i = 0; i < targetPoss.Count; i++)
- //for (int i = 0; i < trigedObjs.Count; i++)
- {
- BeHitTrigger beHitTrigger = trigedObjs[i];
- MoveCharacter moveCharacter = beHitTrigger.owner as MoveCharacter;
- if (moveCharacter != null)
- {
- if (moveCharacter.state != CharacterState.Another && moveCharacter.state != CharacterState.Die)
- {
- moveCharacter.ChangeState(CharacterState.Another);
- moveCharacter.ani.Play(AnimatorHash.ANIMATOR_weak, 0, 0);
- if (moveCharacter.nowCanFly == false)
- {
- moveCharacter.rb.useGravity = false;
- moveCharacter.nowCanFly = true;
- }
- }
- Vector3 nowPos = moveCharacter.transform.position;
- Vector3 targetPos = nowPos;
- targetPos.x = transform.position.x;
- float targetDistance = Vector3.Distance(nowPos, targetPoss[i]);
- if (targetDistance < distance)
- {
- targetPoss[i] = CalculateTargetPos(nowPos);
- }
- float lerpValue = lerpValueMax - (targetDistance * lerpRate);
- if(lerpValue < lerpValueMin)
- {
- lerpValue = lerpValueMin;
- }
- //moveCharacter.transform.position = Vector3.Lerp(nowPos, targetPoss[i], lerpValue * Time.deltaTime);
- moveCharacter.rb.velocity = (targetPoss[i] - nowPos).normalized * lerpValue;
- //moveCharacter.transform.position = Vector3.Lerp(nowPos, targetPos, lerpValue * Time.deltaTime);
- }
- }
- }
- public void Init()
- {
- float dir = owner.bodyTrans.localScale.x;
- Vector3 targetPos = owner.transform.position;
- if (dir > 0)
- {
- targetPos -= new Vector3(offset,0,0);
- }
- else
- {
- targetPos += new Vector3(offset, 0, 0);
- }
- targetPos.y = 0;
- attackMethod.attackInfo.damage = damage;
- transform.position = targetPos;
- targetPoss = new List<Vector3>();
- time = 0;
- gameObject.SetActive(true);
- }
- public Vector3 CalculateTargetPos(Vector3 originalPos)
- {
- float dir = originalPos.x < transform.position.x ? 1 : -1;
- Vector3 targetPos = transform.position;
- targetPos.x += dir * Random.Range(rotationRangeX.x,rotationRangeX.y);
- Vector2 rangeY = new Vector2(originalPos.y + rotationRangeY.x, originalPos.y + rotationRangeY.y);
- if(rangeY.x < 0)
- {
- rangeY.x = 0;
- }
- targetPos.y = Random.Range(rangeY.x, rangeY.y);
- return targetPos;
- }
- }
|