유니티 내장 솔루션
네트워크 오브젝트는 Network Identity를 붙여야한다.
using UnityEngine.Networking;
: NetworkBehaviour {
로 네트워크 코드 작성 시작
로컬, 리모트로 처리
Input처리를 리모트일 경우 제어를 막아서 로컬만 제어하게 해야한다. (isLocalPlayer 스태틱 변수로 if 처리 하면 됨.)
Network Transform 컴포넌트 동기화로 리모트의 위치를 동기화 시킬 수 있다.
방장이 네트워크 오브젝트를 뿌려주는 역할을 맡음
Command 키워드는 void Cmd까지 똑같이 써야한다.
클라이언트에서 작동하는 척은 방장에서만 발동이 되는데, 다른 클라이언트에 뿌려줄려면 Network.Spawn(Network Object) 를 사용하면 됨.
예)
[Command]
void Cmd???() {
var a = ~~ Network Object ~~
NetworkServer.Spawn(a);
}
네트워크 상에서 수치를 동기화하는 것은
SyncVar 키워드를 사용해서 가능
네트워크 스크립트 만들어서 지정
[SyncVar]
public int currentHealth = maxHealth;
방장(서버)이 수치 계산을 진행하고 공유하는 식으로해야한다.
isServer로 if문으로 처리
SyncVar 키워드 다음에 (hook="FuncString") 을 붙이면 함수이름을 SyncVar가 변경될 때마다 실행한다.
[SyncVar(hook="OnChangeHealth")]
public int currentHealth = maxHealth;
public void TakeDamage(int amount)
{
if(!isServer) return;
~~ 내용 이런식으로
}
void OnChangeHealth(int health) {
~~ SyncVar 가 변경될 때 마다 실행
}
Play As Host : 플레이어 형태로 참가하는 서버 데디케이티드 서버(Dedicated Server) : 플레이어 형태로 참가하지 않는 서버
Command와 비슷하게 데디케이티드 서버에서 명령을 내려 플레이어 모두에게 작동시키는 것도 있다.
이걸 RPC(Remote Procedure Call) 라고 하고 서버에서 -> 모든클라이언트에게 명령
ClientRpc 키워드
[ClientRpc]
void RpcRespawn() {
if(isLocalPlayer)
{
~~ 로컬플레이어일 경우에만 실행
}
}
네트워크 스크립트에서
OnStartServer() 오버라이드 해서 사용하면
서버에서만 Start 시에 작동할 코드를 입력할 수 있다.
public override void OnStartServer() {
~~ 적 생성 코드같은거
}
OnStartLocalPlayer() 오버라이드 해서 사용하면
로컬 플레이어일 경우에만 Start
public override void OnStartLocalPlayer() {
~~ 주인공 클라이언트 식별하게 하는 코드같은 거
}
네트워크 오브젝트화 하기위해 사용.
Server Only 체크하면 서버상에서만 작동할 오브젝트로 선언
Local Player Authority 체크하면 로컬 플레이어로서의 권한을 줄 때 사용.
Local Player, Remote Player, Network System 관리
시작할 때 소환 가능 Spawn Info> Player Prefab 에 만들어둔 Local Player Prefab을 붙이면 된다.
Round Robin 다른 포지션으로 지정
Registered Spawnable Prefabs는 약속되지 않은 게임오브젝트를 생성하는걸 방지하기위해 미리 세팅해두는 네트워크 오브젝트 리스트
Letwork 관리 UI - 상용 출시에는 빼야함.
스폰 포지션을 나타내는 컴포넌트 빈 오브젝트에 달면 된다.
특정 오브젝트에 붙이면 리모트일 경우 동기화 된 모습을 보여줄 수 있다.
Network Send Rate 높을수록 많이 동기화 0이면 최초 1회만 동기화
RigidBody도 동기화 가능
Movement Threshold 최소 움직임 경계값
Interpolate Movement Factor 보간 값(자연스럽게 해주는 처리)
특정 축만 동기화 가능
블루 프린트로 구현할 수 있다.
LAN이나 2인게임 같은경우 Player Controller 에서 Player Index를 고려야해야 하지만
인터넷 멀티플레이에선 모든 클라이언트가 0이기에 고려할 필요가 없다.
변수 옵션에 보면 리플리케이션이 있는데 서버로 부터 클라이언트에게 정보를 전달하는 역할을 맡게된다.
클라이언트는 변수를 가지고있지만 수정하는 권한은 없고 서버에게 있는 유니티에서 SyncVar 같은 기능
Replicated 기본
RepNotifieds는 변경될 때마다 함수를 생성하는 방식
온라인 세션 노드
Create Session Node 하면 가능
Public Connections 에 Replicated 된 Players의 최대 수 변수를 가져와서 붙이고, Get Player Controller, Use Lan에 Enable Lan 불린 변수 붙인다.
성공 시에 Open Level 같은걸로 로비로 이동시키면 됨.
실패 시에 에러 메시지 띄워주면 됨.
Blueprint Session Result라는 변수 자료형 클래스가 있다.
세션 연결여부를 판단할 때 사용
Join Session Node와 같이 사용한다.
Search Result에 집어넣고 실패 시 메시지 성공 시 디스플레이 작업을 하면 됨.
Blueprint에서 제공하는 에러 처리 이벤트 시스템
- NetworkError Event Node
- Failure Type 어떤 에러인지 체크-> 함수로 ENetwork Failure 자료형으로 입력받으면 됨.
- Is Server 일 경우에는 서버에서 에러가뜬 경우다 이때 따로 처리 가능.
- TravelError Event Node
- Failure Type 어떤 에러인지 체크-> 함수로 ETravel Failure 자료형으로 입력받으면 됨.
Destroy Session Node
DestroySessionCaller Custom Event를 만들어서 PlayerController 입력받아 Destroy Session Node를 붙여준다.
데이터 저장은 Blueprint Class > Save Game BP를 만들어서 리플리케이티드로 저장시키면 된다.
Session 정보는 Blueprint Session Result 라는 자료형 변수를 이용해 저장할 수 있고, 이를 활용해 정보를 뿌릴 수 있다.
Session 찾기는 Find Sessions Node를 사용하면 됨.
- Player Controller에는 Get Owning Player 붙이면 됨.
- Max Results 결과 갯수 제한 할 수 있음. 20개정도 괜찮.
블루프린트로 구현할려면
서버이름은
LAN 으로 할 경우 PC NAME이 서버 명,
인터넷 일 경우 Steam 계정 명, 등등.. 기존의 NAME을 가지고 구현해야한다.
Online Subsystem 문서를 참고하면 도움이 됨.
프로젝트 명 > Config > DefaultEngine.ini 에 스팀관련 API 코드를 입력해야한다.
Steam을 사용하는데 독립형 시뮬레이터(Standalone Game)로 실행해야함. 에디터에서 스팀기능을 쓸 수 없다.
같은 컴퓨터에서 같은 Steam 계정으로는 멀티플레이를 실행할 수 없다.
Dummy Account 테스트용 계정을 만들어서 테스트 해봐도 좋음.
LAN 모드를 이용할려면 아래의 DefaultPlatformService= 의 스팀을 지워주면 됨
[/Script/Engine.GameEngine]
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
이 코드를 입력 후 프로젝트 재실행 Edit > Plugins > Online Platform > Online Subsystem Steam 활성화 해줘야 함.
Custom Event 에 Replicates 리플리게이트 옵션에
Multicast 는 이벤트를 서버에서 다른 곳으로 리플리케이트 시키는 기능.
Run on Server 는 넷 소유 클라이언트에서 서버로 리플리케이트 시키는 기능.
Run on Owning Client 는 이벤트를 서버에서 소유 클라이언트로 리플리케이트 시키는 기능.
체크박스 Reliable 신뢰성을 체크해주는게 좋다. 중요한 이벤트에는
Event End Play 를 사용해서 만약에 연결이 끊기거나하면 Session을 끊어주는 로직도 만들어야한다.
Session 끊는건 Destroy Session Node 로 가능.
추방하거나 다른 장소로 이동시킬려면 끊기전에 Open Level 로 맵을 바꿔주는것도 좋다.
서버인지 체크하는 Is Server Node가 있다.
OnPostLogin Event 는 플레이어가 로그인 후 플레이어 컨트롤러에 등록되면 가장 먼저 발동하는 이벤트
Switch Has Authority 노드는 뒤에 노드 붙이는 것에 따라 서버에서 실행되어 대부분의 권한을 가질지, 원격 클라이언트에서 실행될지 결정해줄 수 있다.
클라이언트를 제외하고 서버에서만 실행될 기능은 이 노드로 분류할 수 있다.
OnLogout 이벤트를 이용하면 로그아웃 시 로비에서 나가거나 하는 컨트롤러를 가지고 처리할 수 있다.