이득우의 언리얼 C++ 게임 개발의 정석 C++ 코드가 있는 폴더에서 Public 폴더를 생성 후 모든 헤더 파일을 옮긴다. Private 폴더를 생성 후 모든 소스 코드 파일을 옮긴다. C++ 코드가 있던 폴더에는 {프로젝트명}.Build.cs 파일만 남게 된다. VS 파일을 재생성해 준다. 솔루션을 열면 구조가 변경된 것을 확인할 수 있다. 컴파일 후 언리얼 에디터를 켜면 이 곳에서도 구조가 변경된 것을 볼 수 있다. Public 폴더만 보이는 이유는 Private 폴더에는 헤더 파일이 없기 때문이다. 언리얼 에디터는 헤더 파일을 기준으로 C++ 클래스를 표시한다. Public, Private 폴더를 나눈 후부터는 새로운 C++ 클래스를 생성할 때 언리얼 에디터가 알아서 두 폴더에 헤더 파일과 소스 ..
이득우의 언리얼 C++ 게임 개발의 정석 행동 트리의 추적 분기에서 공격 기능을 추가하기 위해 셀럭터와 시퀀스를 추가하고 아래와 같이 변경한다. 이번에는 블랙보드 데코레이터를 사용하지 않고 플레이어가 공격 범위 내에 있는지 판단하는 데코레이터를 직접 만들어보도록 한다. 새로운 클래스를 생성했으니 CoreMinimal.h를 ArenaBattle.h로 변경한다. 데코레이터 클래스는 CalculateRawConditionValue() 함수를 실행시켜 조건을 확인한다. 이 함수는 const로 선언되어 클래스의 멤버 변수 값을 변경할 수 없다. 필요한 헤더를 포함한다. 생성자에서 데코레이터 이름을 설정한다. 행동 트리를 실행 중인 ControllingPawn과 블랙보드 키에 저장된 플레이어 Target의 거리가 ..
이득우의 언리얼 C++ 게임 개발의 정석 추격 시 플레이어를 저장할 Object 타입의 Target 블랙보드 키를 추가한다. 플레이어를 저장할 것이므로 Base Class를 ABCharacter로 지정한다. Class와 Object 타입의 블랙보드 키는 Base Class를 설정할 수 있다. 지정해 주는 것이 좋긴 하지만 어차피 나중에 UObject* 에서 Base Class* 형식으로 캐스팅해 사용해야 하긴 마찬가지다. 클래스를 선택할 때 파란색으로 표시되는 클래스는 액터 클래스이다. ABAIController 클래스에 Target 블랙보드 키의 이름을 저장하는 변수를 선언한다. 서비스 독립적으로 동작하지 않고 컴포짓에 부착되는 노드다. 컴포짓에 속한 태스크들이 실행되는 동안 반복적인 작업을 실행하는 ..
이득우의 언리얼 C++ 게임 개발의 정석 행동 트리(Behavior Tree) AI가 해야 할 행동을 분석하고 우선순위가 높은 행동부터 실행하도록 트리 구조로 설계하는 기법이다. 블랙보드(Blackboard) AI가 행동을 결정하는 데 사용할 변수(데이터)를 모아 놓은 집합이다. 새로운 행동 트리와 블랙보드를 만든다. 행동 트리를 열면 루트 노드가 보인다. 행동 트리에서 하나의 동작을 나타내는 단위를 (태스크)Task라고 한다. 태스크는 독립적으로 실행될 수 없고 반드시 컴포짓(Composite) 노드를 겨쳐 실행되어야 한다. 대표적인 컴포짓으로는 시퀀스(Sequence)와 셀렉터(Selector)가 있다. 시퀀스를 1개 추가하고 하위에 Wait 태스크를 1개 추가한다. 시퀀스는 하위 태스크들의 결과가 ..
이득우의 언리얼 C++ 게임 개발의 정석 AI 컨트롤러(AI Controller)는 플레이어 컨트롤러와 동일한 방식으로 폰에 빙의할 수 있다. 새로운 AI 컨트롤러를 만든다. 새로운 클래스를 생성했으니 CoreMinimal.h를 ArenaBattle.h로 변경한다. 캐릭터 클래스에 AI 컨트롤러를 설정하기 위해 헤더를 포함한다. AI 컨트롤러 클래스를 AABAIController 클래스로 지정한다. AutoPossessAI 옵션은 다음과 같다. EAutoPossessAI::Disabled 자동으로 빙의하지 않는다. EAutoPossessAI::PlacedInWorld 폰이 이미 월드에 배치되어 있는 경우에만 빙의한다. EAutoPossessAI::Spawned 폰이 새로 Spawn 되는 경우에만 빙의한다..
이득우의 언리얼 C++ 게임 개발의 정석 UI를 다루는 방법도 애니메이션을 다룰 때 C++로 Anim Instance를 제작해 로직을 담당하고 그것을 상속 받은 애니메이션 블루프린트에서 설계 작업을 했던 것과 비슷하다. C++로 User Widget을 제작해 로직을 담당하고 위젯 블루프린트에서 그것을 상속 받아 꾸미거나 추가적인 작업을 할 수 있다. UI_HPBar 위젯 블루프린트를 먼저 만들어 놓았으므로 User Widget C++ 클래스를 제작해 부모로 지정하는 방식으로 진행한다. UUserWidget을 상속 받은 ABCharacterWidget 클래스를 만든다. 공격력, HP 등 레벨에 해당하는 캐릭터의 스탯을 관리하는 ABCharacterStatComponent에서 델리게이트를 하나 선언한다. H..