메모내용
Nav

언리얼엔진 네트워크 멀티플레이 프레임워크

접속소유권

통신을 하려면 접속소유권을 가져야 하고 이를 위해서는 PlayerController 에 소속되어 NetConnection 을 이용해야 한다.

현재 내 App에는 수많은 액터가 있다. 이중에는 내것이 아닌 다른 사람의 Actor 도 존재한다. 내 App 에 있다고 해서 모두다 제어할 수 있는것은 아니다. 상식적으로 내 소유가 아닌 다른사람의 Actor 를 제어하는것은 룰 위반이다. 이에 내가 소유한 Actor 만 제어할 수 있게 해야 한다. 이를 위한 개념이 접속소유권 이다. 내 제어권의 상징은 PlayerController 이므로 내 제어권에 들어왔다는 이야기는, 나의 PlayerController 의 제어를 받는지 즉 해당 Object 의 Owner 가 나의 PlayerController 인지 체크해야 하는 것이다. 즉, 해당 Object 의 Owner 가 PlayerController 인지 확인한다면, 내가 제어할 수 있는 권한이 있다는 이야기고 즉 서버와 통신하여, 내 Object 를 변경해 달라고 요청할 수 있다. 서버와 데이터를 송수신하여 업데이트 요청 할 수 있다.

접속소유권을 확인하는 방법? 해당 Actor 의 가장 Outer 를 조사하여, 그 Owner 가 PlayerController 인 경우 그 Actor 는 PlayerController 의 소유 이다. 어떤 액터가 통신을 하기 위해서는, 자신을 소유한 액터가 NetConnection 을 소유해야 하며, 보통 PlayerController 가 NetConnection 을 소유하며, NetConnection 또한 PlayerController 를 소유하고 있다. Owner 값이 설정되어 있지 않으면, NetConnection 을 구하지 못한다. 즉 통신이 진행되지 못하게끔 설계되어 있다.

                        
UNetConnection* AActor::GetNetConnection() const
{
    return Owner ? Owner->GetNetConnection() : nullptr;
}

UNetConnection* APlayerController::GetNetConnection() const
{
    // A controller without a player has no "owner"
	return (Player != NULL) ? NetConnection : NULL;
}

UNetConnection* APawn::GetNetConnection()
{
	// if have a controller, it has the net connection
	if ( Controller )
	{
		return Controller->GetNetConnection();
	}
	return Super::GetNetConnection();
}