전체 글

전체 글

    UE4: Delegate

    Delegate 정의 Delegate는 대리인이라는 의미다. 무엇을 대리한다는 걸까? Delegate가 대리하는 것은 함수다. 그러니까 특정 함수를 직접 부르는 대신, Delegate를 사용해서 대리 실행할 수 있다. Delegate의 소용 1: 클래스 간 결합도 낮추기 대리 실행이 왜 필요할까? 그 첫번째 이유는 클래스 사이 의존성을 약화시킬 수 있기 때문이다. 클래스 A가 대리인 MyDele_A가 있다고 가정하자. MyDele_A는 클래스 A의 멤버함수 PrintOne()의 대리자다. 그러니까 MyDele 보고 너 실행해!라고 말하면 실제로는 PrintOne()이 실행된다는 뜻이다. // 클래스 A를 나타낸 의사코드 class A { public: FDelegate MyDele_A; protected..

    #19 테스트 레벨 제작

    테스트 맵 테스트 맵은 Geometry Brush로 빠르게 제작했다. 미로를 만들어야 해서 Maze Generator를 사용했다. 나중에는 Mesh Generation을 C++로 구현해야 할 것이다. 어떤 방식으로 할지는 고민해봐야겠다. 메인 메뉴 제작 구색을 맞추기 위해 시작 - 나가기만 구현된 메인 메뉴를 만들었다. 이 때, 잘 쓰는 블루프린트 노드는 AddViewport / Set Input Mode / Set Show Mouse Cursor 등이 있다. 재시작 구현 플레이어가 죽으면, 재시작을 할 수 있다는 Widget을 띄어야 한다. 이게 생각보다 코드로 나타내기 난감한데, 양은 적다. // Header class TSubclassOf RestartWidgetClass; // cpp if (Re..

    #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를 상속받은 블루프린트를 만들었다. 결과

    #16 AI Strafe Animation with Root motion

    Root motion UE4의 AI Controller에는 AI Move To나 Add Movement Input과 같이 AI를 움직이는 것을 쉽게 해주는 여러 함수가 있다. 그래서 맨 처음에 Enemy AI에서 이런 함수를 썼는데, 이 방식은 Animation과 실제 Mesh의 움직임이 조금 어색한 느낌을 지우기 힘들다. 이 방식은 Controller가 움직임을 넣으면 Character의 Velocity와 Direction이 바뀌고 이걸 이용해서 Animation을 일치하게 재생하는 원리다. 그렇다보니 특히 Strafe(게걸음) 같은 경우, 마치 슬라이딩 하는 듯한 느낌이 든다. 현재 Main Character가 그런 느낌이다. Root motion은 이 문제를 피하기 위해 만들어진 것인데, 실제로 애..

    #15 Patrol AI 만들기

    Patrol AI Patrol AI는 다음과 같은 명세를 두도록 했다. 에디터 수준에서 각 패트롤 지점을 볼 수 있다. Patrol은 적이 경계 상태가 아닐 때 실행되므로 걸을 것 디버깅 등을 위해 Patrol을 C++가 아니라 Behavior Tree에서 구현할 것 이를 위해 Patrol Task를 추가해서 다음과 같은 블루프린트를 만들었다. 결과

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

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

    #13 3번째 스프린트 수립

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