Files
FutureMen2/Assets/_FutureMen2/Scripts/Enemy/TortoiseBoss/TortoiseBoss.cs

240 lines
6.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using DarkTonic.MasterAudio;
using DG.Tweening;
using DragonLi.Core;
using UnityEngine;
using Random = UnityEngine.Random;
public class TortoiseBoss : Enemy
{
public GameObject clipQuadObj;
public Transform[] firePoints;
public GameObject fireBallPre;
public GameObject trampleEffectPre;
public GameObject skill3Effect;
public EnemyBoneHit[] boneHits;
public Animator bossAnim;
[Header("Drill Move")]
public float drillMoveSpeed = 12f;
public float drillRotateSpeed = 720f;
public LayerMask drillHitMask; // 建筑 / 墙
public EnemyBoneHit skill3Collider;
public Collider mainCollider;
public GameObject[] bossCrystals;
private Vector3 drillStartPosition; // 记录Drilling开始时的位置
private void Start()
{
mainCollider = GetComponent<Collider>();
clipQuadObj.transform.localPosition = new Vector3(0, -3f, 0);
foreach (var bone in boneHits)
{
bone.SetDamage(Data.Atk_1P);
}
skill3Effect.SetActive(false);
skill3Collider.GetComponent<Collider>().enabled = false;
skill3Collider.SetDamage(Data.Atk_3);
transform.LookAt(GameManager.Ins.player.transform.position.ReflectVectorXOZ());
foreach (var item in bossCrystals)
{
item.SetActive(false);
}
bloodSlider.gameObject.SetActive(false);
}
public override void Update()
{
base.Update();
if (enemyState != EnemyState.Show && enemyState != EnemyState.Dead)
{
skill1Timer += Time.deltaTime;
skill2Timer += Time.deltaTime;
teleportTimer += Time.deltaTime;
}
}
public void ResetSkill1() => skill1Timer = 0;
public void ResetSkill2() => skill2Timer = 0;
public void ResetTeleport() => teleportTimer = 0;
public override void Show()
{
base.Show();
GameManager.Ins.PlaySound3D("1.48",transform);
clipQuadObj.transform.DOLocalMoveY(13, 5).OnComplete(() =>
{
isShowEnd = true;
Roar();
});
}
public override void EndShow()
{
base.EndShow();
foreach (var item in bossCrystals)
{
item.SetActive(true);
}
bloodSlider.gameObject.SetActive(true);
}
/// <summary>
/// 吼叫
/// </summary>
public void Roar()
{
bossAnim.SetInteger("State",0);
GameManager.Ins.PlaySound3D("1.2",transform);
}
/// <summary>
/// 跑
/// </summary>
public void Run()
{
bossAnim.SetInteger("State", 2);
GameManager.Ins.PlaySound3D("1.19",transform);
}
public void Idle()
{
bossAnim.SetInteger("State", 1);
GameManager.Ins.PlaySound3D("1.29",transform,true);
}
public override void Hit()
{
if(enemyState!= EnemyState.Idle)
return;
base.Hit();
int hitIndex = Random.Range(0, 100);
string hitStr=hitIndex>=50 ?"isHit1":"isHit2";
bossAnim.SetTrigger(hitStr);
}
public IEnumerator Drilling()
{
// 记录开始位置
drillStartPosition = transform.position;
Debug.Log($"[TortoiseBoss] Drilling开始 - 记录位置: {drillStartPosition}");
// 关闭导航 & 主碰撞
aiPath.enabled = false;
mainCollider.enabled = false;
GameManager.Ins.PlaySound3D("1.24", transform, true);
bossAnim.SetInteger("State", 6); // 钻地开始
yield return new WaitForSeconds(4f); // 钻地动画长度
bossAnim.SetInteger("State", 7); // 地下状态
skill3Effect.SetActive(true);
skill3Collider.enabled = true;
mainCollider.enabled = true;
}
public IEnumerator EndDrilling()
{
skill3Effect.SetActive(false);
skill3Collider.enabled = false;
mainCollider.enabled = false;
// 先移动到记录的位置,再开始钻出动画
transform.position = drillStartPosition;
Debug.Log($"[TortoiseBoss] EndDrilling - 从记录位置钻出: {drillStartPosition}");
bossAnim.SetInteger("State", 8); // 钻出
yield return new WaitForSeconds(3f); // 钻出动画
// ⚠️ 下一帧再恢复
yield return null;
aiPath.enabled = true;
GameManager.Ins.PlaySound3D("1.27", transform, true);
Idle();
}
public void Trample()
{
bossAnim.SetInteger("State", 3);
MasterAudio.StopAllSoundsOfTransform(transform);
CoroutineTaskManager.Instance.WaitSecondTodo(() =>
{
GameManager.Ins.PlaySound3D("践踏",transform,true);
ShowTrampEx();
}, 2f);
}
public void ShowTrampEx()
{
GameObject ex= Instantiate(trampleEffectPre,transform.position,Quaternion.identity);
var exSp= ex.GetComponent<EnemyBoneHit>();
if(exSp!=null)
exSp.SetDamage(Data.Atk_1P);
}
public override void ChangeHp(float value, object info, Transform _sender)
{
if(enemyState== EnemyState.Show)
return;
base.ChangeHp(value, info, _sender);
}
#region Die
public override void Dead()
{
if (isDead)
{
return;
}
GameManager.Ins.curLevel++;
isDead = true;
health = 0;
if (bloodSlider != null)
bloodSlider.gameObject.SetActive(false);
if(ColliderComponent!=null)
ColliderComponent.enabled = false;
if(behaviourTree != null)
behaviourTree.enabled = false;
foreach (var item in bossCrystals)
{
if(item==null)
continue;
item.SetActive(false);
}
GameManager.Ins.PlaySound3D("1.46",transform,true);
StartCoroutine(DeathDissolve());
}
IEnumerator DeathDissolve()
{
clipQuadObj.SetActive(true);
bloodSlider.gameObject.SetActive(false);
clipQuadObj.transform.localPosition = new Vector3(0, 13f, 0);
bossAnim.SetBool("isDie",true);
yield return new WaitForSeconds(3f);
clipQuadObj.transform.DOLocalMoveY(-5f, 5);
yield return new WaitForSeconds(8f);
GameManager.Ins.CreateBoss(transform.position.ReflectVectorXOZ());
Destroy(gameObject);
}
#endregion
}