Files
FutureMen/Assets/Scripts/Enemy/Leviathan/Leviathan.cs
2025-12-25 18:18:45 +08:00

685 lines
22 KiB
C#

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using DragonLi.Core;
using DragonLi.Frame;
using UnityEngine;
public class Leviathan : Enemy
{
public float oneAttackInterval;
public GameObject player;
public Transform[] enemyPos;
public GameObject bigXl;//大招蓄力特效
public GameObject mzObj;//瞄准特效
public GameObject damagableObj;//受伤特效
private bool _startAttack;
private bool _isAttacking;
public int attackMode;
public override void Init()
{
base.Init();
bigXl.SetActive(false);
mzObj.SetActive(false);
damagableObj.SetActive(false);
player = GameManager.Ins.player;
foreach (var item in components)
{
item.Stop();
}
components[^1].boxCollider.enabled = false;
bloodSlider.gameObject.SetActive(false);
enemyState = EnemyState.Show;
attackMode = 0;
}
public override void Show()
{
base.Show();
isAttack = false;
isShield = true;
_isShow = true;
AnimatorComponent.SetFloat("speedf",1);
if (GameInit.Ins.gamePlace == GamePlace.Company1Floor)
{
transform.DOMove(new Vector3(-11.2f,1.5f,0.6f), 4).OnComplete(() =>
{
Both();
});
}
if (GameInit.Ins.gamePlace == GamePlace.HangZhouLongHuTianJie)
{
transform.DOMoveX(24f, 4).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.LiaoningAnShan)
{
Both();
}
else if(GameInit.Ins.gamePlace==GamePlace.Yangzhou_Hanjiang_Tansuozhongxin)
{
transform.DOMoveZ(-8f, 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Guangzhou_Panyv_Zhanting)
{
transform.DOMoveX(17.5f, 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Anhui_Wuhu_Guanwei)
{
transform.DOMoveZ(-8.5f, 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Zhejiang_Jinhua_KeJiGuan)
{
transform.DOMoveZ(18f, 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Shandong_Jining_Shangchang)
{
transform.DOMove(new Vector3(16f,1f,5f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Shandong_Jining_Shangchang_nei)
{
transform.DOMove(new Vector3(-12f,-5.5f,-1f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.ShanDong_Langfang_QingzhouTaihuacheng)
{
transform.DOMove(new Vector3(4.64f,transform.position.y,21.76f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Jilin_Tonghua_Liuhe)
{
transform.DOMove(new Vector3(-2.14f,transform.position.y,-5.73f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Shandong_Jinan_Huaiyin_ShengfutongShangmao)
{
transform.DOMove(new Vector3(-0.7f,transform.position.y,13f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Shandong_Jinan_Huaiyin_ShengfutongShangmao_wai)
{
transform.DOMove(new Vector3(-11.84f,1.5f,1.04f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace==GamePlace.Hunan_Jishou_Qianzhou_Tianhong)
{
transform.DOMove(new Vector3(1.5f,transform.position.y,-22.1f), 2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Hubei_Xiangyang_Kejiguan)
{
transform.DOMove(new Vector3(1.4f,-2.5f,18.6f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Zhejiang_Shaoxing_Shengzhou_WuyueGuangchang)
{
transform.DOMove(new Vector3(-11.76f,-1.5f,11.37f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Henan_Xinzheng_Shuanghudadao_Longhujinyicheng)
{
transform.DOMove(new Vector3(-1.4f,-3.5f,-18.2f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Nanjing_Qixia_Yaohuamen_Jindiguangchang)
{
transform.DOMove(new Vector3(-10.73f,1.5f,-0.02f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Nanjing_Qixia_Yaohuamen_Jindiguangchang_nei)
{
transform.DOMove(new Vector3(-4f,1.5f,-10.7f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Anshan_Suzhou_Yueshan_Guchengshangyejie)
{
transform.DOMove(new Vector3(-10.41f,1.5f,0.04f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Gansu_Longnan_Shicheng_Dongsheng)
{
transform.DOMove(new Vector3(-3.1f,1.5f,25f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Shandong_Heze_Yuncheng_Gefuli)
{
transform.DOMove(new Vector3(18.7f,transform.position.y,-0.6f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Wulanhaote_Ouya_Shangchang)
{
transform.DOMove(new Vector3(7.89f,-3.5f,22.58f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Wulanhaote_Wanda_Shangchang)
{
transform.DOMove(new Vector3(-8.1f,-3.5f,18.4f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Hunan_Hengyang_Zhuhui_Dongzhoudao)
{
transform.DOMove(new Vector3(-6.27f,-3.5f,11.06f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Hunan_Hengyang_Zhuhui_Dongzhoudao_nei
|| GameInit.Ins.gamePlace == GamePlace.Jiangsu_Xvzhou_Fengxian_Wuyueguangchang
|| GameInit.Ins.gamePlace == GamePlace.Jiangsu_Xvzhou_Guolou_Oulebao_2
|| GameInit.Ins.gamePlace == GamePlace.Chongqing_Yuzhong_Hongyadong_Xiakexing_shiwan
)
{
transform.DOMove(new Vector3(-0.25f,-3.5f,10.92f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Yunnan_Lincang_Linxiang_Hengji)
{
transform.DOMove(new Vector3(-6.82f,-3.5f,-4.71f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Yunnan_Lincang_Linxiang_Hengji_Dixia)
{
transform.DOMove(new Vector3(-0.59f,-3.5f,17.31f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Yunnan_Mile_Jinchen_Shidaiguangchang)
{
transform.DOMove(new Vector3(-6.24f,-3.5f,11.69f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Guangxi_Guilin_Gongcheng_Shijixincheng)
{
transform.DOMove(new Vector3(-4.2f,-3.5f,12.5f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Xinjiang_Yili_Yining_Wanrong)
{
transform.DOMove(new Vector3(-8.8f,-3.5f,8.2f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Guangdong_Shenzhen_Guangming_Wanda)
{
transform.DOMove(new Vector3(-11.1f,-3.5f,10.8f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Liaoning_AnShan_Lishan_Dayuecheng)
{
transform.DOMove(new Vector3(6.25f,-3.5f,-3.81f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Hebei_Tangshan_Qianan_Tianyuangu)
{
transform.DOMove(new Vector3(0.29f,-3.5f,18.49f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Zhejiang_Hangzhou_Linping_Yintaicheng)
{
transform.DOMove(new Vector3(-11.3f,-3.5f,1.61f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Guangdong_Guangzhou_Yanghaiyan)
{
transform.DOMove(new Vector3(4.41f,-3.5f,3.87f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Gansu_Jinchang_Jinchuan_Shijiguangchang)
{
transform.DOMove(new Vector3(14.1f,-3.5f,16.8f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Gansu_Jinchang_Jinchuan_Shijiguangchang_Shiwai)
{
transform.DOMove(new Vector3(-10.67f,-3.5f,0.5f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Henan_Xinxiang_Wandaguangchang)
{
transform.DOMove(new Vector3(2.2f,-3.5f,-15f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Henan_Xinxiang_Wandaguangchang_Shinei)
{
transform.DOMove(new Vector3(-0.01f,-3.5f,11.1f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Zhejiang_Hangzhou_Linping_Yintaicheng_Shinei)
{
transform.DOMove(new Vector3(1.44f,-3.5f,9.63f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Guangdong_Guangzhou_Yanghaiyan_Lihu)
{
transform.DOMove(new Vector3(2.9f,-3.5f,0f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Nanjing_Pukou_Longhutianjie)
{
transform.DOMove(new Vector3(-1.51f,-3.5f,-6.3f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Jiangsu_Xvzhou_Guolou_Oulebao || GameInit.Ins.gamePlace == GamePlace.Jiangsu_Xvzhou_Suning_Guangchang_1)
{
transform.DOMove(new Vector3(-4.15f,-3.5f,-5.43f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Jiangsu_Xvzhou_Suning_Guangchang)
{
transform.DOMove(new Vector3(10.14f,-3.5f,-0.36f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Shanxi_Baoji_Meixian_TianlongShangcheng)
{
transform.DOMove(new Vector3(8.5f,-3.5f,-3.6f),2).OnComplete(() =>
{
Both();
});
}
else if(GameInit.Ins.gamePlace == GamePlace.Hunan_Changde_Lixian_WandaGuangchang)
{
transform.DOMove(new Vector3(16.03f,-3.5f,-1.64f),2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Jilin_Changchun_Beihu_WyueGuangchang)
{
transform.DOMove(new Vector3(-6.5f, -3.5f, -1.6f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Chongqing_Yuzhong_Hongyadong_Xiakexing)
{
transform.DOMove(new Vector3(-1.3f, -3.5f, 19.7f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Chengdu_Shuangliu_ShengfeiXuexiao)
{
transform.DOMove(new Vector3(3.4f, -3.5f, 42.3f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Anhui_Suzhou_Yueshan_Guchengshangyejie_2)
{
transform.DOMove(new Vector3(-6.75f, -3.5f, -3.57f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Hebei_Hengshui_Xinji_WandaGuangchang)
{
transform.DOMove(new Vector3(0.3f, -3.5f, 2.8f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Hunan_Zhuzhou_Wanda_Shennongcheng_Chaowanshe)
{
transform.DOMove(new Vector3(0.4f, -3.5f, 8.7f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Company1FloorShiwai)
{
transform.DOMove(new Vector3(-10.91f, 1.5f, 25.15f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Anhui_Suzhou_Yueshan_Guchengshangyejie_Shinei)
{
transform.DOMove(new Vector3(-0.17f, 1.5f, -7.49f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Hebei_Hengshui_Taocheng_WandaGuangchang)
{
transform.DOMove(new Vector3(17.8f, 1.5f, 2.7f), 2).OnComplete(() =>
{
Both();
});
}
else if (GameInit.Ins.gamePlace == GamePlace.Shandong_Jining_Shangchang_3)
{
transform.DOMove(new Vector3(-7.72f, -3.5f,1.14f), 2).OnComplete(() =>
{
Both();
});
}
else
{
transform.DOMoveZ(-15f, 2).OnComplete(() =>
{
Both();
});
}
}
public void Both()
{
AnimatorComponent.SetFloat("speedf",0);
AnimatorComponent.SetBool("isBoth",true);
GameInit.Ins.PlayAudio("2.23漂浮",transform,false);
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
{
AnimatorComponent.SetBool("isBoth",false);
isAttack = true;
bloodSlider.gameObject.SetActive(true);
isShield = false;
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
{
_isShow = false;
},6f);
},1f);
}
public override void Attack()
{
base.Attack();
if (!_isAttacking)
{
_isAttacking = true;
StartCoroutine(ShotAttack());
}
}
public override void OneAttackMode()
{
base.OneAttackMode();
StartCoroutine(OneShotAttack());
}
public override void Show2()
{
base.Show2();
StopAllCoroutines();
attackMode = 3;
}
public override void TwoAttackMode()
{
base.TwoAttackMode();
ShowEnemy();
}
public void ShowEnemy()
{
for (int i = 0; i < enemyPos.Length; i++)
{
Vector3 curEnemyPos=new Vector3(enemyPos[i].position.x,0,enemyPos[i].position.z);
GameManager.Ins.CreateCallEnemyEffect(curEnemyPos);
}
MonoSingleton<CoroutineTaskManager>.Instance.WaitSecondTodo(() =>
{
for (int i = 0; i < enemyPos.Length; i++)
{
Vector3 curEnemyPos=new Vector3(enemyPos[i].position.x,0,enemyPos[i].position.z);
GameManager.Ins.CreateEnemy(4,curEnemyPos,Vector3.zero,false);
}
},2f);
}
public override void StartQteAttack()
{
bigXl.SetActive(true);
mzObj.SetActive(true);
components[^1].StatQteAttack();
attackMode = 4;
// shieldObj.SetActive(true);
// isShield = true;
}
public GameObject qteAttackPre;
public override void BossQteAttack()
{
base.BossQteAttack();
//StartCoroutine(components[^1].FireQteMissiles());
StartCoroutine(LwtQteAttack());
}
IEnumerator LwtQteAttack()
{
qteAttackPre.SetActive(true);
AnimatorComponent.SetBool("isCastEnd",true);
userSillIng = true;
GameInit.Ins.PlayAudio("2.21激光",transform,false);
yield return new WaitForSeconds(1f);
GameInit.Ins.self.ApplyDamage(GameInit.Ins.self.maxHp/2f,null,transform);
yield return new WaitForSeconds(2.5f);
qteAttackPre.SetActive(false);
userSillIng = false;
}
public override void StopQteAttack()
{
base.StopQteAttack();
AnimatorComponent.SetBool("isCastEnd",false);
bigXl.SetActive(false);
mzObj.SetActive(false);
StopCoroutine(components[^1].FireQteMissiles());
components[^1].StopQteAttack();
shieldObj.SetActive(false);
isShield = false;
attackMode = 0;
}
[Header("抛物线参数")]
public float sideOffset = 4f; // 玩家左右目标点的水平偏移
protected IEnumerator OneShotAttack()
{
attackMode = 2;
yield return new WaitForSeconds(2f);
// 获取玩家当前位置
Vector3 center = player.transform.position;
Vector3 left = center - GameManager.Ins.player.transform.right * sideOffset;
Vector3 right = center + GameManager.Ins.player.transform.right * sideOffset;
Vector3[] targets = { center, left, right };
for (int i = 0; i < targets.Length; i++)
{
components[i+4].FireThreeMissiles(components[i].showPos.position, targets[i]);
}
yield return new WaitForSeconds(1f);
userSillIng = false;
}
[Header("配置参数")]
public float shotRadius = 5f; // 落点半径
public float shotInterval = 1f; // 每轮中两次发射的间隔
public float roundInterval = 3f; // 两轮之间的间隔
private IEnumerator ShotAttack()
{
while (_isAttacking)
{
// 获取玩家当前位置
Vector3 center = player.transform.position;
attackMode = 1;
// 两轮射击
for (int round = 0; round < 2; round++)
{
// 为本轮生成四个不重合的随机目标点
List<Vector3> targets = GenerateTargetPoints(center, shotRadius, 4);
// 遍历每个发射点
for (int i = 0; i < 4; i++)
{
components[i].ShootMissile(components[i].showPos.position, targets[i]);
}
yield return new WaitForSeconds(shotInterval);
}
attackMode = 0;
yield return new WaitForSeconds(roundInterval);
}
}
// 生成 count 个均匀分布、且带一定随机偏移的不重合圆周点
private List<Vector3> GenerateTargetPoints(Vector3 center, float radius, int count)
{
List<Vector3> pts = new List<Vector3>(count);
float step = 360f / count;
for (int i = 0; i < count; i++)
{
// 在每个扇区内随机一个角度
float angle = i * step + Random.Range(-step * 0.3f, step * 0.3f);
float rad = angle * Mathf.Deg2Rad;
Vector3 offset = new Vector3(Mathf.Cos(rad), 0, Mathf.Sin(rad)) * radius;
pts.Add(center + offset);
}
return pts;
}
public override void StopAttack()
{
base.StopAttack();
attackMode = 0;
StopAllCoroutines();
_isAttacking = false;
}
public override void ChangeHp(float value, object info, Transform _sender)
{
base.ChangeHp(value, info, _sender);
damagableObj.SetActive(health/maxHealth<=0.5f);
}
public override void Dead()
{
if(!isDead)
GameManager.Ins.CurLevelWin(transform.position.ReflectVectorXOZ());
base.Dead();
}
private bool _isShow;
private float enemyTime=90f;
private float curEnemyTime;
public override void Update()
{
base.Update();
AnimatorComponent.SetInteger("attackMode", attackMode);
if (_isShow) return;
// 平滑朝向玩家
Vector3 targetDir = GameManager.Ins.player.transform.position - transform.position;
targetDir.y = 0f;
if (targetDir != Vector3.zero)
{
Quaternion targetRotation = Quaternion.LookRotation(targetDir);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 2f);
}
curEnemyTime-=Time.deltaTime;
if (curEnemyTime <= 0)
{
if(GameManager.Ins.GetCurEnemyListCount()<=5)
ShowEnemy();
curEnemyTime = enemyTime;
}
}
}