포트폴리오[02] 아이디어 검증 : Bash를 만들어보자.

2025. 8. 15. 05:22·게임 디자인/공방

들어가며

 

    며칠 전에 슬럼프를 이겨내고자 근황 글을 열었다. 아직도 게으름이 다 가시지는 않았지만 어떻게든 움직이게 됐기에 이번 기회에 두 번째 포트폴리오의 증명 자료(라고 쓰고 맛보기라고 읽기)로 Bash를 만들어봤다.

 

    Bash에 대해 간단하게 설명하면 아래 자료와 같이 적, 환경 오브젝트 등의 특정 기물을 타고 이동하는 기술을 말하는데, 두 번째 포트폴리오에 Bash에 대한 내용을 배치해 뒀고 자료를 첨부하면 좋게 구성해 뒀기에 이번에 Bash를 구현함으로써 이 내용을 채우고자 했다.

 

 

오리 시리즈에서의 Bash

 

 

    Bash가 만드는 경험과 같은 디자인적인 요소는 두 번째 포트폴리오에 정리해놨기에, 본 글에서는 디자인적인 측면이 아닌 기술적인 측면에서 Bash를 구현한 방법에 대해 다룰 예정이다.

 

    끝으로 이렇게 구현된 Bash가 어떤 경험을 만드는지 간접적으로나마 체감할 수 있도록 영상을 첨부할 예정이니 같이 한 번 살펴보도록 하자.

 

 

 

어떤 기능이 필요한가?

 

    가장 먼저 Bash의 재미를 프로토타입으로 보여주기 위해 포트폴리오 내 Bash 개선책의 기능 부분을 확인해 보자. 이를 위해서는  이전에 구현한 게임 디자인 검증 환경을 활용한다고 했을 때 크게 아래와 같은 요소가 필요하다.

 

 

  • 원거리 공격을 하는 적
  • 투사체의 Bash 가능 여부 구분
  • 규칙에 따라 목표를 검출하는 Bash 기능

 

기능 설명 파트

 

  

    이를 바탕으로 목차를 정리하면 다음과 같이 정리할 수 있겠다. 그럼 고고잉!!

 

 

목차

  • 원거리 적
  • 투사체
  • 원거리 공격
  • Bash
  • 편의성
  • 결과 테스트 영상

 

 

 

Bash를 만들어보자


📢  NOTICE    이후 서술할 기능 요소들은 순서대로 구현한 것이 아닙니다. 항목별로 분류하기 위해 배치한 것이니 이 점 참고 바랍니다.

 

 

원거리 적

 

    Bash 기능을 테스트하기 위해 가장 먼저 필요한 것, 플레이어를 공격하는 원거리 적이다. 원거리 적은 간단하게 근거리 적을 복제한 뒤, 근거리 공격 Gameplay Ability(이하 GA)를 원거리 공격 GA로 바꿔 구성했다.

 

    그리고, 이에 맞는 원거리 공격 태그를 추가한 뒤 아래와 같이 Behavior Tree(이하 BT)를 구성하여 테스트를 통해 적들이 플레이어 기준으로 일정 거리를 벌리며 strafing 한 뒤 원거리 공격을 하는 걸 확인했다. (초기 구현 단계에서는 투사체 없이 로그로 공격 여부 확인)

 

 

(좌) BT, (우) 적들이

 

 

    이 과정에서 Environment Query System(이하 EQS)을 활용했는데, EQS는 간단하게 말해 AI가 주변 환경을 검출해서 개발자 의도에 맞게 동작하도록 돕는 시스템으로, 필자는 간단하게 플레이어와 가까이에 있다면 일정 거리를 벌린 뒤 공격을 하도록 구성했다.

 

    다만, 이렇게 구현한 것들이 당장에 의미가 있었냐고 묻는다면 그건 또 아닌 게, 실제로는 그 자리에 서서 공격만 반복하는 BT를 구성해 테스트를 진행했기 때문이다. (이 또한 언젠가 쓰겠지..😓)

 

 

(좌) EQS 시각화 : 움직이는 걸 AI, 하얀색 큐브를 플레이어로 생각했을 때, 플레이어와 가까운 후보 목적지(초록색 구)는 사라진다. (우) 실제로 쓴 BT

 


    아무튼 이렇게 원거리 적을 구성해 봤다. 추가로, 사소하지만 기존의 무기 mesh 할당 시 위치 제어가 안 됐던 문제를 해결하기 위해 weapon pivot이라는 이름의 scene component를 root component로 만들어 transform을 조정할 수 있게 구성했다.

 

 

Weapon Pivot

 

 

 

투사체

 

    투사체는 생각보다 간단한데, 그냥 collision과 niagara system(이하 NS)을 갖게 만든 뒤 적당한 투사체 NS를 배치했고, bashable 여부 옵션을 만들어서 추후 Bash 기능에서 조건으로 확인할 수 있게 한 뒤 옵션에 따라 시각적으로도 투사체의 색상이 달라지도록 구성했다. (원래는 NS 내 linear color 타입의 모든 변수를 순회하며 바꿔주려고 했는데 직관적으로 되지 않는 것 같아서 하드 코딩했다..)

 

    아! 그리고, 투사체 움직임은 당연하지만 언리얼에서 제공하는 projectile movement component로 제어했고, 충돌은 별도의 collision 채널을 만들어서 projectile끼리는 충돌하지 않게 구성했다.

 

이런 식으로 NS 및 사운드를 할당하고, bashable 여부에 따라 색상이 달라지도록 구성했다.
투사체 비교 : 노란색이 기본 투사체, 빨간색이 bashable 투사체

 

 

 

원거리 공격

 

    개인적으로 원거리 공격이 Bash보다 까다로웠는데, 발사를 제어하는 기능을 구현하자는 욕심을 부렸기 때문이다. 예를 들어, 단순하게 한 발만 발사하는 것이 아닌 랜덤하게 n₁발을 n₂° 내에서 방사형으로 발사하게 하고 싶었다.

 

    이는 테스트를 위해서이기도 했는데, Bash의 재미를 정상적으로 보여주려면 Bash 탄이 레벨에 여럿 날아다녀야 했고, 이를 위해 수많은 적들을 배치하자니 너무 어지러울 것 같아서 방사형 공격을 구현하고자 했다. (언젠가 쓸 수 있기도 하고 말이다..😏)

 

 

Shoot GA : 수평으로 늘어뜨려놓으면 어지러워서 이렇게 했는데.. 정리하는 방법 좀 고민해 봐야겠다..

 

 

    여기서 살펴볼 거라고는 언제든 튜닝이 가능하다는 건데 튜닝 가능한 목록은 아래와 같다.

발사 탄 수 최소/최대 값, 방사형 제한 각도, Bashable 탄이 생성될 확률

 

    이때 삽질도 꽤 많이 했는데, 가장 먼저 방사형 제한 각도 수식 세울 때 검증하지 않고 수행하는 나쁜 버릇이 나와서 삽질 한 번 했고, For Loop 노드에서 last index를 random integer로 설정하면 고정된다고 생각해서 또 한 번 삽질했다. (Loop마다 random integer가 재설정돼서 이상 현상이 나타나더라.)

 

    아무튼 이런 과정을 거쳐서 최종적으로는 아래와 같은 수식을 세우고 성공적으로 결과를 확인할 수 있었다. (수식 세우는 건 이전에 암스 인벤토리 구현하면서 궤도 회전 고민했던 거랑 비슷해서 생각보다 쉽게 할 수 있었다.)

 

$\text{Current Shot Angle} = \theta_{\text{forward}} - \frac{\theta_{\text{shoot}}}{2} + \frac{\theta_{\text{shoot}}}{N_{\text{shoot}} + 1} \cdot n_{\text{current}}$

 

 

랜덤하게 방사형으로 퍼지는 탄들 : 붉은색이 bashable 탄이다.

 

 

 

Bash

 

    다음은 이번 글의 주제인 Bash다. Bash는 앞서 포트폴리오 자료에 설명했던 것처럼 Dash 조작을 통해 Bash 가능 상태일 때는 Bash가 발동되도록 구현해야 했다. (Dash와 Bash 모두 어떤 목표를 향해 돌진한다는 동작 기능은 같으므로 합치기에 무리가 없다.) 

 

    그래서, 아래와 같이 ComputeTargetProjectile 함수를 만들어 Bash 가능 여부를 판별하고, Bash 가능 시 Bash에 해당하는 애니메이션이 재생되면서 아래의 이동, 무적, 시간 지연 등의 기능이 수행되도록 구현했다.

 

 

Bash 플로우차트
상단이 Bash, 하단이 Dash

 

    이때 ComputeTargetProjectile에서의 Bash 판정은 위의 자료대로 카메라를 기준으로 캐릭터와 투사체까지의 거리를 계산하고, 캐릭터까지의 거리보다 길면서 가능한 짧은 오브젝트를 최적 후보로 판단해 TargetProjectile로 지정했다.

 

 

ComputeTargetProjectile 함수

 

 

    처리 결과는 아래와 같다.

 

 

#1  Dash 시 카메라를 기준으로 충돌 영역을 만들어 Bash 가능 탄 확인

 


#2  기본 탄은 검출에서 제외

 

 

#3  Bash 가능 탄 중에서는 캐릭터보다 멀면서 가장 가까운 탄이 Bash 후보로 지정

 

 

#4  캐릭터보다 카메라에 가깝다면 Bash 후보에서 제외

 

 

    이런 Bash의 애니메이션은 아래와 같이 구성했는데, 기본적으로 회전하는 모션이 액션성을 살리는 것 같아서 적당한 애니메이션을 골라 Anim Montage로 만들었고, Dash GA에 ComputeBashDirectionAndDistance 함수를 만들어 목표 위치와 방향을 계산해 모션 워핑을 통해 이동을 구현했다.

 

    그 외에는 연구 1회차에서 만든 combo window를 활용해 선입력을 받아 다음 GA로 연결될 수 있게 하되, 선입력이 없다면 slow motion 상태로 다음 Bash 탄을 찾는 등의 행동을 결정할 수 있는 시간을 마련했다. 이 부분이 Bash의 완급을 느끼게 만들면서도 조작에 어색함을 덜어내는 핵심이다. (추가 조작에 맞게 slow motion이 중단되므로)

 

 

Bash Anim Montage의 구성

 

 

    추가로, 무적 상태도 부여했는데 나는 DealDamage라는 Gameplay Effect를 통해 피격을 처리하기에, Invincible(무적)이라는 상태 태그를 만들어 해당 태그가 부여됐다면 수행하지 않는 방식으로 무적을 처리했다.

 

 

Deal Damage

 

 

 

    여기까지가 Bash의 구현 과정이다. 이러한 과정에서도 약간의 삽질이 있었는데 간단히 소개해보겠다.

 

    첫 번째는 루트 모션을 활성화하지 않아 모션 워핑이 되지 않았는데 이를 모르고 여러 부분을 찾아 해맸었다. 두 번째는 character movement mode로 Bash를 했음에도 z 축으로는 움직임이 없었는데, 알고 보니 character movement mode가 flying이 아니라면 z축 모션 워핑이 되지 않는다는 게 문제였다. 이는 SetMovementMode라는 Anim Notify를 만들어 애니메이션 재생에 맞게 모드가 변경되도록 구성하여 해결했다.

 

    이렇게 Bash의 감각을 간단하게 살펴보면 아래와 같은데 어떤가, 느낌 있지 않은가? 😁😁

 

 

Bash한 탄 또한 정상적으로 파괴되는 것을 확인할 수 있다.

 

 

 

편의성

 

    마지막은 편의성으로 여긴 별 거 없다. 그냥 테스트하기 편하게 [Tab] 키를 통해 텔레포트하는 기능과, Bash 시 빠르게 다음 탄을 찾는 게 중요한데 패드의 회전 속도가 늦어서 Input Mapping Context의 modifier로 가중치를 줘서 회전 속도를 빠르게 한 것, 이 두 가지를 수행했다.

 

 

텐레포트와 회전 속도 조정

 

 

 

결과 테스트 영상

 

    나름 느낌이 나왔던 테스트 영상 2개에 전체를 취합한 테스트 영상 하나를 첨부해 아래의 영상을 만들었다.

 

    내 스스로 평가하자면 부분적으로는 성공이나 전체적으로는 실패인 것 같다. Bash 자체는 잘 구현이 됐는데 Bash의 감각이 표현되기 위한 환경이 마련되지 않았다. Bash의 매력을 제대로 표현해 내려면 더 크고 입체적인 레벨이 필요하다.

 

    영상의 두 번째 테스트만 하더라도 인위적인 배치에서는 Bash의 감각이 잘 표현되지만 실제 평지의 적을 마주하면 그다지 화려하게 보이지 않는다. 이는 아마 추후에 레벨 디자인을 해보게 되면 그때쯤 적절한 환경을 만들고 다시 테스트해 볼 것 같다.

 

    한 번 상상해 보자. 콜로세움 형태의 원통형 탑에 나를 내려다보며 압박감을 주는 적들, 나를 공격하는 적들의 무수한 탄을 타고 점점 하늘을 날아올라 꼭대기에 오르는 장면을 말이다. 기능적으로도 연출적으로도 매력적이지 않은가? 😙😙

 

 

결과 테스트 영상

 

 


 

후기

 

    기존에 연구 시리즈를 수행하여 게임 디자인 검증 환경을 활용하긴 했지만, 아이디어를 살펴보기 위해 게임 디자인 검증 환경을 활용한 건 이번이 처음이다.

 

    작업에는 환경 의도에 맞게 22 뽀모도로(약 9시간)로 두 번째 포트폴리오를 작성할 때 64 뽀모도로(약 27시간)가 걸린 걸 고려하면 가성비 있게 검증할 수 있었다. 지금 블로그와 유튜브로 정리하는 것까지 포함하면 29 뽀모도로(약 12시간)으로 나름 괜찮은 것 같다. 숙련될수록 더 효과적이고 더 빨라질 테니 말이다.

 

    지난 6월에 두 번째 포트폴리오를 작성하고 나서 약 2달이 지나서야 검증했는데 이럴 줄 알았으면 진작에 할 걸 그랬다. 매번 두려워하고 망설이다가 결국 늘어져버리니 말이다. 음.. 또 반성이 될 것 같으니 여기까지 하자. 그럼에도 꾸준히 나아가고 있지 않나.

 

 

    각설하고 아이디어 검증에 대해 조금 더 이야기해 보자면, Bash는 내가 전투 디자인을 꿈꾸던 시점부터 생각해 오던 디자인이다. 무언가를 타고 적에게 접근해 일격을 날린다는 판타지가 내 안에 강하게 호응하고 있었기에 디자인했고, 검증해 봤는데 실제 결과도 매력적이라 만족스럽다. Bash는 입체적인 레벨일수록 더욱 빛을 발하는 디자인이 될 거다.

 

    추가로, 투사체에만 Bash를 적용하는 것이 아닌 근거리 공격에도 Bash와 같이 흘려내기 등의 메커닉을 잘 디자인해 보면 재미있을 것 같다는 생각을 한다. 적과의 관계성을 강화하여 전투와 연출의 폭 자체가 매우 넓어지니.. 기대되지 않는가? 이런 쪽으로 성장해 봐도 재미있을 것 같다.

 

 

    아무튼.. 여기까지가 Bash 검증에 대한 글이다. 이번 주에는 Bash를 끝내고 싶었는데 오늘 일어나고 나서부터는 팀 프로젝트 준비를 해야 돼서 무리하게 새벽에 작성해 봤다. 결과는 만족스럽네 😎

 

    그럼 여기서 마치고, 조만간 다른 글로 찾아오도록 하겠다. 다들 좋은 하루 보내고, 성장하는 하루가 되기를 바란다. 아디아디 아디오스~!!

 

 

광복 80주년! 선인들의 희생이 있기에 이렇게 배움을 이어나갈 수 있다는 점, 잊지 맙시당 😁

 

'게임 디자인 > 공방' 카테고리의 다른 글

[기획의 단상] 이동의 관능성(官能性) : 좋은 이동을 만들기 위한 방법  (0) 2025.11.26
[인고 7회차] 전투 디자인을 비교 분석하는 아홉 가지 기준 (feat. 액션 게임 사례 분석)  (1) 2025.09.02
[연구 2회차] 공격 액션의 구성과 리듬에 따른 인상 (feat. Unreal GAS를 활용한 검증)  (0) 2025.07.17
[연구 1회차] 선입력과 조작감 (feat. Unreal GAS를 활용한 검증)  (0) 2025.07.01
[인고 6회차] 『God of War』 - 갓 오브 워가 전투로 분노를 표현하는 방법 (feat. 가치 판단과 타격감)  (0) 2025.06.16
'게임 디자인/공방' 카테고리의 다른 글
  • [기획의 단상] 이동의 관능성(官能性) : 좋은 이동을 만들기 위한 방법
  • [인고 7회차] 전투 디자인을 비교 분석하는 아홉 가지 기준 (feat. 액션 게임 사례 분석)
  • [연구 2회차] 공격 액션의 구성과 리듬에 따른 인상 (feat. Unreal GAS를 활용한 검증)
  • [연구 1회차] 선입력과 조작감 (feat. Unreal GAS를 활용한 검증)
라사 RASA
라사 RASA
집념 어린 성장, 그러한 증명.
  • 라사 RASA
    Memoria Aeon
    라사 RASA
  • 전체
    오늘
    어제
  • 공지사항

    • 블로그는 당분간 잠시 쉬어갑니다. (feat. 간단 블로깅⋯
    • 포트폴리오를 만들어봤습니다.
    • 지도를 그리고 있습니다.
    • 분류 전체보기 (213)
      • 프로젝트 (26)
        • 뚜두 농장 (1)
        • Lost in Hope (18)
        • Breath in Winter (1)
        • Lib's Rarry (2)
        • 단기 프로젝트 (3)
        • 출시 게임 (1)
      • 포트폴리오 (2)
      • 게임 디자인 (40)
        • 게임 디자인 이론 (13)
        • 게임 디자인 연구 (3)
        • 게임 분석 (4)
        • 연습작 (5)
        • 공방 (15)
      • 개발 (92)
        • 알고리즘 (76)
        • 그래픽스 (1)
        • 언리얼 (15)
      • 아트 (2)
        • 그림 (1)
        • 연출 (1)
      • 철학 (5)
        • 디자인 철학 (2)
        • 생각 정리 (3)
      • 일상 (35)
        • 독서 (5)
        • 컨퍼런스 (2)
        • 미디어 리뷰 (4)
  • 링크

    • Youtube
    • Github
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 인기 글

  • 최근 댓글

  • 태그

    알고리즘 레콩키스타
    스터디
    게임잼
    프로젝트
    Bridge
    개발
    breath in winter
    레벨 디자인
    러셀 언리얼 엔진 중급 클래스
    게임 분석
    개발 일지
    회고
    한국 공학 대전
    Lost In Hope
    til
    GMTK
    수확제
    뚜두 농장
    재밌넥
    기획
  • hELLO· Designed By정상우.v4.10.4
라사 RASA
포트폴리오[02] 아이디어 검증 : Bash를 만들어보자.
상단으로

티스토리툴바