Drone 공중에 떠서 움직이지도, 죽지도 않음
public class DroneStateMachine : BaseStateMachine
{
public DroneStateMachine(Entity entity) : base(entity)
{
}
public override void Initialize()
{
Provider = new DroneStateProivder(this);
}
public override void Reset()
{
CurrentState = Provider.GetState(Minion_States.Alive);
CurrentState.EnterState();
}
}
C#
복사
처음 생성될 때 상태 머신 진입 함수 호출을 빼줬었음 → 이유는 모르겠지만 함수를 빼서 작동하지 않음
public class DroneStateMachine : BaseStateMachine
{
public DroneStateMachine(Entity entity) : base(entity)
{
}
public override void Initialize()
{
Provider = new DroneStateProivder(this);
CurrentState = Provider.GetState(Minion_States.Alive);
CurrentState.EnterState();
}
public override void Reset()
{
CurrentState = Provider.GetState(Minion_States.Alive);
CurrentState.EnterState();
}
}
C#
복사
코드 추가해주니 정상적인 상태 변환을 보여줌
Ball 죽을 때 폭발효과 및 공격로직 발동하지 않음
기존에 Dead 상태로 진입하면 폭발 함수를 코루틴으로 구현했었음.
하지만 폭발 함수가 끝나기 전에 Ball의 Active가 false가 됨.
public class Ball_DeadState : BaseState
{
float explodeDelay = 1f;
float passedTime;
public Ball_DeadState(BaseStateMachine context, BaseStateProvider provider) : base(context, provider)
{
IsRootState = true;
}
public override void EnterState()
{
passedTime = 0f;
}
public override void UpdateState()
{
passedTime += Time.deltaTime;
if(passedTime >= explodeDelay)
{
Explosion();
}
}
,,,
private void Explosion()
{
float damage = Context.Entity.Data.damage;
RaycastHit[] hits = Physics.SphereCastAll(Context.Entity.transform.position, 10, Vector3.up, 0f);
foreach (RaycastHit hit in hits)
{
if (hit.transform.gameObject.TryGetComponent(out Entity entity))
{
Rigidbody rigidbody = entity.transform.GetComponent<Rigidbody>();
if (rigidbody != null)
{
Vector3 other = hit.transform.position;
Vector3 pushDirection = (other - _entityTransform.position).normalized;
rigidbody.AddForce(pushDirection * 14, ForceMode.Impulse);
}
entity.GetDamaged(damage);
}
if (hit.transform.gameObject.TryGetComponent(out Module module))
{
module.ModuleStatus.GetDamage(damage);
}
}
ObjectPooler.SpawnFromPool("EnemyExplosion01", _entityTransform.position);
AudioManager.Instance.PlayOneShot(FMODEvents.Instance.Ball_Explode, _entityTransform.position);
Context.Entity.gameObject.SetActive(false);
}
}
C#
복사
일반 함수로 변경 후에 따로 시간을 체크해주었음