Coding/Devlog

    #10 lock on일 때, strafe movement 구현

    Lock on, Strafe Movement Lock on 상태일 때, strafe movement(게다리 걸음)가 되려면 아래 세가지가 적용돼야 한다. Lock on Target을 카메라(여기선 컨트롤러와 동일)가 바라봐야한다. 그 카메라가 바라보는 방향으로 캐릭터도 바라봐야 한다. 이후 움직임에 대해서 방향을 계산하고 이에 따라 적절한 애니메이션을 재생해야 한다. (Blendspace) 카메라 회전은 #8에서 구현했다. 그 다음으로, 카메라 방향에 따라 캐릭터의 Rotation을 업데이트해야 한다. 간단한 코드인데, Character에서 바로 SetActorRotation에 접근하지 못해서 애먹었다. void AMainCharacter::LookAtTarget (float DeltaSeconds) c..

    #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는 이렇게 공격적이서는 안된다. 적어도 미사일처럼 몸통박치기를 해서는 안되었다. 어느정도는 경계를 해야하..