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