- CreateDefaultSubobject : 동적 할당
- 생성자 : 클래스의 객체가 처음으로 생성될 때 실행되는 함수다.
- 언리얼에서는 일반적인 ‘구조체 자료형’에는 접두사로 ‘F’가 붙는다.
- FVector ; 위치
- FRotation : 회전
- FString : 문자열 자료형
- 메크로 확장 프로그램 - Category : 변수의 종류를 모아놓는 역할을 한다.
- 언리얼에서 실시간으로 바뀌는 값은 에디터살으로는 확인하지 못하고, 배치된 상태에서만 확인할 수 있다.
솔루션파일 없을때 쉽게 넣는 법
- 언리얼 uproject 우클릭 - Generate Visual Studio project files 클릭
- 버튼 없을때 해결법
- C:\Program Files (x86)\Epic Games\Launcher\Engine\Binaries\Win64 에서 ‘UnrealVersionSelector.exe’ 복사
- C:\Program Files\Epic Games\언리얼 버전\Engine\Binaries\Win64’ 에 붙여넣기
- UnrealVersionSelector.exe 실행
비주얼 스튜디오 확장 프로그램 사용
- 메크로 목록
- UPROPERTY : 멤버 변수 위에 붙는다.
- EditAnywhere : ‘에디터 편집 디테일’과 ‘배치된 액터 편집 디테일’에서 모두 보여지는 변수를 설정할 수 있다.
- 에디터상에서도 편집할 수 있고, 배치된 상황에서도 편집할 수 있다.
- 에디터상에서는 기본값을 주지만, 배치된 상황에서는 자기 자신만 바꾸는것이다.
- EditDefaultsOnly : ‘에디터 편집 디테일’에서만 보여지는 변수를 설정할 수 있다.
- 전체의 값이 다 바뀐다. ⇒ 기본값으로 사용하는 듯 하다.
- EditInstanceOnly : ‘배치된 액터 편집 디테일’에서만 보여지는 변수를 설정할 수 있다.
- 배치된 액터의 디테일을 편집한다는것은 ‘자기 자신의 값만 바꾸는것이다.
- Visible(Anywhere, DefaultsOnly, InstanceOnly) : Edit는 값의 편집도 가능하지만, Visible은 값을 보여주기만 할 수 있다.
- BlueprintReadWrite : 블루프린트에서 C++ 파일에서 선언한 변수를 ‘읽기와 쓰기’가 가능한 변수를 생성할 수 있다. (Get과 Set을 쓸 수 있다는 의미이다.)
- UFUNCTION : 함수 위에 붙는다.
- UCLASS : 클래스 위에 붙는다.
- USTRUCT : 구조체 위에 붙는다.
- UENUM : 열거형
- UINTERFACE : 인터페이스
- UE_LOG , LOG_CATEGORY : 디버그 로그 띄울때 사용한다.
- DELEGATE : 위임자 등 이벤트 작업할떄 사용한다.
01. 변수 예제 - 변수 로그 출력
C++ 변수 초기화 방법
- 헤더파일에서 초기화한다. - 주로 사용하는 초기화 방법이다.
- 헤더파일 - 메크로 및 에디터 표시 기능 설정 - 변수 생성 및 초기화
UPROPERTY(EditAnywhere)
int A = 10;
- 생성자 함수에 초기화한다.
- 헤더파일 - 메크로 및 에디터 표시 기능 설정 - 변수 생성 - cpp 파일 - 생성자 함수 확인 - 함수 외부에서 변수 초기화
AC01_Property::Ac01_Property()
: B(20)
{
}
- 생성자 함수 내부에서 초기화한다.
- 헤더파일 - 메크로 및 에디터 표시 기능 설정 - 변수 생성 - cpp 파일 - 생성자 함수 확인 - 함수 내부에서 변수 초기화
AC01_Property::Ac01_Property()
{
C = 30;
}
자잘한 오류 메세지
- 핫 리로드 메세지
- 외부에서 스크립트파일 수정
- 모두 다시 로드 클릭
- 실수로라도 무시를 누른다면, 솔루션파일 삭제하고 다시 만들어야한다.
전방선언 - C#에는 없는 개념이다.
- class 부르려고 하는 자료형* 변수이름;
- 자료형의 기능을 사용하기 위해서는 ‘무조건’ 헤더를 포함시켜 줘야한다.
- 자료형을 사용할때마다 include를 사용하면 선언이 계속 누적되기 때문에 프로그램이 느려진다.
- 그래서, 전방선언을 사용하는 것이다.
private:
UPROPERTY(VisibleAnywhere)
class UStaticMeshComponent* Mesh;
02. 메쉬 예제 - 메쉬 컴포넌트를 코드로 작성해서 화면에 배치
- UPROPERTY : 자동초기화된다.
- 언리얼 최상위 클래스 : UObject
- 멤버 변수 : 클래스 내부에서 선언된 변수다. ⇒ 클래스 내부의 함수에서도 사용할 수 있다.
- 지역 변수 : 함수 내부에서 선언된 변수다. ⇒ 함수 외부에서 사용할 수 없다.
- F 접두사 : 구조체 자료형에 붙는다.
- 모든 자료형은 ‘::’를 하면 ‘StaticClass()’ 가 있다.
- 유니티의 ‘리플렉션’과 동일한 기능이다. ⇒ 자료형을 직접 변수로 사용하는 기능이다.
- 함수 실행이 ‘문자열’로 들어간다면 ‘메세지’가 넘겨져서 실행이 되는 함수다.
- 이러한 함수는 반드시 ‘UFUNCTION’이 붙어야한다.
- ::은 영역을 표시한 것이다.
- 예를 들어, AC02_Mesh::BeginPlay()는 AC02_Mesh 안에 정의되어 있는 BeginPlay 함수를 의미하는 것이다.
02. 메쉬 예제 - 스테틱 메쉬 기본값 설정
02. 메쉬 예제 - 메테리얼 설정
- 클래스를 가져와서 변수로 저장했다면 UObject 클래스에서 하위의 클래스를 저장했으니 ‘다운캐스팅’을 해야한다.
- 메테리얼은 프로그래밍으로 사용할때는 인스턴스를 다이나믹’으로 만들어야한다.
- UMaterialInstanceConstant : 메테리얼 인스턴스의 값을 변경할 수 없게 한다.
- UMaterialInstanceDynamic : 메테리얼의 값을 변경할 수 있게 한다.
- 생성한 메테리얼 인스턴스 파일은 코드 설정이 끝나고 우클릭 - 에셋 액션 - 리로드 를 눌러줘야한다.
- 이후 언리얼 프로그램 우측 하단 ‘부서지는 블럭’ 아이콘(핫 리로드 버튼)를 눌러줘야한다.
- 코드로 메테리얼 설정하기 - 메테리얼 인스턴스 파일 불러오고 저장하기
- 콘텐츠 브라우저 - 우클릭해서 메테리얼 생성 - ‘VectorParameter’ 검색 후 색깔 지정 - 메테리얼 파일 우클릭 후 인스턴스 생성 - 인스턴스 클릭 후 ‘파라미터 그룹’의 ‘Color’ 옵션에 체크 ⇒ 이거 체크 안하면 코드에서 색상 변경을 못한다. - 인스턴스 파일 레퍼런스 복사 - cpp 파일 - 클래스 호출 함수를 사용해서 메테리얼을 불러온다. ⇒ 불러올 클래스, 인 아웃터(아직 안배움), 불러올 파일의 경로를 작성한다. - 정의한 함수를 UObject 변수로 저장한다. - UObject에서 불러올 클래스로 ‘자료형 변환’을 한다. - 자료형변환 정의가 끝났다면 ‘메테리얼 인스턴스 상수’ 자료형의 변수를 생성해서 저장한다. ⇒ 값이 변하지 않는 상수로 저장해서 ‘기본값’으로 만들기 위해서이다. - 헤더파일 - ‘메테리얼 인스턴스 동적’ 자료형의 변수를 생성한다. ⇒ 코드로 값을 ‘변경하기 위해서’이다. - cpp 파일 - 헤더파일에서 만든 ‘메테리얼 동적’ 변수에 ‘메테리얼 동적’ 자료형에 있는 ‘생성’ 함수를 사용해서 저장한다. - ‘스테틱 메쉬’ 자료형 변수에 있는 ‘메테리얼 설정’ 함수에 ‘메테리얼 동적’ 변수를 넣는다. - 메테리얼 인스턴스 파일을 ‘리로드’하고 ‘핫 리로드’ 버튼도 눌러준다.
//header
private:
//헤더로 지정을 안하면 직접 선언 후 생성해야한다.
class UMaterialInstanceDynamic* Material;
//cpp
UObject* obj = StaticLoadObject(UMaterialInstanceConstant::StaticClass(), nullptr,
L"MaterialInstanceConstant'/Game/Meterials/M_White_Inst.M_White_Inst'");
UMaterialInstancConstant* material = Cast<UmaterialInstanceConstant>(obj);
Material = UMaterialInstanceDynamic::Create(material, this);
Mesh->SetMaterial(0, Material);
- 랜덤 색상으로 변경
- cpp 파일 - ‘시간 딜레이 기능 헤더’ 추가 - ‘시간 지연 클래스’에 있는 ‘시간 지연 후 함수 실행’ 함수에 실행받을 오브젝트, 실행할 함수 : ‘색 랜덤 설정’, 지연 시간, 반복 여부를 정의한다. - 헤어파일 - 함수 메크로 작성 및 지연 시킬 함수 선언(넣는 이름은 서로 같아야한다.) - cpp 파일 - 시간 지연을 받을 ‘색 랜덤 설정’ 함수 정의 - ‘메테리얼 동적’ 변수에 ‘색상 설정 함수’를 이용하여 ‘색상 설정 노드 이름’과 ‘랜덤 색상 값 반환 함수’의 색상값을 넣는다.
//header
private:
UFUNCTION()
void SetRandomColor(); //cpp 파일에서 만들 함수 이름과 같아야한다.
//cpp
#include "Kismet/KismetSystemLibrary.h"
UKismetSystemLibrary::K2_SetTimer(this, "SetRandomColor", 1, true);
void AC02_Mesh::SetRandomColor()
{
Material->SetVectorParameterValue("Color", FLinearColor::MakeRandomColor());
}
같은 기능 다른 모양 예제 - 상속 이용
- 파생 클래스 생성
- 생성판 C++ 파일 우클릭 - 파생 C++ 클래스 생성 클릭 - 헤더와 cpp의 경로 include를 상대경로(../)로 수정한다. - 헤더파일 - 생성자 생성 - cpp 파일 - 생성자 정의 - 메쉬 경로 가져와서 설정하는 코드 복붙해서 다른 메쉬의 경로로 수정한다.
메쉬 순서 정리
- 컴포넌트 생성 함수를 ‘스테틱 메쉬 컴포넌트’의 자료형으로 생성하고, 에디터에 표시될 컴포넌트의 이름을 지정한다.
- 루트 컴포넌트에 생성한 컴포넌트를 할당한다.
- ‘파일 찾기’ 함수를 이용해서 ‘스테틱 메쉬’ 자료형의 파일을 ‘지정된 경로’에서 읽어와서 변수에 저장한다.
- 불러오기를 성공했다면 생성한 ‘스테틱 메쉬 컴포넌트’의 스테틱 메쉬를 가져온 메쉬로 ‘스테틱 메쉬 설정’ 함수를 호출한다.
메테리얼 순서 정리
- 메테리얼 파일 생성
- 메테리얼 인스턴스 파일 생성
- 메테리얼 인스턴스 경로를 가져와서 ‘메테리얼 인스턴스 상수’ 자료형으로 파일을 불러와서 저장
- 저장된 파일을 ‘메테리얼 인스턴스 상수’ 자료형으로 형변환 ⇒ 아직 UObject니까 UMaterialInstanceConstant로 바꿔줘야한다.
- 상수는 값을 변경할 수 없으니 상수의 메테리얼을 가지고 ‘메테리얼 동적’ 자료형으로 변수를 생성해서 저장한다.
- 해당 메쉬의 메테리얼을 ‘메테리얼 동적’ 변수의 메테리얼로 설정한다. ⇒ 해당 메쉬 메테리얼 값을 변경할 수 있게 하기 위해서다.
- ‘시간 지연 함수 홏출’ 함수를 호출한다.
- 지연시킬 함수를 생성하고 정의한다.
단축키 모음
- 단축키 지정 방법
- 도구 - 옵션 - 키보드 - 바꿀 옵션 선택 - 바로 가기 키 누르기 에서 원하는 단축키 누르기 - 확인
- Alt + W (Write) : Unreal Macro Generate 기능이다. ⇒ 헤더 파일에서 사용한다.
- Alt + E (Editing) : 해당 메크로에 있는 다른 기능으로 바꾼다.
- 솔루션 폴더 내의 파일 클릭 + 방향키 좌측 : 폴더 접기
- 헤더파일과 cpp 파일 오가는 단축키 : Ctrl + `
include 헤더 모음
- 엔진에 있는 경로를 작성해서 기능을 불러오는 것이다.
- #include “Components/StaticMeshComponent.h” : 스테틱 메쉬 자료형의 기능을 가지고 있다.
- #include “Materials/MaterialInstanceConstant.h” : 메테리얼 기능을 가지고 있다.
- #include “Kismet/KismetSystemLibrary.h” : 딜레이 함수 기능을 가지고 있다.
C++ 함수 모음
- FString : 문자열 자료형
- FString변수.Append(문자열) ; 문자열 변수에 문자열 넣기
- FString::FromInt(바꿀 정수) : 정수를 문자열로 바꾸기
- FColor : 0 ~ 255의 색상 값을 가지고 있는 클래스다.
- FLinearColor : 0 ~ 1의 색상 범위를 가지고 있는 클래스다.
- MakeRandomCOlor() : 랜덤한 색상 값을 반환하는 함수다.
- GetActorLabel() : 액터 객체 이름 출력
- GetActorName : 액터 객체 이름 출력
- Tik의 DeltaTime : 현재 프레임과 이전 프레임의 차
- class UStaticMeshComponent : 스테텍 메쉬 컴포넌트 자료형 클래스
- UStaticMesh* : 스테틱 메쉬 디테일 설정 자료형
- CreateDefaultSubobject<생성할 컴포넌트의 자료형 (템플릿이라고 한다.)>(에디터상에 나타날 이름 - 자료형의 변수와 같은 이름으로 할당한다.) : 컴포넌트 동적 할당(동적 생성) 시켜주는 함수
- SetStaticMesh(메쉬를 넣을 변수의 메쉬 디테일(object)) : 스테틱 메쉬 컴포넌트에 디테일에 레퍼런스 경로로 가져온 스테틱 메쉬를 할당하는 함수다.
- SetMaterial(메테리얼 배열 번호(메테리얼을 넣을 번호 - 디테일에서 확인 가능하다), 생성한 메테리얼 변수) : 스테틱 메쉬에 있는 메테리얼에 설정한 메테리얼을 넣는 함수다.
- ConstructorHelpers : 구조체 객체를 생성할 때 리소스를 찾고 로드하는데 사용되는 자료형이다.
- 이 자료형 자체가 구조체이고, 이 구조체 안에 있는 또 다른 구조체 자료형을 가져와 사용할 수 있다.
- FObjectFinder<찾을 자료형> : 오브젝트를 찾는 함수
- 즉, ConstructorHelpers::FObjectFinder<찾을 자료형> ⇒ 자체가 하나의 구조체 타입으로 선언된다.
- StaticLoadObject(불러올 클래스, 인 아웃터(아직 안배웠다), 불러올 파일 경로) : 어떤 클래스가 올지 모르는 상황에서 쓰는 오브젝트(클래스) 호출 함수다.
- Case<바꿀 자료형>(바꿀 자료형이 저장된 변수) : 형변환 함수다.
- UMaterialInstanceConstant : 메테리얼 상수 클래스 ⇒ 메테리얼 값을 변경할 수 없다.
- UMaterialInstanceDynamic : 메테리얼 동적 클래스 ⇒ 메테리얼 값을 변경할 수 있다.
- Create(메테리얼 인스턴스 상수 변수, 인 아웃터(안배웠음)) : 메테리얼 인스턴스 동적 생성 함수다.
- SetVectorParameterValue(메테리얼 파일의 ectorParameter 이름, :
- KismetSystemLibrary : 시간 딜레이 기능을 가진 클래스다.
- K2_SetTimer(함수의 기능을 받을 오브젝트, 실행할 함수, 지연할 시간, 반복할것인지 여부, 언제 시작할것인지 정하는 값(즉, 3으로 했다면 3초 뒤부터 정해진 시간 간격으로 실행된다.), ) : 블루프린트의 ‘Set Timer by Function Name’의 기능을 가지고 있는 함수다.
블루프린트 함수 모음
- Material
- VectorParameter : 베이스 컬러를 지정하는 함수
- Set Timer by Function Name : 함수의 이름, 딜레이 시간을 설정해서 지정된 시간만큼 지연 후 지정된 함수를 실행하는 함수다.