c1~c4

CJB_ny·2022년 12월 22일
0

득언리얼

목록 보기
1/12
post-thumbnail

1 폴더 분석

Binaries : C++코드가 컴파일된 결과물 저장하는 공간. 빌드하면 계속 생김 삭제해도.

언리얼 c++프젝 컴파일 실행과정은

  1. 비쥬얼 스튜디오 프로젝트 (소스파일) -> 컴파일

  2. Binaries폴더/Win64폴더 -> UE4Editor~프젝이름.DLL -> UE4Editor가 검색후 탐재함.

  3. 모듈 이름 -> UE4Editor를 구동함.

c++ 코드를 컴파일한 결과물을 UE 에서는 모듈이라고 하고, 게임로직을 담은 모듈에는 특별히 게임 모듈이라한다.

2 엑터의 설계

  • 엑터 : UE에서 컨텐츠를 구성하는 최소단위. 이름, 유형, 트랜스폼을 가짐

    트랜스폼을 가지는 이유는 반드시 월드에 존재해야하기 때문에.

  • 컴포넌트

    주요 기능은 크게 세가지로 나뉘는데

    시각적 기능
    물리적 기능
    움직임

    주요 컴포넌트는
    스태틱메시 Comp
    SkeletalMesh Comp
    Conllision 등등등..

내가 궁금 했던 부분들 👍

  • 루트 컴포넌트

    액터는 여러개의 컴포넌트를 가질 수 있는데 그중에서 대표하는 하나의 컴포넌트를 반드시 지정해야한다.
    이것을 "루트"컴포넌트라고 한다.

  • UPROPERTY()

    이게 메크로인데 컴포넌트들 포인터인것들 메모리 관리를 해줌. 안하면 안됨
    이거하면서 Visual Assistant같이 함.

  • 클래스 이름 접두사

    U / A 로 나뉘는데, A는 Actor클래스에 사용하고 U는 Actor 클래스가 아닌 클래스에 사용한다.
    그래서 StaticMeshComponent가 아니라 UStaticMeshComponent이다.

  • generated.h

    소스파일 컴파일 하기 이전에 UE는 "언리얼 헤더 툴" 이라는 도구를 이용해 클래스 선언 분석및 필요한 부가 파일을 생성하는데 이때 UE헤더 툴에 의해 생성되는 부가 파일이 generated.h 헤더파일임.
    컴파일 과정에서 필연적으로 생기기 때문에 항상 선언 마지막 부분에 반드시 선언해야함.

  • CreateDefaultSubobject

    new 대신에 컴포넌트 생성하는 용도의 함수
    헤더파일에서 메크로로 컴포넌트 선언하고 생성자에서 CreateDefaultSubobject이거

Body = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BODY"));

여기에서 TEXT안의 2바이트 짜리 문자열 값은 액터에 속한 컴포넌트를 구별하기 위한 Hash값 생성에 사용됨 어쩌구 p69


값 유형 👍

바이트 byte : uint8
정수 int : int32
실수 float : float
문자열 string : FString, FName
구조체 FVector, FRotator, FTransform

이것들은

UPROPERTY()
int32 a;

위와같이 해놓으면 0으로 셋팅됨 (값형식 전부다)

질문 ❗❗❗❗❗

APerson::APerson()

{

PrimaryActorTick.bCanEverTick = true;

Body = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BODY"));

RootComponent = Body;

static ConstructorHelpers::FObjectFinder BODY(TEXT("StaticMesh'/경로 어쩌구'"));

if (BODY.Succeeded())

{

	Body->SetStaticMesh(SM_BODY.Object);

}

}

이렇게 Person이라는 c++클래스의 생성자에서 FObjectFinder할 때 제일앞에 static을 붙이는데

이게 구글링을 해보니까

경로는 변경될일이 없기 때문에 게임에서 생성자 코드가 여러번 호출 될 때마다 지역변수를 생성하고 초기화 하는 것은 불필요한 작업이라서 static을 붙인다던데...

Person이라는 객체가 월드에 동적으로 배치가 된다면 어쨋든 생성자를 호출하기때문에 변경될일이 없더라도 지역변수를 호출하는거 아닌가요...??

static 키워드가 붙은 변수는 생성자에서 초기화를 못한다고 알고있습니다..

왜냐하면 같은 이름의 변수가 계속 데이터 영역에 올라가면 링킹 문제가 발생한다고 알고있어서...(정확하지는 않지만 그냥 같은 이름의 변수를 계속 데이터 영역에 올리면 안된다라는 느낌을 강하게 받습니다)

그런데 만약 Person이라는 c++객체를 동적으로 계속 월드에 배치를 한다면 생성자도 호출이 되는 것일텐데 그때마다 static이 붙은

static ConstructorHelpers::FObjectFinder BODY(TEXT("StaticMesh'/경로 어쩌구'"));

이부분이 계속 호출 되면 에러가 나야 정상아닌가요..?? 잘 모르겠습니다..ㅠ

3. 엑터 제작

게임이 시작되고 가장먼저 실행하는 엑터의 함수는 Beginplay이다.

  • virtual ❗

    부모 클래스의 액터의 가상함수로직에 UE프레임워크가 제대로 동작하기위해서는 반드시 실행해야하는 로직이 있음.
    상속받는 자식클래스가 게임에 필요한 로직을 구현하기 위해서는 먼저 부모클래스 함수에 있는 중요한 로직을 실행시켜야한다.

  • private ❗

    정보를 은닉하기 위해 private을 사용하면 컴파일과정에서 에러발생함 향후 언리얼 에디터에서 변수에 값을 변경하려면 접근 권한을 개방해야하기 때문. 그런데 UPROPERTY의 AllowPrivateAccess 라는 Meta 키워드를 추가를 하면 에디터에서는 이를 편집함과 동시에 데이터 은닉도 가능하기 떄문에 => 캡슐화 씹가능.

  • 컴파일

    컴파일 하기 전에는 언리얼 헤더 툴이라는 프로그램에 의해 먼저 분석된다.

  • Pitch, Yaw, Roll

    Pitch : Y, Yaw : Z, Roll : X

  • Tick <-> movement comp ❗

    tick이라는 함수가 없어도 movement comp가 매틱마다 엑터를 움직일 수 있게 해준다.
    다른 컴포넌트들과 달리 독립적으로 엑터에 부착됨.

4 프레임 워크

  • Login : 플레이어가 게임에 입장
  • PostLogin : Login이 완료가 되면 호출되는 함수

    플레이어가 조종할 폰을 생성하고 플레이어 컨트롤러가 해당폰에 빙의하는 작업을 함.

폰과 플레이어 컨트롤러가 생성되는 시점은 각 액터의 PostInitializeComponents함수로 파악가능하다.

빙의 시점은 플레이어 컨트롤러의 OnPossess, 폰의 PossessedBy로 파악이 가능함.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글

관련 채용 정보