Unity Networking

유니티 네트워킹 (Unity Networking)

소개(Introduction):
유니티의 네트워킹 기능은 멀티플레이어 게임 개발을 가능하게 합니다. 이를 통해 서로 다른 플레이어가 동일한 게임 환경에서 상호작용할 수 있습니다. 유니티는 여러 네트워킹 솔루션을 제공하며, 가장 대표적인 것은 유니티의 내장 네트워킹 기능과 Unity Multiplayer Networking (Netcode for GameObjects)입니다.

기본 개념(Basic Concepts):
유니티의 네트워킹은 클라이언트-서버 모델을 기반으로 합니다. 서버는 게임의 상태를 관리하고, 클라이언트는 플레이어의 입력을 서버에 전달합니다. 유니티 네트워킹에서는 네트워크 매니저(Network Manager), 네트워크 뷰(Network View), 네트워크 아이덴티티(Network Identity) 등의 주요 컴포넌트를 사용합니다.

네트워크 매니저(Network Manager):
네트워크 매니저는 네트워크 게임을 관리하는 중심 역할을 합니다. 호스트(Host), 서버(Server), 클라이언트(Client)의 설정과 관리를 담당합니다.

using UnityEngine;
using UnityEngine.Networking;

public class NetworkManagerExample : NetworkManager {
    public void StartHost() {
        StartHost();
        Debug.Log("호스트 시작됨");
    }

    public void StartClient() {
        StartClient();
        Debug.Log("클라이언트 시작됨");
    }

    public override void OnServerConnect(NetworkConnection conn) {
        Debug.Log("클라이언트 연결됨: " + conn);
    }
}

네트워크 아이덴티티(Network Identity):
네트워크 아이덴티티는 네트워크 상의 오브젝트를 식별하는 데 사용됩니다. 이 컴포넌트는 네트워크에서 유일한 ID를 부여받으며, 네트워크 상에서 동기화됩니다.

using UnityEngine;
using UnityEngine.Networking;

public class NetworkIdentityExample : NetworkBehaviour {
    void Start() {
        if (isLocalPlayer) {
            Debug.Log("로컬 플레이어");
        }
    }
}

네트워크 트랜스폼(Network Transform):
네트워크 트랜스폼은 게임 오브젝트의 위치, 회전, 크기를 네트워크 상에서 동기화하는 데 사용됩니다. 이를 통해 모든 클라이언트에서 동일한 오브젝트 상태를 유지할 수 있습니다.

using UnityEngine;
using UnityEngine.Networking;

public class NetworkTransformExample : NetworkBehaviour {
    void Update() {
        if (!isLocalPlayer) {
            return;
        }

        float move = Input.GetAxis("Vertical") * Time.deltaTime * 3.0f;
        float turn = Input.GetAxis("Horizontal") * Time.deltaTime * 150.0f;

        transform.Translate(0, 0, move);
        transform.Rotate(0, turn, 0);
    }
}

명령(Command) 및 RPC(Remote Procedure Call):
명령은 클라이언트에서 서버로 실행을 요청하는 메서드이고, RPC는 서버에서 클라이언트로 호출하는 메서드입니다. 이를 통해 네트워크 상의 오브젝트 상태를 제어할 수 있습니다.

using UnityEngine;
using UnityEngine.Networking;

public class CommandAndRPCExample : NetworkBehaviour {
    void Update() {
        if (isLocalPlayer && Input.GetKeyDown(KeyCode.Space)) {
            CmdDoSomething();
        }
    }

    [Command]
    void CmdDoSomething() {
        Debug.Log("서버에서 실행됨");
        RpcDoSomething();
    }

    [ClientRpc]
    void RpcDoSomething() {
        Debug.Log("모든 클라이언트에서 실행됨");
    }
}

네트워크 초기화(Network Initialization):
게임 시작 시 네트워크 초기화를 통해 서버와 클라이언트를 설정합니다. 네트워크 매니저를 통해 호스트와 클라이언트를 시작할 수 있으며, 클라이언트는 서버의 IP 주소를 통해 연결합니다.

using UnityEngine;
using UnityEngine.Networking;

public class NetworkInitializationExample : MonoBehaviour {
    public NetworkManager networkManager;

    void Start() {
        networkManager.StartHost();
    }

    public void StartClient() {
        networkManager.networkAddress = "127.0.0.1";
        networkManager.StartClient();
    }
}

네트워크 씬 관리(Network Scene Management):
네트워크 씬 관리는 네트워크 상의 씬 전환을 관리합니다. 서버에서 씬을 로드하면 모든 클라이언트는 동일한 씬을 로드하게 됩니다.

using UnityEngine;
using UnityEngine.Networking;

public class NetworkSceneManagementExample : NetworkManager {
    public override void OnServerSceneChanged(string sceneName) {
        base.OnServerSceneChanged(sceneName);
        Debug.Log("서버 씬 변경됨: " + sceneName);
    }

    public void ChangeScene() {
        ServerChangeScene("NewScene");
    }
}

네트워크 객체 스포닝(Network Object Spawning):
네트워크 상에서 오브젝트를 스폰하고 동기화하는 기능을 제공합니다. 서버에서 오브젝트를 스폰하면 모든 클라이언트에서 동일한 오브젝트가 생성됩니다.

using UnityEngine;
using UnityEngine.Networking;

public class NetworkObjectSpawningExample : NetworkBehaviour {
    public GameObject objectPrefab;

    void Update() {
        if (isLocalPlayer && Input.GetKeyDown(KeyCode.S)) {
            CmdSpawnObject();
        }
    }

    [Command]
    void CmdSpawnObject() {
        GameObject obj = Instantiate(objectPrefab, transform.position, Quaternion.identity);
        NetworkServer.Spawn(obj);
    }
}

유니티의 네트워킹 기능은 멀티플레이어 게임 개발에 필요한 다양한 도구와 기능을 제공합니다. 이를 통해 다양한 네트워크 상호작용을 구현하고, 안정적인 멀티플레이어 게임 환경을 구축할 수 있습니다. 네트워킹의 기본 개념과 기능을 이해하고, 각 기능을 적절히 활용하여 보다 현실감 있고 반응성 있는 게임을 개발해 보세요.

Leave a Reply

Your email address will not be published. Required fields are marked *