240 lines
6.4 KiB
C#
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
|
|
}
|