阶段性完成
This commit is contained in:
@@ -1,52 +1,147 @@
|
||||
using System.Collections.Generic;
|
||||
using Cielonos.UI;
|
||||
using DG.Tweening;
|
||||
using Lean.Pool;
|
||||
using SLSFramework.General;
|
||||
using UniRx;
|
||||
using AnimatorPlus;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Cielonos.MainGame.Characters
|
||||
{
|
||||
public class NexusCrab : Automata
|
||||
public partial class NexusCrab : Automata
|
||||
{
|
||||
protected override void Start()
|
||||
{
|
||||
base.Start();
|
||||
RegisterFunctionsToAnimSc(SingleSwing, ThreeSwings_0, ThreeSwings_1, ThreeSwings_2,
|
||||
ImpaleWave_Blast, ImpaleWave_Wave, JumpAttack_Blast);
|
||||
ClawStabBlast, ClawImpaleWave, JumpAttackBlast, BumpImpaleWave,
|
||||
GenerateNormalBulletSpawner, GenerateShockwaveMissileSpawner, GeneratePiercingBulletSpawner);
|
||||
|
||||
PlayerCanvas.Instance.bossInfoUIArea.CreateInfoUnit(this);
|
||||
|
||||
}
|
||||
|
||||
protected override void InitializeSubmodules()
|
||||
{
|
||||
base.InitializeSubmodules();
|
||||
eventSm.onGetAttacked.InsertByPriority("UI_HealthBarUpdate", new PrioritizedAction<AttackAreaBase, AttackResult>(UI_HealthBarUpdate));
|
||||
eventSm.onUseEnergy.InsertByPriority("UI_EnergyBarUpdate", new PrioritizedAction<CharacterBase, float>(UI_EnergyBarUpdate));
|
||||
}
|
||||
|
||||
public override void Die()
|
||||
{
|
||||
PlayerCanvas.Instance.bossInfoUIArea.RemoveInfoUnit(this);
|
||||
base.Die();
|
||||
}
|
||||
|
||||
private void UI_HealthBarUpdate(AttackAreaBase attackArea, AttackResult attackResult)
|
||||
{
|
||||
if (attackResult.finalDamage > 0) PlayerCanvas.Instance.bossInfoUIArea[this]?.UpdateHealth();
|
||||
}
|
||||
|
||||
private void UI_EnergyBarUpdate(CharacterBase user, float energyUsed)
|
||||
{
|
||||
if(energyUsed > 0) PlayerCanvas.Instance.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 ImpaleWave_Blast() => GenerateBlast("ImpaleWave_Blast", 4);
|
||||
private void ImpaleWave_Wave() => GenerateWave("ImpaleWave_Wave");
|
||||
private void JumpAttack_Blast() => GenerateBlast("JumpAttack_Blast", 24);
|
||||
private void ClawStabBlast()
|
||||
{
|
||||
GenerateBlast("ClawStabBlast", "ClawStabBlast", 6);
|
||||
feedbackSc["ImpaleWave_Stab"].Play();
|
||||
}
|
||||
|
||||
private void ClawImpaleWave()
|
||||
{
|
||||
GenerateImpaleWave("ImpaleWave");
|
||||
feedbackSc["ImpaleWave_Wave"].Play();
|
||||
}
|
||||
|
||||
private void JumpAttackBlast()
|
||||
{
|
||||
GenerateBlast("JumpAttackBlast", "JumpAttackBlast", 30);
|
||||
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["LightAttack"])
|
||||
.SetAttackSubmodule<NormalArea>(attackData["Swing"])
|
||||
.SetTimeSubmodule<NormalArea>(1.5f)
|
||||
.SetHitSubmodule<NormalArea>()
|
||||
.SetForceSubmodule<NormalArea>(8f, true);
|
||||
|
||||
slash.hitSm.AddHitSound("GeneralHit");
|
||||
}
|
||||
|
||||
private void GenerateBlast(string vfxName, float force)
|
||||
private void GenerateBlast(string vfxName, string attackDataName, float force)
|
||||
{
|
||||
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
|
||||
slash.Initialize<NormalArea>(this, null, Fraction.Player)
|
||||
.SetAttackSubmodule<NormalArea>(attackData["LightAttack"])
|
||||
.SetAttackSubmodule<NormalArea>(attackData[attackDataName])
|
||||
.SetTimeSubmodule<NormalArea>(1.2f)
|
||||
.SetHitSubmodule<NormalArea>()
|
||||
.SetForceSubmodule<NormalArea>(force, true)
|
||||
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false);
|
||||
}
|
||||
|
||||
private void GenerateWave(string vfxName)
|
||||
private void GenerateImpaleWave(string vfxName)
|
||||
{
|
||||
NormalArea slash = vfxData.SpawnVFX(vfxName).GetComponentInChildren<NormalArea>();
|
||||
slash.Initialize<NormalArea>(this, null, Fraction.Player)
|
||||
.SetAttackSubmodule<NormalArea>(attackData["LightAttack"])
|
||||
.SetTimeSubmodule<NormalArea>(1.5f)
|
||||
.SetAttackSubmodule<NormalArea>(attackData["ImpaleWave"])
|
||||
.SetTimeSubmodule<NormalArea>(3f, 0.2f, 1.3f)
|
||||
.SetHitSubmodule<NormalArea>()
|
||||
.SetForceSubmodule<NormalArea>(16f, true)
|
||||
.SetReactionSubmodule<NormalArea>(false, false, false, true, true, false);
|
||||
@@ -54,5 +149,84 @@ namespace Cielonos.MainGame.Characters
|
||||
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.flexibleCenterPoint.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);
|
||||
|
||||
projectile.hitSm.AddHitSound("NormalBullet_Hit");
|
||||
}
|
||||
|
||||
private void GenerateShockwaveMissile()
|
||||
{
|
||||
Player player = MainGameManager.Player;
|
||||
if(player == null) return;
|
||||
bulletSpawnerTransform.forward = (player.flexibleCenterPoint.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>()
|
||||
.SetTraceMoveModule<Projectile>(player, 20f, -2f, 60f, -10f, bulletSpawnerTransform.forward, false)
|
||||
.SetRaycastSubmodule<Projectile>(default, 0.1f, 0.2f)
|
||||
.SetForceSubmodule<Projectile>(1f)
|
||||
.SetReactionSubmodule<Projectile>(false, false, false, true, false, false);
|
||||
|
||||
projectile.hitSm.AddHitSound("ShockwaveMissile_Hit");
|
||||
}
|
||||
|
||||
private void GeneratePiercingBullet()
|
||||
{
|
||||
Player player = MainGameManager.Player;
|
||||
if(player == null) return;
|
||||
bulletSpawnerTransform.forward = (player.flexibleCenterPoint.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);
|
||||
|
||||
projectile.hitSm.AddHitSound("PiercingBullet_Hit");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user