| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using Sirenix.OdinInspector;
- using System.Linq;
- public class HairSprint : MonoBehaviour
- {
- public enum HairState
- {
- none,
- SearchAim,
- Chua,
- }
- [DisplayOnly]
- public HairState hairState;
- [LabelText("总攻击次数")]
- public int attackTime;
- private int curTime;
- [LabelText("伤害值")]
- public int damage;
- [LabelText("头发预制体")]
- public GameObject hairPre;
- [LabelText("预警预制体")]
- public GameObject warningPre;
- private GameObject[] hairIns;
- private GameObject[] warningIns;
- //生成到第几根头发了
- private int curHairID;
- [DisplayOnly]
- [LabelText("目标坐标")]
- public Vector3[] aims;
- private bool hasFoundAllAims;
- [HideInInspector]
- public WaterSprite ws;
- [DisplayOnly]
- public Character[] aimChas;
- [Header("动画时长")]
- [LabelText("预警时长")]
- public float warningTime;
- [LabelText("存在时长")]
- public float existTime;
- private float pastTime;
- [LabelText("找目标时长")]
- public float searchTime;
- [LabelText("单个攻击动画时长")]
- public float singleChuaTime;
- public void Release(int _attackTime)
- {
- if (hairIns == null)
- {
- hairIns = new GameObject[attackTime];
- warningIns = new GameObject[attackTime];
- }
- attackTime = _attackTime;
- gameObject.SetActive(true);
- curHairID = 0;
- ChangeHairState(HairState.SearchAim);
- }
- private void ChangeHairState(HairState hs)
- {
- if (hairState == hs)
- {
- return;
- }
- hairState = hs;
- switch (hs)
- {
- case HairState.SearchAim:
- aimChas = new Character[attackTime];
- GetAims();
- break;
- case HairState.Chua:
- curTime = 0;
- for(int i = 0; i < attackTime; i++)
- {
- if (hairIns[i] == null)
- {
- //预警实例生成
- warningIns[i] = Instantiate(warningPre);
- warningIns[i].SetActive(false);
- //头发实例生成
- hairIns[i] = Instantiate(hairPre);
- hairIns[i].SetActive(false);
- SingleHairAttack sha = hairIns[i].GetComponent<SingleHairAttack>();
- sha.existTime = existTime;
- sha.attackTime = attackTime;
- sha.damage = damage;
- }
- }
- Chua(0);
- break;
- }
- }
- private void GetAims()
- {
- aims = new Vector3[attackTime];
- List<Character> aimCharacters = new List<Character>();
- aimCharacters = ws.searchTrigger.GetAllTargets(ws.attackController.targetTypes, true);
- bool hasAimedPlayer = false;
- var sortedObjects = aimCharacters.OrderBy(obj => Vector3.Distance(transform.position, obj.transform.position)).ToArray();
- if (sortedObjects.Length > attackTime)
- {
- for(int i = 0; i < attackTime - 1; i++)
- {
- aimChas[i] = sortedObjects[i];
- if (sortedObjects[i].gameObject.layer == 6)
- {
- hasAimedPlayer = true;
- }
- aims[i] = sortedObjects[i].bodyTrans.position;
- }
- if (hasAimedPlayer)
- {
- aims[attackTime - 1] = sortedObjects[attackTime - 1].bodyTrans.position;
- }
- else
- {
- aims[attackTime - 1] = PlayersInput.instance[0].bodyTrans.position;
- }
- }
- else
- {
- int id = 0;
- foreach(Character c in aimCharacters)
- {
- aims[id] = c.bodyTrans.position;
- id++;
- }
- Vector3 v = PlayersInput.instance[0].bodyTrans.position;
- for(int i = id; i < attackTime; i++)
- {
- aims[i] = v;
- }
- }
- hasFoundAllAims = true;
- }
- private void Chua(int id)
- {
- //警示线出现
- warningIns[id].transform.position = aims[id];
- float ro = Random.Range(0, 360);
- warningIns[id].transform.localEulerAngles = new Vector3(0, 0, ro);
- warningIns[id].SetActive(true);
- hairIns[id].transform.position = aims[id];
- hairIns[id].transform.localEulerAngles = warningIns[id].transform.localEulerAngles;
- //头发出来
- Invoke("HairOut", warningTime);
- }
- private void HairOut()
- {
- int id = curHairID;
- hairIns[id].SetActive(true);
- warningIns[id].SetActive(false);
- curHairID++;
- if (curHairID == attackTime)
- {
- gameObject.SetActive(false);
- }
- }
- private void OnHairState()
- {
- pastTime += Time.deltaTime;
- switch (hairState)
- {
- case HairState.SearchAim:
- if (pastTime >= searchTime && hasFoundAllAims)
- {
- pastTime = 0;
- ChangeHairState(HairState.Chua);
- }
- break;
- case HairState.Chua:
- if (curTime < attackTime)
- {
- pastTime += Time.deltaTime;
- if (pastTime >= singleChuaTime)
- {
- pastTime = 0;
- curTime++;
- if (curTime != attackTime)
- {
- Chua(curTime);
- }
- }
- }
- else
- {
- ChangeHairState(HairState.none);
- ws.EndCurAttackState(true);
- }
- break;
- }
- }
- private void Update()
- {
- OnHairState();
- }
- }
|