Coding

    #9 스프린트 계획

    지난 주 스프린트를 끝내고 이번 주 스프린트 계획을 새로 세웠다. 이번주의 목표는 크게 Strafe Movement 구현 연속 공격 시스템 구현 이다. 생각대로 빠르게 구현할 수만 있으면 좀 빠르게 끝날 수도 있겠다.

    #8 타게팅 시스템 구현

    레이트레이스 타겟을 찾는 방식을 아래와 같이 단순화했다. 타게팅 버튼을 누르면 120도에 걸쳐 원뿔 모양으로 레이를 쏜다. 그 중 가장 가까운 타겟을 찾아 락온타겟으로 레퍼런스를 저장한다. 만약 타겟이 이미 있으면 타게팅을 그만한다. 언리얼에서는 Raytrace가 KismetSystemLibrary에 모여있다. 그냥 레이를 쓰면 운이 안좋으면 레이에 안맞을수도 있어서 Sphere모양으로 쏘게끔 했다. void AMainCharacter::LockTarget() { if (bHasLockTarget == false) { // 120도의 부채꼴 모양으로 레이트레이싱을 실행한다. FVector CameraForwardVector = GetFollowCamera()->GetForwardVector().Rotat..

    #7 기본 모드일 때, 회피 구현

    회피 타게팅이 되어있지 않은 상태에서 회피를 구현했다. 이 때, 회피는 앞 방향과 뒤 방향만 구현한다. 구현 방식은 다음과 같다. 방향키를 누르지 않은 채로 회피 -> 뒤로 회피 방향키를 누른 채로 회피 -> 해당 방향을 보면서 회피 이전에 Movement Status를 설정해놔서 구현하는데에 적은 시간이 걸렸다. 회피 애니메이션도 Root Motion으로 해서 따로 코드를 더할 필요가 없었다. 결과

    #6 메인 캐릭터와 적 캐릭터의 죽음 구현

    죽음 애니메이션 구현 죽음 애니메이션을 구현할 때, 두가지 문제가 있었다. 죽으면 딱 애니메이션이 정지되어야 한다. 죽고 일정 시간 후 액터가 사라져야 한다. 먼저 애니메이션 정지가 생각보다 구글링으로 찾기 힘들었는데, 간단히 해결 할 수 있었다. GetMesh()->bPauseAnims = true; 액터가 몇초후에 사라지게 하려면 이를 위한 타이머가 필요한데, 이번 경우엔 월드타이머매니저를 불러왔다. 함수 형태가 요상하다. // RepeatingFunction 을 초당 1 회, 지금부터 2 초간 호출합니다. GetWorldTimerManager().SetTimer(MemberTimerHandle, this, &AMyActor::RepeatingFunction, 1.0f, true, 2.0f);

    #5 플레이어 약공격 / 강공격 구현

    플레이어의 State 설계 Combat System을 보다 명확하게 설계할 수 있도록 플레이어의 상태를 구분해야 했다. 플레이어의 상태는 움직임 상태(Movement State), 전투 상태(Combat State)로 구분했다. Movement State는 Locomotion에 해당하는 State로서 Combat State를 포함하는 느낌이다. Attack Animation 에셋 구매 가장 고민되는 단계다. 공격 모션을 Mixamo 같은 곳에서 구할 수도 있지만 마음에 차지 않아서 구매하기로 마음 먹었다. 기왕 사기로 한거, 적어도 한 에셋으로 해결해야 하기 위해 아래 조건을 달았다. 다양한 공격 모션을 가지고 있을 것, 종류 3개 이상. 나중에 타게팅 구현을 생각해서 360도 움직임을 가지고 있을 것...

    #4 적 유닛 상단 체력바 구현

    적 유닛 체력바 구현 Player Character에 빠르게 접근하기 위한 함수 #include "Kismet/GameplayStatics.h" UGameplayStatics::GetPlayerCharacter(GetWorld(),0); Gameplay Statics 헤더 체력바를 나타나게 하는 코드를 블루프린트 계층에 넣어야 할지, C++에 구현해야 할지 고민했다. 결국 블루프린트에 넣는 것으로 결정했다. 이유는 다음과 같았다. UI와 관련한 코드는 바깥에 있어야 디자이너의 요구에 따라 빠르게 수정가능하다. 코드 수준에서 블루프린트 클래스를 만드는 것이 불안정하고 번거롭다. 그리고 체력바의 위치를 블루프린트에서 쉽게 바꿀 수 있도록 USceneComponent를 추가해 이 포지션에 체력바를 위치하도록 ..

    #3 적 캐릭터 기초 AI 설계 및 구현

    설계 어떤 Enemy AI가 좋은 것일까? 이것부터 고민을 시작했다. 여러 글을 찾아보다 아래 동영상을 접했다. https://youtu.be/9bbhJi0NBkk 굉장히 영감을 주는 동영상이었는데, 이번 프로젝트에 바로 적용하는 데에 문제가 있었다. 가장 큰 문제는 애니메이션이 별로 없다는 것이었다. 일단 간단한 AI를 구성하는 것에 목표를 두기로 했다. 현재 AI의 상태는 아래와 같았다. 그냥 일정 범위에 플레이어가 들어오면 쫓아가서 공격한다. 공격 범위에서 플레이어가 벗어나면 다시 쫓아간다. 이하 반복. AI가 단순한 만큼 이를 구성하는 Behavior Tree도 아주 단순하다. 내가 원하는 AI는 이렇게 공격적이서는 안된다. 적어도 미사일처럼 몸통박치기를 해서는 안되었다. 어느정도는 경계를 해야하..

    #2 새 프로젝트를 위한 기능 명세 작성

    Miro를 통해 어떤 기능을 구현할 지 명세를 작성했다. 먼저 게임의 기능을 크게 GameSystem, Monster, Item, Pickup으로 나누었다. 첫 버전에서는 Game System이 가장 큰 부분을 차지한다. 이번 스프린트에서 중심적으로 개발할 것들은 다른 색을 적용해 쉽게 종류를 판단할 수 있도록 설계했다.