본문 바로가기

언리얼C++게임개발

(35)          글쓰기    
P470 IsPawnControlled()함수 - 전부 controlledPawn이 됨 void AABCharacter::BeginPlay() { // Changed in 4.21. copied from PostInitializeComponents() Super::BeginPlay(); if (!IsPawnControlled()) { ABLOG(Warning, TEXT("IsNotPawnControlled %s"),*GetName()); auto DefaultSetting = GetDefault(); int32 RandIndex = FMath::RandRange(0, DefaultSetting->CharacterAssets.Num() - 1); CharacterAssetToLoad = DefaultSetting->CharacterAssets[RandIndex]; auto ABGameInst..
이득우 언리얼 4.52이상 에러수정하기 https://github.com/smarthug/UE4-CPP-Book CHAPTER 6 203p ABCharacter.cpp Tick() From SpringArm->RelativeRotation = FMath::RInterpTo(SpringArm->GetRelativeRotation(), ArmRotationTo, DeltaTime, ArmRotationSpeed) To SpringArm->SetRelativeRotation(FMath::RInterpTo(SpringArm->GetRelativeRotation(), ArmRotationTo, DeltaTime, ArmRotationSpeed)); 204p ABCharacter.cpp ViewChange() From GetController()->Se..
이득우 데모파일 버그및 빌드 방법 Resorce>Chapter13> ArennaBattleSetting폴더를 현재의 프로젝트 Source폴더로 옮긴다. ArenaBattle.Target.cs public class ArenaBattleTarget : TargetRules { public ArenaBattleTarget(TargetInfo Target) : base(Target) { ... ExtraModuleNames.AddRange( new string[] { "ArenaBattle", "ArenaBattleSetting" } ); } } ArenaBattleEditor.Target.cs public class ArenaBattleEditorTarget : TargetRules { public ArenaBattleEditorTarget..
프로젝트 설정 1. 프로젝트 설정 1.1. 소스 파일 정리 언리얼 소스 코드 구조 Classes : 언리얼 오브젝트 관련 헤더 Public : 외부에 공개하는 선언 파일 Private : 외부에 공개하지 않는 정의 파일 소스 코드 폴더에 Public과 Private 폴더를 만들어 .h 파일과 .cpp 파일을 옮겨보자. 솔루션을 재생성하면 프로젝트 구성이 바뀐 것을 확인할 수 있다. Build.cs이외에는 폴더에 다 들어간다. *.Target.cs : 게임 빌드와 에디터 빌드 설정 지정 1.2. 모듈 추가 주 게임 모듈 외에 다른 모듈을 게임 프로젝트에 추가하고 로직을 분리해 관리할 수 있다. 단, 추가 모듈은 자동으로 생성되지 않으므로 필요한 요소를 직접 추가해야 한다. 모듈 폴더와 빌드 설정 파일: 모듈 폴더와 모듈..
네비게이션 NPC공격추가하 ● NPC가 정찰하다가 플레이어 발견 시, 플레이어를 추격하는 기능은 발견할 때 플레이어의 정보를 블랙보드에 저장하도록 Object 타입으로 변수를 생성하면 된다.​ Object 타입에는 베이스 클래스(Base Class)를 지정할 수 있는데, 이때, 기반 클래스를 ABCharacter로 지정하면 된다. ​ ● NPC의 비헤이비어 트리의 행동 패턴은 플레이어를 발견 했는지 / 못했는 지에 따라 추격과 정찰로 나누어진다. 추격 / 정찰 중 하나의 상태를 선택하여 행동하므로, 시퀀스가 아닌 셀렉터(Selector) 컴포짓을 사용하여 로직을 구성해야한다. 두 상태 중 추격을 더 우선순위를 높게하고, 추격 상태가 되면 블랙보드의 Target 오브젝트를 향해 이동하도록 한다. ​ ● 다음으로, 정찰하다가 플레이어..
AIController와 내비게이션 시스템 ​ ● 플레이어가 조종하지 않지만 레벨에 배치돼 스스로 행동하는 캐릭터를 'NPC(Non Player Character)'라고 한다. ​ ● 언리얼 엔진은 컴퓨터가 인공지능으로 NPC를 제어하도록 AI 컨트롤러를 제공한다. 폰은 플레이어 컨트롤러와 동일한 방식으로 AI 컨트롤러에 빙의될 수 있고, 빙의되면 AI가 시키는 대로 행동하게 된다. ​ ● AI 컨트롤러를 생성하여 캐릭터에게 빙의하기 위해서는 AI Controller를 부모 클래스로 하는 AI 컨트롤러를 만들어줘야 한다. ​ ● ABCharacter가 위에서 만든 ABAIController를 사용하도록 AIControllerClass(=AI 컨트롤러 클래스) 속성을 ABAIController의 클래스로 지정하고, AI 생성 옵션을 PlaceInW..
무기 무기상자 뺏기 Weapon ItemBox SetOwner 교재는 무기를 ItemBox로 부터 획득하지만 실제 들고다니다 다른 Chracter로 부딪치면 무기를 빼긴다. 이후 다시는 무기를 획득하지 못한다. 이 부분을 고쳐봤다. 그리고 itemBox뿐이 아니라 Weapon을 직접 획득할수도 있게 만들었다. 일단 ItemBox Class는 Collider를 담당하는 부분과 모양을 담당하는 Box부분, 효과부분이 있다. 무기는 WeponItemclass로 레벨에서 지정하고 spawn할때 사용한다. public: UPROPERTY(EditInstanceOnly, Category = Box) TSubclassOf WeaponItemClass; UPROPERTY(VisibleAnywhere, Category = Box) UBoxComponent* Trigger; UPRO..
게임데이터와 UI위젯 - 엑셀데이터의 활용 GameInstance를 부모로 ABGameInstance 클래스를 만들자 ABGameInstance.h #pragma once #include "../ArenaBattle.h" #include "Engine/GameInstance.h" #include "ABGameInstance.generated.h" /** * */ UCLASS() class ARENABATTLE_API UABGameInstance : public UGameInstance { GENERATED_BODY() public: UABGameInstance(); virtual void Init() override; }; ABGameInstance.cpp #include "ABGameInstance.h" UABGameInstance::UABGa..
콤보공격 입력추가 이렇게 좌클릭을 눌렀을 시 동작을 하게끔 만들어 줄 것임. static ConstructorHelpers::FObjectFinder INPUT_ATTACK(TEXT("'/Game/ThirdPerson/Input/Actions/IA_Attack.IA_Attack'")); if (INPUT_ATTACK.Object) { AttackAction = INPUT_ATTACK.Object; }; 일단은 다음과 같이 어택에 관한 InputAction을 받아주고 이에 상응하는 함수를 만들어 주었다. 그 이후에 바인딩을 해주는데, 문제는 지금 이 캐릭터만 해당 몽타주를 사용할 것이 아니라, 다른 캐릭터도 이를 사용하기 위해서 기본 플레이어 아래 (ABCharacterBase)에 생성을 진행해주기로 한다. 그래서..
아이템상자와 무기제작 캐릭터 소켓 설정 캐릭터 소켓 설정 캐릭터 무기 추가를 위해 마켓 플레이스에서 InfinityBlade: Weapons 를 프로젝트에 추가하자. 무기는 캐릭터에 트랜스폼으로 배치하는 것이 아니라 메시에 착용해야 캐릭터 애니메이션에 따라 무기가 같이 움직인다. 언리얼 엔진은 아이템을 캐릭터에 부착하기 위해 소켓 시스템을 제공한다. hand_rSocket 소켓에 검을 부착해보자. 그리고 위치값을 조정해서 자연스럽게 보이도록 하자. 코드를 통해무기 스켈레탈 메시 컴포넌트를 캐릭터 메시에 부착해보자. StaticMeshComponent* Weapon 변수를 선언하고 CreateDefaultSubObject()로 만들어서 원하는 Sword를 찾아 SK_WEAPON에 넣어서 Weapon->SetAttachment로..
콜리전 설정 물리 엔진은 게임 세계 내 액터들에게 영향을 준다. 캐릭터의 길을 막아주고, 중력이나 외부의 힘으로부터 작용한 힘을 받은 액터의 움직임을 표현해주고, 액터가 지정한 영역에 들어왔는지 감지도 하고,, 이러한 물리엔진을 활용하려면, 콜리전을 설정해야 한다 콜리전 설정 콜리전은 물리적 충돌 영역을 의미하는데, 언리얼에서 콜리전은 크게 세 가지 방법으로 제작할 수 있다. 스태틱메시 에셋 : 스태틱메시 에셋에 콜리전 영역을 심는 방법이다. 스태틱메시 컴포넌트에서 비주얼과 충돌이라는 두 가지 기능을 설정할 수 있어 관리가 편리하다. 기본 도형(Primitive) 컴포넌트 : 구체, 박스, 캡슐 등의 기본 도형을 사용해 스태틱메시와 별도로 충돌 영역을 지정한다. 스켈레탈 메시를 움직일 때 주로 사용한다. 피직스 애셋..
애니메이션 노티파이 애니메이션 노티파이 애니메이션 노티파이는 애니메이션을 재생하는 동안 특정 타이밍에 애님 인스턴스에게 신호를 보낼 수 있는 기능이다. 애니메이션 노티파이는 일반 애니메이션과 몽타주 모두 사용 가능한데, 여기서는 노티파이를 이용해 콤포 공격을 구현해 보자. 먼저, 위와 같이 NextAttackCheck 노티파이를 만든다. 공격 중, NextAttackCheck 노티파이가 있는 영역에서 공격 버튼이 눌릴 경우, 다음 섹션으로 넘어가 콤보 공격을 가능하도록 만드는 것이 목표이다. AttackHitCheck 노티파이는 그냥 노티파이가 작동했는지 로그를 찍어주는 기능으로 구현할 것이다. 컴파일후 플레이를 통해 공격을 해보면 몽타주 재생에 따라 네번의 노티파이가 발생함을 확인할 수 있다. 노티파이가 호출되면 언리얼은..