Unity

FishNet 사용법

우대비 2025. 5. 20. 20:44
반응형
FishNet 멀티플레이어 네트워킹 가이드

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