목록언리얼 (60)
안선생의 개발 블로그
언리얼 엔진에서 가비지 컬렉션이란? 언리얼 엔진에서 가비지 컬렉션(Garbage Collection)은 메모리 관리를 자동화하는 기능입니다. 가비지 컬렉션은 프로그램이 런타임 중에 동적으로 할당된 메모리를 추적하고, 더 이상 사용되지 않는 메모리를 자동으로 해제하는 프로세스를 의미합니다. 이는 명시적인 메모리 관리 부담을 줄여주고 메모리 누수를 방지하는 데 도움이 됩니다. 언리얼 엔진에서는 Reference Graph 를 만들어 오브젝트들의 사용 여부를 구분한다. 즉 프로그래머가 직접 힙 메로리를 관리할 필요가 없다 Reference Graph 이그래프에는 Root가 존재합니다. Reference Graph의 "루트"는 언리얼 엔진에서 가비지 컬렉션 프로세스를 시작하는 출발점을 나타냅니다. 루트는 가비지..
언리얼엔진 메모리 관리 언리얼 엔진에서 메모리 관리는 중요한 부분이며, 스마트 포인터, 가비지 컬렉션, 객체 수명 주기 등을 포함한 여러 기술이 사용됩니다. 이러한 기술들은 메모리 누수를 방지하고 안정적인 게임 실행을 보장하기 위해 사용됩니다. 스마트 포인터 동적으로 할당한 메모리는 반드시 해제해주어야 하는데, 스마트 포인터는 이러한 동적 할당 메모리를 자동으로 해제해서 사고를 예방해준다. 프로그래머가 직접 Delete해줄 필요가 없습니다. 1. TUniquePtr 단일 소유권을 가지는 독점적인 포인터입니다. TUniquePtr는 특정 객체를 소유하고 해당 객체를 단일 포인터로서 관리하는데 사용됩니다. 예시입니다. 스마트 포인터는 Delete해줄 필요가 없습니다. 직접 해주기 때문 void Example..

TWeakObjetPtr는 참조 받을 때 사용합니다. 공식문서를 보면 UProperty 가 아닌 오브젝트 포인터가 필요한 경우, TWeakObjectPtr 사용을 고려해 보세요. 이는 약 포인터로, 가비지 컬렉션을 방지하지는 않지만, 접근 전 질의를 통해 유효성 검사가 가능하며, 거기서 가리키는 오브젝트가 소멸된 경우 null 설정도 가능합니다. 즉 우리는 UPROPERTY매크로를 통해 가비지 컬렉션을 방지할 수 있습니다. UPROPERTY매크로가 루트셋에 참조하기 때문 하지만 우리가 UPROPERTY매크로를 사용하지 않고 오브젝트를 얻고 싶으면 rowPoint대신 TWeakObjectPtr을 사용해야 합니다. 아래 예제보겠습니다. //..h class ATestActor* RowTestActor; UP..
MatchesTag 이 함수는 주어진 태그와 일치하는지 여부를 확인합니다. A.MatchesTag(B) A태그가 B태그 컨테이너에 있는지 확인합니다 즉 B태그가 A태그의 부모여도 True를 반환 EX) 만약에 A태그가 Ability.Attack이고 B태그가 Ability이면 A태그는 B태그 컨테이너에 포함 되므로 True를 반환합니다. 반대로 A태그가 Ability이고 B태그가 Ability. Attack이면 A태그는 B태그 컨테이너에 없으므로 False를 반환 B태그 컨테이너에는 상위태그인 Ability가 있을 수 없기 때문 MatchesTag즉 A태그가 B태그 컨테이너에 확인할 때 쓴다. 쉽게 생각하면 B태그안에 A태그가 포함되어있는지 생각하면 된다!! MatchesTagExact 이 함수는 두개의 ..

멀티플레이 게임을 만들면서 블로그에 글 올리면서 공부할려고 한다. 따라 만들 수 있고 나중에 다시 볼 수 도 있다. 먼저 프로젝트 생성해보겠다. 언리얼 버전은 5.3.2 비주얼스튜디오는 2022 게임 장르는 RPG로 생각하고 있다. 1. 먼저 에픽게임즈를 실행합니다. 2. 실행 버튼을 누르고 게임 3인칭 C++누르고 프로젝트 이름 지정해주고 생성 3. 메인메뉴바에서 파일 -> 새레벨 -> Basic으로 하나 만들어 줍니다. 4. 메인메뉴바에서 다름이름으로 저장-> 콘텐츠 풀더에 저장해줍니다. 저희는 이맵에서 테스트할겁니다. 앞으로 자주보는 맵이므로 기본맵을 바꿔줍시다. 5. 메인메뉴바 -> 프로젝트 세팅 -> 맵&로드 아래와 같이 바꿔줍니다. 그러면 앞으로 언리얼 에디터를 다시 시작할 때 Test맵으로 ..
TObjectPtr은 UObject에 대한 포인터 유형입니다. 원시 포인터 멤버 속성을 대체합니다. 64비트 포인터와 동일한 크기이며 편집기 빌드에서 액세스 추적 및 선택적 지연 로드 동작을 지원합니다. 참조된 개체에 대한 주소 또는 아직 로드되지 않은 참조된 개체를 설명하는 개체 핸들 테이블의 인덱스(편집기 빌드에서)를 저장합니다. 이는 UObject에 대한 원시 포인터와 동일하게 직렬화됩니다. 해결되면 가비지 수집에 참여하는 것은 UObject에 대한 원시 포인터와 동일합니다. 이는 고급 요리 시간 종속성 추적 및 편집기 시간 지연 로드 사용 사례를 지원하기 위해 원시 포인터를 자동으로 교체하는 데 유용합니다. 공식문서에서 보면 위와 같다 더알아봤는데 원시 포인터와 동일하게 동작하지만 편집기에는 액세..
OnComponentBeginOverlap 컴포넌트 간의 겹칠때 호출되는 이벤트입니다. 캐릭터가 만약 특정 지점에 갈 시 레벨이 이동 되거나 할 때 쓰거나 캐릭터가 총에 맞을 때 데미지 구현 할 때 등등 정말 많이 쓰니 알아두도록 하자 사용방법 헤더파일 UFUNCTION() void OnComponentBeginOverlap( UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult ); private: { UPROPERTY(VisibleAnywhere) TObjectPtr..

애니메이션 블루프린트란? Animation Blueprint, 애니메이션 블루프린트란 복잡한 애니메이션 동작을 만들고 제어하는 데 사용되는 비주얼 스크립트입니다. Animation Blueprint (애니메이션 블루프린트)는 스켈레탈 메시 의 애니메이션을 제어하는 특수 블루프린트 입니다. 그래프는 애니메이션 블루프린트 에디터 에서 편집하며, 여기서 애니메이션 블렌딩, 스켈레톤의 본 직접 제어, 로직을 구성하여 각 프레임에 사용할 스켈레탈 메시의 최종 애니메이션을 최종 결정하게 됩니다. 즉 캐릭터에 애니메이션을 제어하는 곳이라고 생각하면 된다. 애니메이션 블루프린트 생성하기 1. 컨텐츠 브라우저 -> 우클릭 -> 애니메이션 -> 애니메이션 블루프린트 2. 블루프린트 만들 스켈레톤을 누른 후 생성 스켈레톤이..

Cast(클래스) 클래스를 바꾸고 싶은 클래스로 바꿔준다 단 클래스가 바꾸고 싶은 클래스랑 부모든 자식이든 연관이 되어야함 업 캐스팅 다운 캐스팅 가능 간단한 예시 내가 만약 Overlap을 했다고 치자 그럼 모든 액터한테 반응을 할것이다 이때 cast를 한다 그러면 Cast한 액터에게만 반응을 할 것이다. 위와 같이 BP_ThirdPersonCharacter를 캐스팅하면 OtherActor가 BP_ThirdPersonCharacter일때만 호출될것이다. 모든 클래스는 Actor에 자손이기 때문 cast가 가능 위와같이 캐스팅은 형변환할때 사용한다. 캐스팅에 성공하면 바꾼 클래스 기능을 사용할 수 있다
인터페이스 인터페이스 클래스는 (잠재적으로) 무관한 클래스 세트가 공통의 함수 세트를 구현할 수 있도록 하는 데 쓰입니다. 그대로라면 유사성이 없었을 크고 복잡한 클래스들에 어떤 게임 함수 기능을 공유시키고자 하는 경우 매우 좋습니다. 예를 들어 트리거 볼륨에 들어서면 함정이 발동되거나, 적에게 경보가 울리거나, 플레이어에게 점수를 주는 시스템을 가진 게임이 있다 칩시다. 함정, 적, 점수에서 ReactToTrigger (트리거에 반응) 함수를 구현하면 될 것입니다. 하지만 함정은 AActor 에서 파생될 수도, 적은 특수 APawn 또는 ACharacter 서브클래스일 수도, 점수는 UDataAsset 일 수도 있습니다. 이 모든 클래스에 공유 함수 기능이 필요하지만, UObject 말고는 공통 조상이..