Files
Cielonos/Assets/Scripts/MainGame/Characters/Automata/Enemies/NexusCrab.cs
SoulliesOfficial 2e00676794 重做杂兵
2026-05-11 15:22:30 -04:00

238 lines
10 KiB
C#

using System.Collections.Generic;
using Cielonos.MainGame.UI;
using DG.Tweening;
using Lean.Pool;
using SLSUtilities.General;
using SLSUtilities.WwiseAssistance;
using UniRx;
using UnityEngine;
namespace Cielonos.MainGame.Characters
{
public partial class NexusCrab : Enemy
{
protected override void Start()
{
base.Start();
RegisterFunctionsToAnimSc(SingleSwing, ThreeSwings_0, ThreeSwings_1, ThreeSwings_2,
ClawStabBlast, ClawImpaleWave, JumpAttackBlast, BumpImpaleWave,
GenerateNormalBulletSpawner, GenerateShockwaveMissileSpawner, GeneratePiercingBulletSpawner);
PlayerCanvas.BossInfoUIArea.CreateInfoUnit(this);
}
protected override void InitializeSubmodules()
{
base.InitializeSubmodules();
eventSm.onHealthChanged.InsertByPriority("UI_HealthBarUpdate", new PrioritizedAction<float>(UI_HealthBarUpdate));
eventSm.onEnergyChanged.InsertByPriority("UI_EnergyBarUpdate", new PrioritizedAction<float>(UI_EnergyBarUpdate));
}
private void UI_HealthBarUpdate(float healthChanged)
{
PlayerCanvas.BossInfoUIArea[this]?.UpdateHealth();
}
private void UI_EnergyBarUpdate(float energyUsed)
{
PlayerCanvas.BossInfoUIArea[this]?.UpdateEnergy();
}
private void SingleSwing() => GenerateSlash("SingleSwing");
private void ThreeSwings_0() => GenerateSlash("ThreeSwings_0");
private void ThreeSwings_1() => GenerateSlash("ThreeSwings_1");
private void ThreeSwings_2() => GenerateSlash("ThreeSwings_2");
private void ClawStabBlast()
{
GenerateClawStabBlast("ClawStabBlast", "ClawStabBlast", 10);
//feedbackSc["ImpaleWave_Stab"].Play();
}
private void ClawImpaleWave()
{
GenerateImpaleWave("ImpaleWave");
//feedbackSc["ImpaleWave_Wave"].Play();
}
private void JumpAttackBlast()
{
GenerateJumpAttackBlast("JumpAttackBlast", "JumpAttackBlast", 10);
//feedbackSc["JumpAttack_Blast"].Play();
}
private void BumpImpaleWave()
{
GenerateImpaleWave("ImpaleWave");
//feedbackSc["ImpaleWave_Wave"].Play();
}
private void GenerateNormalBulletSpawner()
{
GenerateBulletSpawner("NormalBulletSpawner");
Observable.Timer(System.TimeSpan.FromSeconds(0.3f)).Subscribe(_ =>
{
Observable.Interval(System.TimeSpan.FromSeconds(0.2f)).Take(6).Subscribe(__ =>
{
GenerateNormalBullet();
});
});
}
private void GenerateShockwaveMissileSpawner()
{
GenerateBulletSpawner("SpecialBulletSpawner");
Observable.Timer(System.TimeSpan.FromSeconds(0.3f)).Subscribe(_ =>
{
Observable.Interval(System.TimeSpan.FromSeconds(0.5f)).Take(2).Subscribe(__ =>
{
GenerateShockwaveMissile();
});
});
}
private void GeneratePiercingBulletSpawner()
{
GenerateBulletSpawner("SpecialBulletSpawner");
Observable.Timer(System.TimeSpan.FromSeconds(0.3f)).Subscribe(_ =>
{
Observable.Interval(System.TimeSpan.FromSeconds(0.5f)).Take(2).Subscribe(__ =>
{
GeneratePiercingBullet();
});
});
}
private void GenerateSlash(string vfxName)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData["Swing"])
.SetTimeSubmodule<NormalArea>(1.5f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(5f, true);
slash.hitSm.AddHitSound(AK.EVENTS.NEXUSCRAB_GENERALHIT);
}
private void GenerateClawStabBlast(string vfxName, string attackDataName, float force)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData[attackDataName])
.SetTimeSubmodule<NormalArea>(1.2f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(transform.forward * force)
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false, false);
}
private void GenerateJumpAttackBlast(string vfxName, string attackDataName, float force)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData[attackDataName])
.SetTimeSubmodule<NormalArea>(1.2f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(force, true)
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false, false);
}
private void GenerateImpaleWave(string vfxName)
{
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
slash.Initialize<NormalArea>(this, null, Fraction.Player)
.SetAttackSubmodule<NormalArea>(attackData["ImpaleWave"])
.SetTimeSubmodule<NormalArea>(3f, 0.2f, 1.3f)
.SetHitSubmodule<NormalArea>()
.SetForceSubmodule<NormalArea>(transform.forward * 30f)
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false, false);
slash.transform.DOLocalMoveZ(8f, 0.8f).From(0f).Play();
slash.transform.DOScale(1.5f, 0.8f).From(1f).Play();
}
private Transform bulletSpawnerTransform;
private void GenerateBulletSpawner(string vfxName)
{
bulletSpawnerTransform = vfxData.SpawnVFX(vfxName).transform;
Observable.Timer(System.TimeSpan.FromSeconds(1.25f)).Subscribe(_ =>
{
bulletSpawnerTransform.GetComponent<ParticleSystem>().Stop(true);
LeanPool.Despawn(bulletSpawnerTransform.gameObject, 0.3f);
});
}
private void GenerateNormalBullet()
{
Player player = MainGameManager.Player;
if(player == null) return;
bulletSpawnerTransform.forward = (player.centerPoint.position - bulletSpawnerTransform.position).normalized;
vfxData.SpawnMuzzleVFX("NormalBullet", bulletSpawnerTransform);
//audioSc.audioContainer.PlaySoundFX("NormalBullet_Shoot", bulletSpawnerTransform.position);
Projectile projectile = vfxData.SpawnVFX("NormalBullet", bulletSpawnerTransform).GetComponentInChildren<Projectile>();
projectile.Initialize(this, null, false, 1, Fraction.Player)
.SetAttackSubmodule<Projectile>(attackData["NormalBullet"])
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetLinearDirectionMoveModule<Projectile>(bulletSpawnerTransform.forward, 20f)
.SetRaycastSubmodule<Projectile>()
.SetForceSubmodule<Projectile>(1f)
.SetReactionSubmodule<Projectile>(true, false, false, true, false, false, true);
projectile.hitSm.AddHitSound(AK.EVENTS.NEXUSCRAB_NORMALBULLET_HIT);
}
private void GenerateShockwaveMissile()
{
Player player = MainGameManager.Player;
if(player == null) return;
bulletSpawnerTransform.forward = (player.centerPoint.position - bulletSpawnerTransform.position).normalized;
vfxData.SpawnMuzzleVFX("ShockwaveMissile", bulletSpawnerTransform);
//audioSc.audioContainer.PlaySoundFX("ShockwaveMissile_Shoot", bulletSpawnerTransform.position);
Projectile projectile = vfxData.SpawnVFX("ShockwaveMissile", bulletSpawnerTransform).GetComponentInChildren<Projectile>();
projectile.Initialize(this, null, false, 1, Fraction.Player)
.SetAttackSubmodule<Projectile>(attackData["ShockwaveMissile"])
.SetTimeSubmodule<Projectile>(5f)
.SetHitSubmodule<Projectile>()
.SeDetachableTraceMoveModule<Projectile>(player, 20f, -2f, 60f, -10f, bulletSpawnerTransform.forward)
.SetRaycastSubmodule<Projectile>(default, 0.1f, 0.2f)
.SetForceSubmodule<Projectile>(1f)
.SetReactionSubmodule<Projectile>(false, false, false, true, false, false, true);
projectile.hitSm.AddHitSound(AK.EVENTS.NEXUSCRAB_SHOCKWAVEMISSILE_HIT);
}
private void GeneratePiercingBullet()
{
Player player = MainGameManager.Player;
if(player == null) return;
bulletSpawnerTransform.forward = (player.centerPoint.position - bulletSpawnerTransform.position).normalized;
vfxData.SpawnMuzzleVFX("PiercingBullet", bulletSpawnerTransform);
//audioSc.audioContainer.PlaySoundFX("PiercingBullet_Shoot", bulletSpawnerTransform.position);
Projectile projectile = vfxData.SpawnVFX("PiercingBullet", bulletSpawnerTransform).GetComponentInChildren<Projectile>();
projectile.Initialize(this, null, false, 1, Fraction.Player)
.SetAttackSubmodule<Projectile>(attackData["PiercingBullet"])
.SetTimeSubmodule<Projectile>(10f)
.SetHitSubmodule<Projectile>()
.SetLinearDirectionMoveModule<Projectile>(bulletSpawnerTransform.forward, 60f)
.SetRaycastSubmodule<Projectile>()
.SetForceSubmodule<Projectile>(1f)
.SetReactionSubmodule<Projectile>(false, false, true, true, false, false, true);
projectile.hitSm.AddHitSound(AK.EVENTS.NEXUSCRAB_PIERCINGBULLET_HIT);
}
}
}