UNREAL/Unreal Study

멀티플레이어 - 미완

GREEN나무 2024. 5. 7. 10:57
728x90

플레이 > 멀티플레이 옵션에서  플레이어 수를 2, 넷 모드를  'Play As Listen Server'로 변경하세요

 

 

실행하면 플레이어 2명이 보입니다. 다른 플레이어를 조종할 수 있는 애디터 창도 함께 뜹니다.

 

 

Server, Client 구분하기

움직이는 액터 코드 참고 : https://ashen99.tistory.com/149 

 

움직이는 액터

MyStaticMeshActor로 c++파일 생성     객체에 티킹(Ticking)할 수 있게 만들기 생성자에서 틱을 설정하므로 'AMoveingPlatform'입니다// MovingPlatform.h#pragma once#include "CoreMinimal.h"#include "Engine/StaticMeshActor.h"#i

ashen99.tistory.com

더보기
void AMovingPlatform::Tick(float DeltaTime)
{
	if (HasAuthority()) // 서버여부확인
	{
		Super::Tick(DeltaTime);
		FVector Location = GetActorLocation(); // Actor의 위치를 FVector 유형 변수에 저장
		Location += FVector(50 * DeltaTime, 0, 0); // Actor의 위치를 초당 X축 방향으로 50cm만큼 이동
		SetActorLocation(Location); // 위치 업데이트
	}

}


HasAuthority : Tick뿐만이 아니라 Actor 어느 곳에나 있을 수 있는 메소드; 자신이 서버인지 여부 반환

서버인 플레이어의 창에서만 Actor가 이동합니다.

https://youtu.be/grv_NzFheAI

 

 

클라이언트에서는 Actor가 제자리에 머물러 있는 것으로 보이지만 실제로 는 이동한 상태여서 서버에서 이동한 위치에서만 물체가 있는것으로 작용한다.(= 플레이어가 Actor위에 올라갈 수 없고 플레이어가 Actor를 관통할 수 있습니다.)

 

실제로 서버에서만 이동하지만 클라이언트에 서버에서 이동하는 Actor의 레플리케이트를 보여주기

//.h 

#pragma once

#include "CoreMinimal.h"
#include "Engine/StaticMeshActor.h"
#include "MovingPlatform.generated.h"

UCLASS()
class UDEMY_CPPMULTIPLAY1_API AMovingPlatform : public AStaticMeshActor
{
	GENERATED_BODY()
	
public:
	AMovingPlatform();

	virtual void BeginPlay() override; // Tick 위에 적기
	virtual void Tick(float DeltaTime) override;

	UPROPERTY(EditAnywhere)// 코드말고 앤진에서도 속도 설정 가능
	float Speed = 100;
};

 

//.cpp

#include "MovingPlatform.h"

AMovingPlatform::AMovingPlatform()
{
	PrimaryActorTick.bCanEverTick = true;

	SetMobility(EComponentMobility::Movable); 
}

void AMovingPlatform::BeginPlay()
{
	Super::BeginPlay();

	if (HasAuthority()) {
		SetReplicates(true);
		SetReplicateMovement(true);
	}
}

void AMovingPlatform::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	if (HasAuthority())
	{
		FVector Location = GetActorLocation();
		Location += FVector(Speed * DeltaTime, 0, 0); 
		SetActorLocation(Location); // 위치 업데이트
	}

}

 

 

https://youtu.be/2NhYxI-cGag