ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Parrying Sword #15 : [프로그래밍][기획] 보스몬스터 (데카시스) 패턴 디자인
    유니티 엔진/Parrying Sowrd 2023. 3. 9. 14:21

     

     

     

    아직 패턴이 다 완성된 건 아니고,

    만든 패턴도 조금씩 손봐야 하며 이펙트도 들어가야 하기 때문에 완성까진 아직 많이 남았다고 볼 수 있지만

    꽤나 그럴 듯한 수준까지 만들어 낸 것 같아 올려봅니다.

     

    if (num < moveToPlayer)
            {
                if (prevState == BossMonster_DecasysState.MOVETOPLAYER) return;
                if( monsterCtrl.distanceToPlayerX() < 23 )
                {
                    prevState = BossMonster_DecasysState.MOVETOPLAYER;
                    return;
                }
    
                monsterCtrl.setState(BossMonster_DecasysState.MOVETOPLAYER,
                                delayDict[BossMonster_DecasysState.MOVETOPLAYER]);
                prevState = BossMonster_DecasysState.MOVETOPLAYER;
            }
            else if( num < moveToPlayer + backStep )
            {
                if (prevState == BossMonster_DecasysState.BACKSTEP &&
                    nextState != BossMonster_DecasysState.BACKSTEP) return;
    
                monsterCtrl.setState(BossMonster_DecasysState.BACKSTEP,
                                delayDict[BossMonster_DecasysState.BACKSTEP]);
                prevState = BossMonster_DecasysState.BACKSTEP;
            }
            else if( num < moveToPlayer + backStep + attack1)
            {
                if (prevState == BossMonster_DecasysState.ATTACK1) return;
    
                monsterCtrl.setState(BossMonster_DecasysState.ATTACK1,
                                delayDict[BossMonster_DecasysState.ATTACK1]);
                prevState = BossMonster_DecasysState.ATTACK1;
            }
            else if (num < moveToPlayer + backStep + attack1 + attack2)
            {
                if (prevState == BossMonster_DecasysState.ATTACK2) return;
    
                monsterCtrl.setState(BossMonster_DecasysState.ATTACK2,
                                delayDict[BossMonster_DecasysState.ATTACK2]);
                prevState = BossMonster_DecasysState.ATTACK2;
            }
            else if (num < moveToPlayer + backStep + attack1 + attack2 + attackRoar)
            {
                if (prevState == BossMonster_DecasysState.ATTACKROAR) return;
    
                monsterCtrl.setState(BossMonster_DecasysState.ATTACKROAR,
                                delayDict[BossMonster_DecasysState.ATTACKROAR]);
                prevState = BossMonster_DecasysState.ATTACKROAR;
            }
            else
            {
                monsterCtrl.setState(BossMonster_DecasysState.WAIT,
                                delayDict[BossMonster_DecasysState.WAIT]);
                prevState = BossMonster_DecasysState.WAIT;
            }
        }

    다 가져오기엔 코드가 너무 길어지니 전체는 깃허브에 올려 두는 것으로 하고, 핵심적인 부분만 가져와 봤습니다.

    이 프로젝트를 하기 전에 공부했던 유니티 2D 게임 공작소에서 공부했던 방법이 유용했습니다.

    난수를 만들고 난수에 해당하는 범위에 속하는 패턴을 사용,

    그러나 코드를 좀 더 손 봐서 특정 상황에서는 특정 행동을 반드시 실행하도록 하거나 하지 못하게 하였습니다.

     

    예를 들면, 벽을 감지하는 코드를 작성해서 벽에 너무 가까이 가서 플레이어를 몸으로 가둬버리면 안되니

    반드시 백스텝을 쓰고, 이러한 특수한 상황이 아닌 한 걷거나 휴식하는 행동 말고는 연속으로 사용할 수 없도록 제한하는 등의 처리가 이루어 졌습니다.

     

    패턴에 대한 개선점은 연속 패링을 하려면 플레이어의 선후 딜레이를 줄이거나, 데카시스의 선후 딜레이를 조정하는 조치가 필요합니다.

    발로 찍은 땅에서 시간차를 두고 충격파를 발생시키는 것도 재미있을 것 같습니다.

Designed by Tistory.