반응형
FishNet 멀티플레이어 네트워킹 가이드
1. FishNet 소개
FishNet은 Unity를 위한 고성능 멀티플레이어 네트워킹 프레임워크입니다. 클라이언트-서버 아키텍처를 기반으로 하며, P2P 네트워킹도 지원합니다.
2. 기본 설정
2.1 필수 컴포넌트
// NetworkManager 프리팹에 필요한 컴포넌트들
- NetworkManager
- ServerManager
- ClientManager
- TransportManager
- SceneManager
2.2 초기 설정
// NetworkManager 설정
1. NetworkManager 프리팹 생성
2. Transport 설정 (기본값: KCP)
3. ServerManager와 ClientManager 포트 설정
4. SceneManager에 네트워크 씬 등록
3. 네트워크 객체 구현
3.1 NetworkBehaviour
using FishNet.Object;
public class NetworkPlayer : NetworkBehaviour
{
// 네트워크 변수 선언
[SyncVar]
private int health = 100;
// 서버에서만 실행되는 메서드
[Server]
private void TakeDamage(int damage)
{
health -= damage;
}
// 클라이언트에서만 실행되는 메서드
[Client]
private void UpdateHealthUI()
{
// UI 업데이트 로직
}
}
3.2 RPC (Remote Procedure Calls)
// 서버 RPC
[ServerRpc]
private void ServerRpcMethod()
{
// 서버에서 실행될 로직
}
// 클라이언트 RPC
[ClientRpc]
private void ClientRpcMethod()
{
// 클라이언트에서 실행될 로직
}
// 관찰자 RPC
[ObserversRpc]
private void ObserversRpcMethod()
{
// 모든 관찰자에게 실행될 로직
}
// 타겟 RPC
[TargetRpc]
private void TargetRpcMethod(NetworkConnection connection)
{
// 특정 클라이언트에게만 실행될 로직
}
참고: RPC 메서드는 반드시 private으로 선언해야 합니다.
4. 네트워크 변수 동기화
4.1 SyncVar
[SyncVar]
private int playerScore;
[SyncVar]
private string playerName;
// 변경 이벤트 처리
[SyncVar(OnChange = nameof(OnHealthChanged))]
private int health;
private void OnHealthChanged(int oldValue, int newValue)
{
// health 값이 변경될 때 실행될 로직
}
4.2 SyncList
[SyncList]
private List playerScores = new List();
// 리스트 변경 이벤트 처리
private void OnPlayerScoresChanged(SyncListOperation op, int index, int oldItem, int newItem)
{
switch (op)
{
case SyncListOperation.Add:
// 아이템 추가
break;
case SyncListOperation.Remove:
// 아이템 제거
break;
case SyncListOperation.Set:
// 아이템 변경
break;
}
}
5. 네트워크 생명주기
public class NetworkPlayer : NetworkBehaviour
{
public override void OnStartNetwork()
{
// 네트워크 시작 시 초기화
}
public override void OnStartServer()
{
// 서버 시작 시 초기화
}
public override void OnStartClient()
{
// 클라이언트 시작 시 초기화
}
public override void OnStopNetwork()
{
// 네트워크 종료 시 정리
}
}
6. 네트워크 객체 생성
// 서버에서 네트워크 객체 생성
[Server]
private void SpawnNetworkObject()
{
GameObject obj = Instantiate(prefab);
ServerManager.Spawn(obj);
}
// 네트워크 객체 제거
[Server]
private void DespawnNetworkObject()
{
ServerManager.Despawn(gameObject);
}
주의사항:
- 네트워크 객체 생성은 반드시 서버에서 수행해야 합니다.
- RPC 메서드는 private으로 선언해야 합니다.
- SyncVar는 기본 타입만 지원합니다. 복잡한 객체는 직렬화가 필요합니다.
7. 네트워크 보안
// 서버 권한 확인
[Server]
private void ServerOnlyMethod()
{
if (!IsServer)
return;
// 서버 로직
}
// 클라이언트 권한 확인
[Client]
private void ClientOnlyMethod()
{
if (!IsClient)
return;
// 클라이언트 로직
}
8. 최적화 팁
- 불필요한 RPC 호출을 최소화합니다.
- SyncVar는 필요한 데이터만 동기화합니다.
- 큰 데이터는 청크로 나누어 전송합니다.
- 네트워크 객체 풀링을 사용하여 성능을 개선합니다.
9. 디버깅
// 네트워크 상태 로깅
Debug.Log($"IsServer: {IsServer}");
Debug.Log($"IsClient: {IsClient}");
Debug.Log($"IsHost: {IsHost}");
Debug.Log($"IsOwner: {IsOwner}");
추가 리소스:
반응형
LIST
'Unity' 카테고리의 다른 글
유니티 생명주기 - 코루틴 (0) | 2025.05.22 |
---|---|
유니티의 생명주기 (0) | 2025.05.21 |
Unity 렌더링 파이프라인 (0) | 2025.05.19 |
유니티 쿼터니언(Quaternion) (1) | 2025.05.16 |
유니티 드로우콜 (0) | 2025.05.14 |