• Boss FSM 구상

Chase 상태
보스는 일반 몹과 다르게 방이 따로 존재하며 Player를 반드시 공격해야한다.

<방법>
방법 1. Player가 보스방에 진입 후, 움직이면 Chase 상태로 전환시킨다.(Chase 조건 추가)
방법 2. 보스의 시야범위를 방 크기로 지정한다.(Chase 조건 그대로)

<선택 및 이유>
방법 1
보스의 시야범위를 방 크기로 지정했을 때, Player가 방에 진입하자마자 보스가 공격하게 되기 때문에 정비할 시간이 없게 된다. 때문에 Chase 상태로 전환시키는 조건을 추가하는 방법을 선택했다.


페이즈 전환 및 부활
보스에게는 공격 패턴의 전환점인 페이즈가 존재한다. 또한 보스에 따라 Dead 상태에서 Idle 상태가 되는 특수한 경우(부활 등)가 존재한다.

<방법>
공통되는 부분을 BaseBoss를 상속받아 Boss별로 스크립트를 나눈다.

상속 관계

Creature -> Enemy -> BaseBoss -> Boss별 스크립트


<선택 및 이유>
직관적이며 새로운 보스 추가에 유동적이다.

 

 

<할 일 계획>

State 작동 방식 공부하기

Enemy가 Idle 상태와 Chase 상태, 그리고 Attack 상태를 왔다갔다 할 때 간단한 동작을 수행하도록 테스트하기

Attacker(Attack 함수를 통한 Creature의 실질적인 공격이 이루어지는 곳) 메커니즘 공부

 

Enemy에서 이벤트 함수를 만들고, 그것을 State에 구독시킨다.

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

Enemy - FSM(4) 트러블 슈팅  (0) 2024.02.13
Enemy - FSM(3)  (0) 2024.02.13
Enemy - FSM(1)  (0) 2024.02.07
Skill 구상  (0) 2024.01.23
Projectile 구현  (0) 2024.01.19
  • FSM 기본 구상

 

  • Enemy별 구상

 

Enemy별 FSM 세부구상 후 구현 계획!

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

Enemy - FSM(3)  (0) 2024.02.13
Enemy - FSM(2)  (0) 2024.02.08
Skill 구상  (0) 2024.01.23
Projectile 구현  (0) 2024.01.19
Stat / Status 구현  (0) 2024.01.18

캐릭터에 무기를 달기 어렵다는 점 때문에 외관상 바뀌지 않아도 되는 스킬 포인트 시스템을 차용하기로 했다.

 

초기 구상

원거리/근거리가 주 공격/ 보조 공격으로 주어지며 업그레이드로 다양한 스킬 트리를 구사할 수 있도록 한다.

즉, 기본 공격인 주 공격과 보조 공격은 스킬 선택에 따라 달라진다.

 

Skill의 역할

기본 공격(주 공격 / 보조 공격)은 스킬 포인트를 통해 업그레이드 할 수 있고 마우스 좌/우클릭을 통해 조작 가능하다.

패시브 스킬은 시간제한이 있으며, 특정 조건에 발동한다.

 

  • 업그레이드는 총 3레벨까지 올릴 수 있다.
  • 3레벨 달성 시, 해당하는 스킬 트리의 패시브 스킬이 자동으로 활성화 된다.
  • 스킬 포인트는 게임 플레이를 하며 얻을 수 있다.(스토리 단서를 모았을 시로 구상 중)

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

Enemy - FSM(2)  (0) 2024.02.08
Enemy - FSM(1)  (0) 2024.02.07
Projectile 구현  (0) 2024.01.19
Stat / Status 구현  (0) 2024.01.18
StatModifier 구현 계획  (0) 2024.01.17

Projectile은 게임 내에서 발사되는 발사체(또는 투사체) 오브젝트이다.

 

Projectile

구현 방법

Rigidbody를 통해 충돌처리를 구현하고, 코루틴을 통해 발사체의 지속시간을 구현했다.

 

 

구현 기능

OnTriggerEnter2D(Collider2D collision): 몇 가지 예외를 제외하고 Creature를 공격한다.
OnDisable(): 코루틴을 중단한다.
SetInfo(Creature owner): Creature에 대한 발사체 정보를 초기화하고 코루틴 중복을 방지한다.
CoDestroy(): 발사체의 지속시간만큼 대기한다.

public class Projectile : Thing
{
    public Creature Owner { get; protected set; } // 발사체 주인.

    // public new Creature.Status; // Creature의 Status에서 지속시간과 데미지 가져오는 방법 TODO.
    public float Duration { get; protected set; } // 발사체 지속시간.
    public float Damage { get; protected set; } // 발사체 데미지.
    public Vector2 Velocity { get; set; } // 발사체 속도.

    protected Rigidbody2D _rigidbody; // 충돌처리를 위한 Rigidbody.
    private Coroutine _coDestroy; // 코루틴이 null인지 활성화 되어있는지 확인하기 위한 필드.

    // Rigidbody가 붙은 발사체에 대한 속도.
    protected virtual void FixedUpdate()
    {
        _rigidbody.velocity = Velocity;
    }

    protected virtual void OnTriggerEnter2D(Collider2D collision)
    {
        Creature creature = collision.GetComponent<Creature>();
        if (!creature.IsValid() || !this.IsValid()) return;
        if (creature == Owner) return; // Creature가 발사체의 주인이라면.
        if (creature.State.Current == CreatureState.Dead) return; // Creature의 현재 상태가 죽었다면.

        creature.OnHit(Owner, Damage, new() { time = 0.1f, speed = 10f, direction = (creature.transform.position - this.transform.position).normalized }); // Creature 공격.

        _rigidbody.velocity = Velocity = Vector2.zero;
        if (this.IsValid()) Main.Object.DespawnProjectile(this);
    }

    protected void OnDisable()
    {
        StopAllCoroutines(); // 모든 코루틴 중단.
        _coDestroy = null;
    }

    public override bool Initialize()
    {
        if (!base.Initialize()) return false;

        _rigidbody = this.GetComponent<Rigidbody2D>();

        return true;
    }

    public virtual Projectile SetInfo(Creature owner) // Creature에 대한 발사체 정보.
    {
        this.Owner = owner;
        Duration = 5; // 임시
        Damage = 10; // 임시

        if (_coDestroy != null) StopCoroutine(this._coDestroy); // 코루틴 중복 방지.
        _coDestroy = StartCoroutine(CoDestroy());

        return this;
    }

    private IEnumerator CoDestroy()
    {
        yield return new WaitForSeconds(Duration); // 발사체 지속시간만큼 대기.
        _coDestroy = null;
        Main.Object.DespawnProjectile(this); // 오브젝트가 비활성화 시.
    }
}

 

 

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

Enemy - FSM(1)  (0) 2024.02.07
Skill 구상  (0) 2024.01.23
Stat / Status 구현  (0) 2024.01.18
StatModifier 구현 계획  (0) 2024.01.17
Resource Manager 구현  (0) 2024.01.15

+ Recent posts