Coding

    #18 Enemy AI 향상: EQS, LineTrace

    EQS 현재는 AI가 Agro Sphere이라는 콜리젼을 가지고 있고, 여기에 메인 캐릭터가 들어오면 인식하는 구조다. 이렇게 되니 시야각 설정이 복잡해지는 문제점이 있다. 언리얼 엔진은 이에 대한 해답으로 EQS(Environment Query Sysyem)을 제시한다. EQS는 쉽게 얘기해서 Pawn과 Pawn 사이 인식을 쉽게 가능하게 해주는 인터페이스다. 인식(Perception)은 다양한 방식의 자극(Stimuli)을 통해 이뤄진다. Stimuli의 종류는 다음을 포함한다. (밑의 목록말고 더있음) 소리 데미지 시야 그러니까 사람과 비슷하다. 누가 내 눈에 보이거나, 무언가에게 공격받거나, 들으면 우리는 그게 뭔진 몰라도 인식할 수 있다. 이러한 EQS 시스템을 쓰는 건 또 꽤 간편하다. 다음의..

    #17 Enemy AI: Attack

    Attack 본래 Enemy AI는 BT 수준에서 굉장히 간단히 구현되어 있었다. 원래는 적이 몬스터이고 또한 각자 공격애니메이션을 가지고 있을 것이라 가정했기 때문이다. 하지만 이번에 기획을 나와 같은 인간으로 바꿨기 때문에 메인 캐릭터와 같은 방식으로 애니메이션을 재생할 수 있도록 수정했다. 가장 중요한 차이점은 공격모션를 Enemy 클래스가 아니라 Weapon 클래스가 가지고 있다. 이는 각 무기마다 다른 공격 모션을 가질 것을 염두에 둔 디자인이다. 이런 기획은 결국 본래 Weapon과 같기 때문에 Weapon Class를 상속받은 블루프린트를 만들었다. 결과

    #14 패트롤 포인트를 Spline으로 에디터 수준에서 그리기

    Spline 본격적으로 Enemy AI를 손보기 시작했다. 기존에 단순한 애니메이션을 벗어나 플레이어의 애니메이션을 가져와서 쓸 수 있도록 새롭게 Enemy Animation Instace 클래스를 만들었다. 일단 오늘은 패트롤 포인트를 에디터에서 쉽게 찾아볼 수 있도록 했다. 에디터에서 잘 보려면 블루프린트 수준에서 코드를 구현해야 했다. 구현한 블루프린트는 다음과 같다. 결과

    #13 3번째 스프린트 수립

    지난 스프린트 회고 지난 스프린트는 일주일간 진행됐고, 주로 메인 캐릭터의 전투 시스템 개선에 목적을 두었다. 의도했던 정도로 업데이트하는 데에 전혀 차질이 없었다. 사실 생각보다 빨리 끝났는데, 언리얼 엔진을 계속 쓰다보니 아무래도 헤매는 시간이 줄어든 것 같다. 그래서 기능이나 함수를 찾지 못해 허비하는 시간이 줄어들었고, 이로 인해 진짜로 신경써야 하는 부분에 빠르게 접근할 수 있었다. 이번 스프린트 계획 이번 스프린트의 목표는 "흥미로운 적 AI 개발"이다. 이를 위해 4가지 세부 목표로 나누었다. AI가 Player와 비슷한 수준의 Animation을 가지고 있다. AI가 패트롤할 수 있다. AI가 시야가 있고 이에 따른 행동을 취한다. (현재는 무조건 적대) AI 공격 시 저마다의 행동 패턴을..

    #12 연속 공격 시스템 구현

    연속 공격 시스템 연속 공격 시스템이 작동하는 방식은 간소화했다. 일정 타이밍, 정확히는 CombatStatus가 Recovery일 때, 다시 공격하면 다른 공격모션이 발동한다. 약공격은 3연속, 강공격은 2연속 공격을 할 수 있다. 타이밍이 정확해서 구현하는 데에 어려움이 없었다. 구현은 빠르게 했는데, 다른 곳에서 발생한 다른 버그가 있어서 그런 부분들을 남은 시간에 해결했다. 메가 스캔을 써보면서 퀵셀 에셋을 둘러봤는데, 아직 애매하다. 결과

    #11 Strafe Movement with Evade

    Root motion in blend space 이 작업에서 가장 헤맸던 부분은 Evade 애니메이션을 Root Motion으로 재생해야 하는데, 4방향 밖에 없다는 것이었다. 45도나 135도는 물론, 패드까지 지원하려면 Blend Space를 써야한다. 문제는 Blend Space에 애니메이션을 넣어도 Root Motion이 적용되지 않는 것이었다. 정확히 말하면 애니메이션은 재생되는데, 위치는 움직일 수 없는 상태였다. 문제는 AnimInstance의 Root Motion Mode 였다. Root Motion Mode는 다음 4가지다. No Root Motion Extraction 루트 모션 추출 없음 - 루트 모션은 그대로 놔둡니다 (루트 본에 적용됩니다). Ignore Root Motion 루트..

    #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 구현 연속 공격 시스템 구현 이다. 생각대로 빠르게 구현할 수만 있으면 좀 빠르게 끝날 수도 있겠다.