| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class ESpirits_Float : MonoBehaviour
- {
- [Header("出场飞升")]
- private bool isRise = true;
- public float maxHeight, minHeight;
- private float height; //升到哪个高度后停止
- private float curHeight;
- private float speed = 1;
- private Vector3 origPos;
- [Header("漂浮锁定玩家")]
- public float intervalTime = 10f; //漂浮间隔时间
- public float firstAttackTime = 2f; //第一次攻击距出场的时间
- private Vector3 attackPos; //漂浮中心
- public float followTime = 3; //跟随玩家时间
- public float lockTime = 1.5f; //锁定等待时间
- //public float attackTime = 10f; //漂浮持续时间
- public GameObject fe; //漂浮脚本
- public GameObject lockEffect; //锁定特效
- private GameObject curFe;
- private GameObject curLock;
- private float pastTime; //已经经过的时间
- private PlayerController player1;
- private PlayerController player2;
- private GameObject target;
- private bool isDoing = false;
- private bool isFollow = false;
- private bool isOn = false;
- private bool isLock = false;
- private bool isAttack = false;
- private Enemy ene;
- private void Awake()
- {
- ene = GetComponent<Enemy>();
- curLock = PoolManager.Instantiate(lockEffect, new Vector3(0, -50, 0), new Quaternion(0, 0, 0, 0), null);
- curFe = PoolManager.Instantiate(fe, curLock.transform.position, new Quaternion(0, 0, 0, 0), null);
- curFe.GetComponent<FloatEffect>().isEnemy = true;
- curFe.GetComponent<FloatEffect>().ene = ene;
- curFe.SetActive(false);
- curLock.SetActive(false);
- player1 = PlayersInput.instance[0];
- player2 = PlayersInput.instance[1];
- }
- private void Start()
- {
- origPos = transform.position;
- curHeight = origPos.y;
- pastTime = intervalTime - firstAttackTime;
- height = Random.Range(minHeight, maxHeight);
- curFe.SetActive(true);
- }
- private void OnDisable()
- {
- if (curFe != null)
- {
- curFe.SetActive(false);
- }
- if (curLock != null)
- {
- curLock.SetActive(false);
- }
- }
- private void MoveToHeight()
- {
- curHeight = Mathf.SmoothDamp(curHeight, height, ref speed, 0.02f);
- transform.position = new Vector3(origPos.x, curHeight, origPos.z);
- }
- private void ChoosePlayer()
- {
- player1 = PlayersInput.instance[0];
- player2 = PlayersInput.instance[1];
- float dis1 = Vector2.Distance(player1.transform.position, transform.position);
- float dis2 = Vector2.Distance(player2.transform.position, transform.position);
- if (!player1.isDie && (player2.isDie || player2 == player1 || dis1 < dis2))
- {
- target = player1.gameObject;
- }
- else if (!player2.isDie && (player1.isDie || dis2 <= dis1))
- {
- target = player2.gameObject;
- }
- else
- {
- return;
- }
- isDoing = true;
- isFollow = true;
- pastTime = 0;
- curLock.SetActive(true);
- curLock.transform.position = transform.position;
- }
- Vector3 sp = Vector3.zero;
- private void FollowPlayer()
- {
- curLock.transform.position = Vector3.MoveTowards(curLock.transform.position, target.transform.position, 0.5f);
- //curLock.transform.position = Vector3.SmoothDamp(curLock.transform.position, target.transform.position, ref sp, 0.4f);
- if (Vector3.Distance(curLock.transform.position, target.transform.position) <= 1f)
- {
- curLock.transform.position = target.transform.position;
- isOn = true;
- isFollow = false;
- }
- }
- private void LockPlayer()
- {
- }
- public void FloatAttack()
- {
- curFe.transform.position = curLock.transform.position;
- curLock.SetActive(false);
- curFe.SetActive(true);
- }
- private void Update()
- {
- //出场飞升
- if (isRise)
- {
- MoveToHeight();
- if (curHeight - height <= 0.02f && curHeight - height >= -0.02f)
- {
- isRise = false;
- curHeight = height;
- transform.position = new Vector3(origPos.x, height, origPos.z);
- }
- }
- //隔一段时间发动一次锁定攻击
- if (!isRise && !isDoing && (ene.state == CharacterState.Idle || ene.state == CharacterState.Run || ene.state == CharacterState.Attack))
- {
- pastTime += Time.deltaTime;
- if (pastTime >= intervalTime)
- {
- ChoosePlayer();
- }
- }
- //跟随玩家
- if (isFollow)
- {
- FollowPlayer();
- }
- if (isOn)
- {
- pastTime += Time.deltaTime;
- if (pastTime >= followTime)
- {
- isFollow = false;
- isLock = true;
- pastTime = 0;
- isOn = false;
- }
- }
- //锁定范围
- if (isLock)
- {
- pastTime += Time.deltaTime;
- LockPlayer();
- if (pastTime >= lockTime)
- {
- isLock = false;
- isAttack = true;
- pastTime = 0;
- }
- }
- //攻击
- if (isAttack)
- {
- FloatAttack();
- isAttack = false;
- isDoing = false;
- }
- }
- }
|