Delegate를 인자로 사용하기 위한 방법 - 구조체 왜 Delegate를 인자로 사용하지 못할까?간단한 내부 구조DECLARE_DELEGATE_OneParam과 같이 선언한 Delegate 타입은 함수 포인터 + 캡처 객체주소를 포함하는 구조이다.MyDelegate.AddUObject(this, &AClassName::FunctionName);다음과 같이 사용한다면 AClassName이 함수 포인터(힙에 할당)이며 this가 캡처 객체 인스턴스 주소이다.즉, 내부적으론 어떤 함수를 가리키는 포인터, 그 함수가 멤버 함수라면 해당 객체에 대한 포인터가 있다.또한 바인딩 상태, 종류(멤버, 람다, 정적), 등록 해제 상태 등 다양한 값들이 관리가 된다. 그래서 왜 못하는가?Delegate는 내부적으로 함수 포인터 정보(힙 메모리) + 캡처 객체 정보로 이루.. 2025. 3. 25. Uneal DataAsset으로 Combo System 만들기 // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "Engine/DataAsset.h"#include "ABComboActionData.generated.h"/** * */UCLASS()class PRACTICE_API UABComboActionData : public UPrimaryDataAsset{ GENERATED_BODY()public: UABComboActionData(); UPROPERTY(EditAnywhere, Category = Name) FString MontageSectionNamePrefix; UPROPERTY(Ed.. 2025. 3. 24. Unreal DataAsset DataAssetUDataAsset을 상속받은 Unreal Object Class이다.에디터에서 에셋 형태로 편리하게 데이터를 관리할 수 있다. 예시캐릭터 컨트롤에 관련된 주요 옵션을 모아 Data Asset으로 관리를 예시로 해보자.C++ Class에서 DataAsset을 추가하고헤더파일에 이와 같이 다양하게 추가해준다.float값의 경우엔 생성자에 다음과 같이 작성해주면 된다. 그리고 Unreal 에디터에서Miscellaneous -> DataAsset으로 들어가서 방금 생성한 Class를 선택해주면 생성이 된다. 생성한 DataAsset에 들어가보면다음과 같이 헤더 파일에 선언한 속성값을 채워넣을 수 있게 UI가 제공이 된다.다음과 같이 사용할 값을 DataAsset(여기선 UABCharacterC.. 2025. 3. 22. 게임 시작 시 포커스가 뷰포트로 들어가게 하기 void APlayerController::BeginPlay(){ Super::BeginPlay(); FInputModeGameOnly GameOnlyInputMode; SetInputMode(GameOnlyInputMode);}다음과 같이 입력하면 되며GameOnlyInputMode의 의미가 게임 입력만 활성화하고 마우스 커서나 UI 포커스는 무시한다는 의미이다.즉, 시작하자마자 모든 입력처리는 게임 안에서 처리가 된다.SetInputMode()함수가 APlayerCotroller에 있는 함수임으로 PlayerController에서만 사용이 가능하다. 2025. 3. 21. 경로기반 Class & Object 정보를 들고오는 방법 Asset해당 Asset에서 우클릭하여 Copy Reference를 해준다.이렇게 Asset주소를 들고온 후 생성자에서 다음과 같이 TEXT에 붙여주면 된다.붙여넣기를 하면 앞부분과 마지막에 '가 하나 더 붙는데 이건 삭제해주면 된다.'부분을 삭제하지 않으면 Crash가 난다. 그리고 Class 정보를 들고오기에 _C를 붙여주면 된다.여기서 _C는 해당 BP의 Generated Class를 의미한다. CPPCPP도 동일하게 Copy Reference를 해준다.붙여넣기하면 여기도 '가 생기는데 동일하게 삭제해주면 된다. C++ 직접 참조(StaticClass()) vs 경로 기반 로딩 (FClassFinder)C++직접 참조컴파일 타임에 타입 안정성을 검사한다.런타임 시에 오류 위험이 없다.StaticC.. 2025. 3. 21. 네트워크 캐릭터 Stat 구현 & 최적화 요소 - Unreal Network MultiPlayer Framework 캐릭터 Item과 Stat 구현 시 고려할 사항클라이언트와 서버는 Level에 있는 상제와 Item 상자에 설정된 Overlap Event에 반응해서 Stat이나 Item을 추가한다.이렇게 Item이나 Stat가 변경 될 때 서버, 클라1, 클라2가 존재한다고 가정하면서버가 클라1에게 클라1에 대한 상세한 Stat 정보를 줘야하지만 클라2의 상세한 정보(Stat정보)를 주지 않아도 된다.클라2의 정말 필요한 정보(HP)만 클라1에게 줘도 무관하다.그리고 모든 클라이언트의 Stat정보를 주게되면 네트워크 통신 데이터양도 많아지기에 성능상 좋지 않다. 즉, 서버는 각 클라이언트에게 필요한 정보만 전달하는 것이 좋다. 구현 예시게임 플레이에 영향을 주지 않는 시각적인 부분(Effect)는 서버와 클라이언트가 .. 2025. 3. 12. 캐릭터 Movement 추가 예시 - Unreal Network MultiPlayer Framework 이번 글에선 CharcterMovementComponent를 상속해서 텔레포트를 만들어 볼 것이다.CharacterMovementComponent를 상속해서 만드는 이유는https://dev.epicgames.com/documentation/ko-kr/unreal-engine/character-movement-component?application_version=4.27해당 공식문서의 아래쪽에이 토픽에서 다른 방법으로 구현했을 때의 단점을 살펴보면 된다. 이번 구현에서는CharacterMovmentComponent가 사용하는 RPC기능에 텔레포 기능을 추가 선언하고몇몇 함수를 override하여 텔레포트를 구현해볼 것이다. Teleport IA를 만들어주고 InputAction도 추가한다.이제 캐릭터 h.. 2025. 3. 12. 물리 리플리케이션 & 움직임 리플리케이션 예시 - Unreal Network MultiPlayer Framework 일반 움직임 리플리케이션 예시간단하게 움직이는 Platform을 만들어 주고Replicates를 true로 활성화해준다.이렇게하면Platform에 대한 Replication이 네트워크를 통해 클라이언트에 전송된다.하지만 아직 움직임은 전송이 되지 않는다.Replicate Movement도 활성화해야 움직임도 전송된다. 물리 시뮬레이션 리플리케이션 예시10초 뒤에 Physic가 활성화 되는 Shpere를 만들어주고공이 떨어져서 판을 무너트리는 동작을 수행한다.이때 Sphere는 위 두가지 Replicate가 활성화되어있다.근데 Server와 Client의 결과가 다르다.왜냐면 네모판과 두 기둥 StaticMesh Actor가 Replication이 활성화되어있지 않기 때문이다.StaticMeshRepli.. 2025. 3. 11. 움직임 리플리케이션 플로우 & Simulated Proxy 리플리케이션 - Unreal Network MultiPlayer Framework Simulated Proxy & 움직임 리플리케이션을 사용하기 위해선Actor의 움직임 리플리케이션 옵션을 활성화해야 올바르게 동작한다.Actor 움직임 리플리케이션 플로우서버에서 움직임 리플리케이션 옵션을 활성화매 Tick마다 현재 Actor의 움직이나 물리 상태를 ReplicatedMovement라는 멤버 변수에 저장ReplicatedMovement라는 멤버 변수를 클라이언트의 SimulatedProxy에 전송OnRep_ReplicatedMovement함수 호출클라이언트의 움직임이나 물리상태를 기록한다.클라이언트는 Tick마다 물리 & 움직임 처리를 진행한다.물리가 활성화되어있다면 물리 리플리케이션 Tick에서 클라이언트와 서버에 물리상태를 동기화캐릭터는 CharacterMovement의 매 Tick.. 2025. 3. 11. 이전 1 2 3 4 ··· 8 다음