개발 161

언리얼 엔진으로 좁은 에어리어 바닥 만들기

카툰풍 3D 배경(고양이 파티 게임 마당 씬) 바닥 제작 과정 정리. 잔디+흙길 자연스럽게 섞인 바닥을 텍스처 두 장 + 버텍스 페인트로 구현.방식 선택 이유랜드스케이프: 지형 굴곡엔 좋으나 마당 규모엔 과함대신 Plane 하나 + 버텍스 컬러 블렌딩 채택 → 작업량 절감핵심 구조:잔디/흙 텍스처를 머티리얼에서 Lerp로 블렌딩흙길 위치는 버텍스 컬러로 직접 페인팅1단계. 버텍스 페인트 가능한 Plane 제작 기본 Plane = 폴리곤 2개(버텍스 4개) → 버텍스 페인트 시 경계 각짐. 촘촘한 격자 필요.Select Mode 드롭다운 → Modeling 모드Create 탭 → Rectangle 툴 (Plane 역할)Details 패널 설정Width / Height: 마당 크기 기준 (예: 2000 x ..

언리얼 내배캠 - 멀티플레이 채팅 구현

PlayerController.h에 ClientRPCPrintChatMessageString, ServerRPCPrintChatMessageStirng 함수 추가 채팅이란 클라이언트에서 서버 RPC로 보내고, 서버에서 클라이언트 RPC로 전체 출력을 해주는 구조이다. 이 함수들을 구현할 때는 함수명 뒤에 _Implementation 접미사를 붙여주어야한다.추가로 WithValidation 키워드를 붙이면 _Validate()도 반드시 구현해야하고, 여기서 치트 방지 검증을 한다. for문으로 플레이어 컨트롤러 전체를 돌며 메시지 출력 함수를 실행해준다.EngineUtils.h를 추가해야 GetWorld의 ActorIterator를 사용할 수 있다. ClientRPC 대신 NetMulticastRPC를 사..

언리얼 내배캠 - 언리얼 멀티플레이 기초 RPC(Remote Procedue Call)

RPC란?호출하는 PC와 실행하는 PC가 달라도 되게끔 해주는 통신 기법대부분 게임에 큰 영향을 끼치지 않는 일시적인 효과들에 사용해야한다.게임에 큰 영향을 끼치는 것들은 프로퍼티 레플리케이션을 사용해야 한다. Call vs InvokeCallInvoke Actor Ownership네트워크 멀티플레이가 적용되려면, 액터는 서버에서 스폰되고 bReplicated가 true여야한다.서버에서 스폰된 후 SetOwner(PlayerController) 함수를 호출해야 Client-Owned Actor가 된다.PlayerController가 Local PlayerController와 같다면, 호출한 클라이언트가 소유한 액터가 되어야 한다.PlayerController가 Local PlayerController와..

언리얼 내배캠 - 언리얼 멀티플레이 기초 NetRole

액터가 서버 PC에 스폰되어있는지, 클라이언트 PC에 스폰되어있는지, 그 액터의 멤버 함수가 서버 PC에서 실행되고 있는지, 클라이언트 PC에서 실행되고 있는지도 파악해야한다.서버에 스폰된 액터가 가진 NetRole 속성값은 언제나 Authority-> 그래서 게임에 중대한 영향을 끼치는 로직은 NetRole이 Authority일 때 수행 NetRole이 Authority인 액터가 클라이언트로 복제되었을 때 복제된 액터의 NetRole 속성값은 Proxy이다. 여기서는 중요한 로직을 수행해서는 안 된다. 로컬 롤과 리모트 롤현재 동작하는 컴퓨터에서의 롤을 로컬 롤(Local Role)이라고 한다.커넥션으로 연결된 컴퓨터에서의 롤을 리모트 롤(Remote Role)이라고 한다. NetRole의 종류None..

언리얼 내배캠 - 언리얼 멀티플레이 기초 NetMode, NetConnection, NetDriver

NetMode해당 게임 프로세스가 네트워크 상에서 어떤 역할을 하고 있는지를 의미싱글(NM_StandAlone), 서버(NM_Listen, NM_DedicatedServer), 클라이언트(NM_Client) NetMode의 필요성작성 중인 로직이 서버에서 도는지 클라이언트에서 돌고 있는지는 알아야할 때멀티플레이 시에 가장 큰 걸림돌은 같은 코드가 여러 PC에서 동작한다는 것디버깅을 할 때 어떤 PC에서 동작중인지를 살펴보아야한다.NetMode는 월드 클래스의 속성값, NetRole은 액터의 속성값이라고 보면 된다. UWorld::InternalGetNetMode() 함수NetDriver가 NULL이 아니면 클라이언트나 서버 중 하나다. GetNetMode에서는 IsServer로 서버 여부를 먼저 판단하고..

언리얼 내배캠 - 언리얼 멀티플레이 기초 실습 환경 설정

플레이모드 메뉴에서 플레이어 수를 2, 넷모드는 클라이언트로 지정해준다. PIE 모드로 실행시키고 채팅을 치면 동기화가 되는 것을 볼 수 있다. 출력 로그는 이러하다.모든 것이 동기화 될 필요는 없다. 위젯 객체같은 경우 Owning Client에서만 생성되면 된다. 로컬 플레이어 컨트롤러가 아니면 위와 같은 에러가 뜨게 된다. Ctrl + T를 눌러 코드를 검색할 수 있다. CXPlayerController.cppIsLocalController() 조건을 걸어주면 정상 처리된다. 채팅을 치면 다른 클라이언트에서 보이는 이유Run Under One Process 속성 때문 데디케이티드 서버 환경 설정에디터 개인설정->레벨 에디터 카테고리의 플레이-> 단일 프로세스 하 실행 체크 해제체크할 경우 체크 ..

언리얼 내배캠 마스터반 - Subsystem 기반으로 아이템 매니저 만들기

총 세 가지의 클래스를 만든다.GameInstanceSubsystem → ItemManagerSubsystemPrimaryDataAsset → ItemDataAsset플레이하고 아이템 장착 할 액터 → ItemManagerTestCharacter #include "Engine/AssetManager.h"DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnItemLoaded, FPrimaryAssetId, AssetId);public: // 서브시스템 초기화 시 호출 virtual void Initialize(FSubsystemCollectionBase& Collection) override; // 아이템 비동기 로드 요청 UFUNCTION(Bluepr..

언리얼 내배캠 마스터반 수업 - Subsystem과 수명 관리

Subsystem이란?내가 직접 만들고 관리하지 않아도 엔진이 알아서 켜고 꺼주는 시스템실행 시점과 수명을 직접 결정할 수 있음 Engine상속받는 원본 클래스태어나는 시점사라지는 시점Editor상속받는 원본 클래스태어나는 시점사라지는 시점 GameInstance상속받는 원본 클래스태어나는 시점사라지는 시점 World(UE5에서 추가)상속받는 원본 클래스태어나는 시점사라지는 시점 LocalPlayer상속받는 원본 클래스태어나는 시점사라지는 시점 서브시스템의 장점통계, UI 관리 기능 등을 별도 파일로 분리해 관리 가능하여 코드가 깔끔해진다.NewObject로 생성하고 가비지 컬렉션을 걱정할 필요없다. 엔진이 생명주기를 책임진다.플러그인을 만들 때 사용자가 따로 설정할 필요없이, 플러그인을 넣기만 하면 서..

언리얼 내배캠 - 언리얼 멀티플레이 기초 채팅 프로젝트 생성

패키징을 하기 위해서는 200GB 넘게 필요하기 때문에 넉넉한 용량(웬만하면 2TB이상)이 필요하다.또한, 경로 문제가 발생할 수 있어서 한 드라이브에 다 설치해주는 것이 좋다. 프로젝트 생성ChatX라는 이름의 프로젝트를 하나 생성한다. 새 레벨을 만든다. 컨텐츠 폴더 안에 프로젝트와 같은 이름의 폴더를 만든다. Ctrl+Shift+S로 저장해줘야만 전체 상황이 저장된다. 맵 & 모드에서 만든 레벨로 레벨을 수정해준다. 새 게임모드 베이스를 만들어준다. 라이브코딩은 꺼준다. cpp파일 include에서 에러가 뜨는 경우는 경로 오류이다.같은 폴더 안에 있는 경우 Game/을 지워주면 된다. Build.cs 파일에 PublicIncludePaths,AddRange(new string[] { "ChatX"..

언리얼 내배캠 마스터반 - 소프트 레퍼런스

C++ 액터를 하나 만든다. 이름은 TestActor소프트 오브젝트 레퍼런스소프트 클래스 레퍼런스비동기, 동기, 데이터 에셋 UPROPERTY(EditAnywhere)ConstructorHelper: ...(하드코딩으로 경로, 위치 넣어줌. 찾으면 반환, 없으면 nullptr)간접 프로퍼티 주소만 들고 있다가 로드 시점을 정해주는 것 블루프린트에서 변수를 생성하면 오브젝트 레퍼런스, 클래스 레퍼런스, 소프트 오브젝트 레퍼런스, 소프트 클래스 오브젝트 레퍼런스가 있다. 소프트 오브젝트 레퍼런스가 뭘까? 일반 레퍼런스는 하드 레퍼런스다. 항상 같이 로드된다.소프트 오브젝트 레퍼런스는 필요할 때만 로드된다.예를 들면 특정 스테이지에서만 나타나는 몬스터, 고해상도 텍스쳐 등이다.소프트 오브젝트 만들기 동기 로드..