• Hit 상태 수정

Enemy를 시야 밖에서 때리면 아무것도 못하고 맞기만 하는 상황을 방지하기 위해 선타를 맞았을 경우, 범위가 아니어도 쫓아가도록 수정했다.

private Creature _lastAttacker;

public override void OnHit(IHitCollider attacker) {
    if (attacker.HitInfo.Owner is Creature attackerCreature && attackerCreature.IsValid() && !attackerCreature.IsDead && IsTarget(attackerCreature))
        Target = attackerCreature;
        _lastAttacker = Target; // 자신을 공격한 타겟 저장.
    base.OnHit(attacker);
}

private void OnStayChase() {
    // ...생략
    // Target이 선타하지 않았고 감지할 수 있는 거리 밖으로 벗어나면 Target 정보 초기화.
    if (sqrDistance > DetectingRange * DetectingRange && Target != _lastAttacker) {
        Target = null;
        return;
    }
}

 

TODO: 처리되지 않은 Enemy들은 모두 Chase 상태로 남아있게 되기 때문에 길찾기 알고리즘을 달거나, 플레이어가 방을 이동한 경우에 Enemy의 상태를 초기화 해야한다.

 

  • Dead 상태 수정

Enemy와 플레이어 모두 죽지 않는다.

원인은

1. Hp가 깎이지 않는다.
2. Hp는 깎이는데 상태 전환이 이루어지지 않는다.

둘 중 하나일 것이다.

 

먼저 Hp가 깎였는지 확인하기 위해 Debug를 찍어보았다.

public float Hp {
    get => _hp;
    set {
        if (_hp == value) return;
        if (value <= 0)
        {
            if (State.Current != CreatureState.Dead)
                Debug.Log($"[Creature: {this.Data.Key}] 쥬금");
                State.Current = CreatureState.Dead;
            _hp = 0;
        }
        else if (value >= HpMax) {
            _hp = HpMax;
        }
        else _hp = value;
        OnChangedHp?.Invoke(_hp);
    }
}

 

Console창에 아무것도 뜨지 않는 걸 보니 Hp가 깎이지 않고 있다.

 

Hp를 깎는 Damage를 확인해보았다.

public virtual void OnHit(IHitCollider attacker) {
    HitInfo hitInfo = attacker.HitInfo;
    Debug.Log($"{hitInfo.Damage}의 피해를 입었따. 죽어라 - !");
    Hp -= hitInfo.Damage;
    // ...생략
}

Damage 값을 받아오는 초기 생성자를 확인해보니 최소값이 0이어서 들어오고 있지 않았다. 수정 후, 실행해보니 잘 동작한다.

 

그런데 플레이어는 여전히 Damage를 입지 않아서 확인해보니 Enemy의 투사체가 WorldPosition(0, 0)에서 생성되고 있었다.

 

이제 서로 죽일 수 있다;)

'부트캠프 > Project' 카테고리의 다른 글

Enemy - FSM(5) Blend Tree(블렌드 트리)  (0) 2024.02.14
Enemy - FSM(4) 트러블 슈팅  (0) 2024.02.13
Enemy - FSM(3)  (0) 2024.02.13
Enemy - FSM(2)  (0) 2024.02.08
Enemy - FSM(1)  (0) 2024.02.07

Blend Tree(블렌드 트리)

애니메이션을 블렌드 트리로 제어하면 여러 경우의 수를 그룹으로 나누어 예외 없이 처리할 수 있다.

예를 들어 Idle과 Run이라는 상태와 Attack, AttackRun(움직이며 공격)이라는 상태를 Speed라는 파라미터로 그룹으로 묶어 속력을 가지고 있는지, Attack 상태인지 조건을 확인하여 상태를 전환시킬 수 있다.

 

Idle -> if: Speed>0.01, Attack=true -> AttackRun
Idle -> if: Speed>0.01, Attack=false -> Run
Idle -> if: Speed<0.01, Attack=true -> Attack
Idle -> if: Speed<0.01, Attack=false = Idle

 

위와 같이 Idle이라는 하나의 상태에 조건을 붙였을 때, 기존의 파라미터로 표현하면 네 가지 경우를 생각하여 화살표를 그려주어야 하지만 블렌드 트리를 이용하면 좀더 쉽게 제어할 수 있다.

'부트캠프 > Project' 카테고리의 다른 글

Enemy - FSM(6) 트러블 슈팅 및 수정  (0) 2024.02.16
Enemy - FSM(4) 트러블 슈팅  (0) 2024.02.13
Enemy - FSM(3)  (0) 2024.02.13
Enemy - FSM(2)  (0) 2024.02.08
Enemy - FSM(1)  (0) 2024.02.07
  • Enemy가 적대관계의 피격범위에 들어갔다가 나왔을 때 멈추지 않고 같은 방향으로 돌진하는 버그

공격범위 밖일 때, Attack 상태를 빠져나가는 처리를 하지 않아서 그런 것이었다.

if (delta.sqrMagnitude > Range * Range)
{
    if (delta.sqrMagnitude < 4 * Sight * Sight)
    {
        State.Current = CreatureState.Chase;
        Debug.Log("공격범위 벗어남");
        return;
    }
}

공격범위를 벗어났고 시야범위에 있다면 Chase 상태가 되도록 조건을 걸었다.

 

  • 피격 당하면 Idle 상태로 돌아가는 버그

피격 시, Idle로 전환되도록 임시 방편으로 설정해둔 코드 때문이었다.

if (hitInfo.Knockback.time > 0) {
    CreatureState originState = State.Current; // 원래 상태 저장.
    State.Current = CreatureState.Hit;
    Velocity = (this.transform.position - attacker.CurrentPosition).normalized * hitInfo.Knockback.speed;
    State.SetStateAfterTime(originState, hitInfo.Knockback.time); // 넉백 시간이 끝나면 원래 상태로 돌아간다.
}

Hit 상태 전의 상태를 저장한 뒤, 넉백 시간이 끝나면 돌아오도록 했다.

'부트캠프 > Project' 카테고리의 다른 글

Enemy - FSM(6) 트러블 슈팅 및 수정  (0) 2024.02.16
Enemy - FSM(5) Blend Tree(블렌드 트리)  (0) 2024.02.14
Enemy - FSM(3)  (0) 2024.02.13
Enemy - FSM(2)  (0) 2024.02.08
Enemy - FSM(1)  (0) 2024.02.07
  • Enemy FSM 간단구현

Chase 상태 <-> Attack 상태 전환
조건: Player나 적대관계의 적이 공격 범위에 들어오면 Attack 상태로 전환한다.

TODO: 애니메이션 Resource 추가.



근거리 공격 처리
기존의 Projectile은 투사체로, 원거리 공격만 해당된다. 근거리 공격 처리는 어떻게 할 것인가?

<방법>
투사체의 사정거리를 짧게 구현한다.


<선택 및 이유>
HitCollide(= Projectile) 하나로 원거리와 근거리를 구현할 수 있다.

 

 

<할 일 계획>

Attack 상태일 때 공격 정보(생성하기 위한 정보, 매개체 자신의 정보, 피격자가 이용할 정보)를 받아와 공격하도록 구현하기

void OnStayAttack() {
    매개체: Prefab(애니메이션 등이 담긴) 생성
    지속시간 및 사정거리
    Attacker에게 공격 정보 전달.
}

 

'부트캠프 > Project' 카테고리의 다른 글

Enemy - FSM(5) Blend Tree(블렌드 트리)  (0) 2024.02.14
Enemy - FSM(4) 트러블 슈팅  (0) 2024.02.13
Enemy - FSM(2)  (0) 2024.02.08
Enemy - FSM(1)  (0) 2024.02.07
Skill 구상  (0) 2024.01.23

+ Recent posts