공부/Unreal

24.07.03

월러비 2024. 7. 5. 12:59
  • 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. 변수 예제 - 변수 로그 출력

  • 변수 사용
    • 헤더파일 - Alt + W - UPROPERTY - EditAnywhere - 변수 생성 및 초기화
  • 메크로 변경
    • 메크로와 초기화된 변수 복붙 - 변수 명 변경 - 메크로에 커서 놓기 - Alt + E - EditDefaultsOnly - 변수 생성
    • 메크로와 초기화된 변수 복붙 - 변수 명 변경
  • 출력 로그에 액터 이름과 정수를 문자열로 띄우기
    • cpp 파일 - FString 자료형으로 변수 생성 - ‘문자열 변수’.Append(GetActorLabel()); - ‘문자열 변수’.Append(출력할 문자); - ‘문자열 변수’.Append(FString::FromInt(바꿀 정수)); - GLog→Log(문자열 변수);
    Fstring str;
    str.Append(GetActorLabel());
    
    str.Append(" / A : ");
    str.Append(FString::FromInt(A));
    
    GLog->Log(str);
    
  • C++파일기반 블루프린트 생성
    • C++ 파일 우클릭 - C++ 기반 블루프린트 생성 클릭
  • 블루프린트에서 C++ 변수 이용해서 로그 출력
    • 블루프린트 파일을 배치하기만해도 C++의 기능으로인해 출력이 실행된다.
  • 편집 불가 변수 확인
    • C++ 파일 - UPROPERTY의 VisibleAnywhere 클릭 후 변수 생성 - cpp 파일 - Tick 함수 내에서 변수 정의 - 화면에 배치된 액터를 샐행하면 배치된 액터의 디테일에서 확인할 수 있다.
  • 블루프린트에서 C++ 변수를 Get과 Set을 이용할 수 있다.
    • C++ 파일 - UPROPERTY의 BlueprintReadWrite와 EditAnywhere 클릭 후 변수 생성 및 초기화 - 블루프린트 파일 - 이벤트 그래프 - ‘BeginPlay’ 검색 - ‘Get 변수이름’ 검색 - Get 변수를 Print String과 연결 - Get 변수에 ‘10을 더해서’ Set 변수에 연결 - Set 변수를 Print String에 연결

C++ 변수 초기화 방법

  1. 헤더파일에서 초기화한다. - 주로 사용하는 초기화 방법이다.
    1. 헤더파일 - 메크로 및 에디터 표시 기능 설정 - 변수 생성 및 초기화
    UPROPERTY(EditAnywhere)
    	int A = 10;
    
  2. 생성자 함수에 초기화한다.
    1. 헤더파일 - 메크로 및 에디터 표시 기능 설정 - 변수 생성 - cpp 파일 - 생성자 함수 확인 - 함수 외부에서 변수 초기화
    AC01_Property::Ac01_Property()
    	: B(20)
    {
    }
    
  3. 생성자 함수 내부에서 초기화한다.
    1. 헤더파일 - 메크로 및 에디터 표시 기능 설정 - 변수 생성 - cpp 파일 - 생성자 함수 확인 - 함수 내부에서 변수 초기화
    AC01_Property::Ac01_Property()
    {
    	C = 30;
    }
    

자잘한 오류 메세지

  • 핫 리로드 메세지
    • 신경쓰지 말고 아니오 눌러라
  • 외부에서 스크립트파일 수정
    • 모두 다시 로드 클릭
    • 실수로라도 무시를 누른다면, 솔루션파일 삭제하고 다시 만들어야한다.

전방선언 - C#에는 없는 개념이다.

  • class 부르려고 하는 자료형* 변수이름;
  • 자료형의 기능을 사용하기 위해서는 ‘무조건’ 헤더를 포함시켜 줘야한다.
    • 자료형을 사용할때마다 include를 사용하면 선언이 계속 누적되기 때문에 프로그램이 느려진다.
    • 그래서, 전방선언을 사용하는 것이다.
private:
	UPROPERTY(VisibleAnywhere)
			class UStaticMeshComponent* Mesh;

02. 메쉬 예제 - 메쉬 컴포넌트를 코드로 작성해서 화면에 배치

  • 언리얼에서는 ‘관례상’ 컴포넌트를 생성하는 코드는 ‘VisibleAnywhere’를 사용한다.
  • 기본적으로 ‘블루프린트 클래스’는 DefaultSceneRoot라는 ‘루트 컴포넌트’가 자동으로 지정되지만, C++ 파일은 루트 컴포넌트를 ‘직접’ 지정을 해줘야한다.
  • C++ 기반의 블루프린트 클래스를 만드는 또 다른 방법 : 기존 블루프린트 클래스를 눌러서 부모 클래스 선택창에 들어가 모든 클래스에서 C++ 파일 클래스를 검색한다.
  • C++ 코드로 스테틱 메쉬 컴포넌트 추가
    • 헤더 파일 - 스테틱 메쉬 자료형으로 변수 생성 - cpp 파일 - 생성자 함수 확인 - 컴포넌트 동적 할당 함수를 정의해서 변수에 할당한다. ⇒ 템플릿에 생성할 컴포넌트의 자료형을 넣고, 에디터에 표시할 이름은 자료형을 생성할때의 변수명으로 맞춘다. - 루트 컴포넌틑에 동적 할당한 변수를 할당한다.
    //header
    private:
    	UPROPERTY(VisibleAnywhere)
    		class UStaticMeshComponent* Mesh;
    
    //cpp
    #include "Components/StaticMeshComponent.h"
    
    생성자 함수()
    {
    	Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh");
    	RootCOmponent = Mesh;
    }
    

 

  • UPROPERTY : 자동초기화된다.
  • 언리얼 최상위 클래스 : UObject
    • 모든 클래스는 UObject를 상속한다.
  • 멤버 변수 : 클래스 내부에서 선언된 변수다. ⇒ 클래스 내부의 함수에서도 사용할 수 있다.
  • 지역 변수 : 함수 내부에서 선언된 변수다. ⇒ 함수 외부에서 사용할 수 없다.
  • F 접두사 : 구조체 자료형에 붙는다.
  • 모든 자료형은 ‘::’를 하면 ‘StaticClass()’ 가 있다.
    • 유니티의 ‘리플렉션’과 동일한 기능이다. ⇒ 자료형을 직접 변수로 사용하는 기능이다.
  • 함수 실행이 ‘문자열’로 들어간다면 ‘메세지’가 넘겨져서 실행이 되는 함수다.
    • 이러한 함수는 반드시 ‘UFUNCTION’이 붙어야한다.
  • ::은 영역을 표시한 것이다.
    • 예를 들어, AC02_Mesh::BeginPlay()는 AC02_Mesh 안에 정의되어 있는 BeginPlay 함수를 의미하는 것이다.

02. 메쉬 예제 - 스테틱 메쉬 기본값 설정

  • 코드로 메쉬 설정하기
    • cpp 파일 - 생성자 함수 확인 - 자료형 탐색 구조체 변수 생성 - 가져올 메쉬가 있는 폴더 확인(BaseShape 폴더) - 기본값으로 만들 메쉬 우클릭 후 레퍼런스 복사(에셋 경로 복사) - 구조체 변수에 경로 붙여넣기 - 메쉬 경로가 잘 들어갔는지 확인 - 잘 들어갔다면 ‘스테틱 메쉬’ 변수의 옵션에 넣어라
    //cpp
    ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(L"StaticMash'/Engine/BasicShapes/Cube.Cube'");
    if(mesh.Succeeded())
    {
    	Mesh->SetStaticMesh(mesh.object);
    }
    

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 파일 - 생성자 정의 - 메쉬 경로 가져와서 설정하는 코드 복붙해서 다른 메쉬의 경로로 수정한다.

메쉬 순서 정리

  1. 컴포넌트 생성 함수를 ‘스테틱 메쉬 컴포넌트’의 자료형으로 생성하고, 에디터에 표시될 컴포넌트의 이름을 지정한다.
  2. 루트 컴포넌트에 생성한 컴포넌트를 할당한다.
  3. ‘파일 찾기’ 함수를 이용해서 ‘스테틱 메쉬’ 자료형의 파일을 ‘지정된 경로’에서 읽어와서 변수에 저장한다.
  4. 불러오기를 성공했다면 생성한 ‘스테틱 메쉬 컴포넌트’의 스테틱 메쉬를 가져온 메쉬로 ‘스테틱 메쉬 설정’ 함수를 호출한다.

메테리얼 순서 정리

  1. 메테리얼 파일 생성
  2. 메테리얼 인스턴스 파일 생성
  3. 메테리얼 인스턴스 경로를 가져와서 ‘메테리얼 인스턴스 상수’ 자료형으로 파일을 불러와서 저장
  4. 저장된 파일을 ‘메테리얼 인스턴스 상수’ 자료형으로 형변환 ⇒ 아직 UObject니까 UMaterialInstanceConstant로 바꿔줘야한다.
  5. 상수는 값을 변경할 수 없으니 상수의 메테리얼을 가지고 ‘메테리얼 동적’ 자료형으로 변수를 생성해서 저장한다.
  6. 해당 메쉬의 메테리얼을 ‘메테리얼 동적’ 변수의 메테리얼로 설정한다. ⇒ 해당 메쉬 메테리얼 값을 변경할 수 있게 하기 위해서다.
  7. ‘시간 지연 함수 홏출’ 함수를 호출한다.
  8. 지연시킬 함수를 생성하고 정의한다.

단축키 모음

  • 단축키 지정 방법
    • 도구 - 옵션 - 키보드 - 바꿀 옵션 선택 - 바로 가기 키 누르기 에서 원하는 단축키 누르기 - 확인
  • 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 : 함수의 이름, 딜레이 시간을 설정해서 지정된 시간만큼 지연 후 지정된 함수를 실행하는 함수다.

'공부 > Unreal' 카테고리의 다른 글

24.07.10  (1) 2024.07.12
24.07.04  (0) 2024.07.07
24.07.02  (1) 2024.07.03
24.07.01  (0) 2024.07.03
24.06.28  (0) 2024.07.02