提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、安裝 Netcode for GameObjects
- 二、做個小Dome
- 1.NetcodeManageNet
- 2.創建UI
- 3.創建預制體
- 4.代碼介紹
- UI代碼
- 隨機位置代碼
- 總結
前言
Netcode for GameObjects 是 Unity 官方推出的一套用于開發多人網絡游戲的框架,旨在簡化基于 Unity 引擎的多人游戲開發流程。它允許開發者輕松地在多個客戶端之間同步游戲對象(GameObject)的狀態、處理網絡通信以及管理玩家連接等核心功能,尤其適合中小型多人游戲項目。
鏈接: 官方地址
一、安裝 Netcode for GameObjects
打開 Unity 項目(建議使用 Unity 2021.3 或更高版本)。
進入 Package Manager(Window → Package Manager)。
點擊左上角 “+” 圖標 → Add package by name…
輸入包名 com.unity.netcode.gameobjects 并安裝(確保勾選 “Enable Preview Packages” 以獲取最新版本)。
直接搜索下載也可以。
二、做個小Dome
doem的內容就是:一個客戶端隨機移動圓球位置,其他客戶端會同步顯示變化。
1.NetcodeManageNet
創建一個場景,在場景創建一個空物體掛載NetcodeManage組件,并選擇UnityTransport,選擇后會自動掛載UnityTransport腳本
2.創建UI
創建4個按鈕:,一個text和InputField 。并掛載腳本,如下圖
3.創建預制體
創建一個圓球,掛載NetwrokObject和NetworkTransform
NetworkTransform 的pocition Rotation Scale全部勾選(多人同步:位置、旋轉、大小)
NetworkManage 添加這個預制件,如下圖
4.代碼介紹
UI代碼
using System.Net;
using System.Net.NetworkInformation;
using Unity.Netcode;
using Unity.Netcode.Samples;
using Unity.Netcode.Transports.UTP;
using UnityEngine;
using UnityEngine.UI;
namespace Twq
{public class UI_Init : MonoBehaviour{public Transform NetworkManager_;public Text text_IP;public Button HostBtn;public Button ServerBtn;public InputField inputField;public Button ClientBtn;public GameObject obj01;public GameObject obj02;public Button RandomBtn;private void Awake(){text_IP.text = GetIP();var networkManager = NetworkManager_.GetComponent<NetworkManager>();UnityTransport unityTransport = networkManager.GetComponent<UnityTransport>();//服務器地址填寫:0.0.0.0 本地可連接,外網也可鏈接(放在云服務器上才行)//其他客戶端連接時 輸入 服務器IP 即可HostBtn.onClick.AddListener(() => {unityTransport.SetConnectionData("0.0.0.0", 7777);networkManager.StartHost();obj01.SetActive(false);obj02.SetActive(true);});ServerBtn.onClick.AddListener(() => {unityTransport.SetConnectionData("0.0.0.0", 7777);networkManager.StartServer();obj01.SetActive(false);});ClientBtn.onClick.AddListener(() => {if (inputField.text != null && inputField.text != ""){unityTransport.SetConnectionData(inputField.text, 7777);networkManager.StartClient();obj01.SetActive(false);obj02.SetActive(true);}else{Debug.Log("請輸入服務器的IP");}});RandomBtn.onClick.AddListener(() => {if (!networkManager.IsClient){Debug.Log("沒有 連上");}if (networkManager.LocalClient != null){// Get `BootstrapPlayer` component from the player's `PlayerObject`if (networkManager.LocalClient.PlayerObject.TryGetComponent(out BootstrapPlayer bootstrapPlayer)){// Invoke a `ServerRpc` from client-side to teleport player to a random position on the server-sidebootstrapPlayer.RandomTeleportServerRpc();}}});}private string GetIP(){string ipv4 = "";foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()){NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211;NetworkInterfaceType _type2 = NetworkInterfaceType.Ethernet;if (item.NetworkInterfaceType == _type1 || item.NetworkInterfaceType == _type2 && item.OperationalStatus == OperationalStatus.Up){foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses){if (ip.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork){ipv4 = ip.Address.ToString();}}}}return ipv4;}}
}
隨機位置代碼
using UnityEngine;namespace Unity.Netcode.Samples
{/// <summary>/// Component attached to the "Player Prefab" on the `NetworkManager`./// </summary>public class BootstrapPlayer : NetworkBehaviour{/// <summary>/// If this method is invoked on the client instance of this player, it will invoke a `ServerRpc` on the server-side./// If this method is invoked on the server instance of this player, it will teleport player to a random position./// </summary>/// <remarks>/// Since a `NetworkTransform` component is attached to this player, and the authority on that component is set to "Server",/// this transform's position modification can only be performed on the server, where it will then be replicated down to all clients through `NetworkTransform`./// </remarks>[ServerRpc]public void RandomTeleportServerRpc(){var oldPosition = transform.position;transform.position = GetRandomPositionOnXYPlane();var newPosition = transform.position;print($"{nameof(RandomTeleportServerRpc)}() -> {nameof(OwnerClientId)}: {OwnerClientId} --- {nameof(oldPosition)}: {oldPosition} --- {nameof(newPosition)}: {newPosition}");}private static Vector3 GetRandomPositionOnXYPlane(){return new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), 0f);}}
}
總結
項目源碼: 鏈接