+ MiniSandMole 프리팹 추가 + BossConfiguration So에 MiniSandMole 추가 + MiniSandMoleData, MiniSingleRollData So 추가 + MiniSandMole BehaviorTree 추가 + SandMoleMapController 클래스 추가 + ITarget, ICurrentDirection 인터페이스 추가 + Bt Actions - CanSkill, ActivateSkill 로직 변경 + BossHealthPoint 로직 변경 + 미니 모래 두더지에 소환할 때, 죽을 때, 디졸브 효과 추가 Closes #20
95 lines
3.9 KiB
C#
95 lines
3.9 KiB
C#
using System.Collections.Generic;
|
|
using BlueWater.Enemies.Bosses;
|
|
using BlueWater.Enemies.Bosses.Rhinoceros;
|
|
using BlueWater.Enemies.Bosses.SandMole;
|
|
using BlueWater.Enemies.Bosses.TitanSlime;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
|
|
namespace BlueWater.Enemies
|
|
{
|
|
public class EnemyManager : Singleton<EnemyManager>
|
|
{
|
|
[SerializeField, Required]
|
|
private BossConfigurationSo _bossConfigurationSo;
|
|
public Dictionary<BossType, GameObject> BossConfigurationDictionary { get; private set; }
|
|
|
|
[Title("타이탄 슬라임 설정")]
|
|
[SerializeField]
|
|
private float _splitPower = 500f;
|
|
|
|
[SerializeField]
|
|
private Vector3 _leftSplitDirection = new(-0.5f, 1f, 0);
|
|
|
|
[SerializeField]
|
|
private Vector3 _rightSplitDirection = new(0.5f, 1f, 0);
|
|
|
|
protected override void OnAwake()
|
|
{
|
|
InitializeDictionary();
|
|
}
|
|
|
|
private void InitializeDictionary()
|
|
{
|
|
BossConfigurationDictionary = new Dictionary<BossType, GameObject>(_bossConfigurationSo.BossConfigurationList.Count);
|
|
foreach (var element in _bossConfigurationSo.BossConfigurationList)
|
|
{
|
|
BossConfigurationDictionary.Add(element.BossType, element.Prefab);
|
|
}
|
|
}
|
|
|
|
// Public Instantiate
|
|
public Boss InstantiateBoss(BossType bossType, Vector3 spawnPosition, Transform instantiateLocation = null)
|
|
{
|
|
if (!BossConfigurationDictionary.TryGetValue(bossType, out var bossConfiguration))
|
|
{
|
|
Debug.LogError($"보스 생성 오류 : 키값 {bossType}을(를) 확인해주세요.");
|
|
return null;
|
|
}
|
|
|
|
var instantiateBoss = Instantiate(bossConfiguration, spawnPosition, Quaternion.identity, instantiateLocation).GetComponent<Boss>();
|
|
instantiateBoss.Initialize();
|
|
|
|
return instantiateBoss;
|
|
}
|
|
|
|
// TitanSlime
|
|
public TitanSlime InstantiateTitanSlime(Vector3 spawnPosition, int level, bool hasRabbit, Transform instantiateLocation = null)
|
|
{
|
|
if (!BossConfigurationDictionary.TryGetValue(BossType.TitanSlime, out var titanSlimeObject))
|
|
{
|
|
Debug.LogError($"보스 생성 오류 : 키값 {BossType.TitanSlime}을(를) 확인해주세요.");
|
|
return null;
|
|
}
|
|
|
|
var instantiateBoss = Instantiate(titanSlimeObject, spawnPosition, Quaternion.identity, instantiateLocation).GetComponent<TitanSlime>();
|
|
instantiateBoss.Initialize(level, hasRabbit);
|
|
|
|
return instantiateBoss;
|
|
}
|
|
|
|
public void SpawnSplitSlimes(Vector3 deathPosition, int nextLevel, bool hasRabbit, Transform instantiateLocation = null)
|
|
{
|
|
var instantiateBossLeft = InstantiateTitanSlime(deathPosition, nextLevel, hasRabbit, instantiateLocation);
|
|
var instantiateBossRight = InstantiateTitanSlime(deathPosition, nextLevel, false, instantiateLocation);
|
|
|
|
instantiateBossLeft.AddForce(_leftSplitDirection * _splitPower, ForceMode.Impulse);
|
|
instantiateBossRight.AddForce(_rightSplitDirection * _splitPower, ForceMode.Impulse);
|
|
}
|
|
|
|
// MiniSandMole
|
|
public MiniSandMole InstantiateMiniSandMole(Vector3 spawnPosition, Transform instantiateLocation = null)
|
|
{
|
|
if (!BossConfigurationDictionary.TryGetValue(BossType.MiniSandMole, out var bossConfiguration))
|
|
{
|
|
Debug.LogError($"보스 생성 오류 : 키값 {BossType.MiniSandMole}을(를) 확인해주세요.");
|
|
return null;
|
|
}
|
|
|
|
var instantiateBoss = Instantiate(bossConfiguration, spawnPosition, Quaternion.identity, instantiateLocation).GetComponent<MiniSandMole>();
|
|
instantiateBoss.Initialize();
|
|
|
|
return instantiateBoss;
|
|
}
|
|
}
|
|
} |