在线网站建设工程标准,app 网站 区别,西安全网优化 西安网站推广,椒江住房和城乡建设规划局网站提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、安装 Netcode for GameObjects二、做个小Dome1.NetcodeManageNet2.创建UI3.创建预制体4.代码介绍UI代码随机位置代码总结前言
Netcode for GameObjects 是 … 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录前言一、安装 Netcode for GameObjects二、做个小Dome1.NetcodeManageNet2.创建UI3.创建预制体4.代码介绍UI代码随机位置代码总结前言
Netcode for GameObjects 是 Unity 官方推出的一套用于开发多人网络游戏的框架旨在简化基于 Unity 引擎的多人游戏开发流程。它允许开发者轻松地在多个客户端之间同步游戏对象GameObject的状态、处理网络通信以及管理玩家连接等核心功能尤其适合中小型多人游戏项目。 链接: 官方地址
一、安装 Netcode for GameObjects
打开 Unity 项目建议使用 Unity 2021.3 或更高版本。 进入 Package ManagerWindow → 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_.GetComponentNetworkManager();UnityTransport unityTransport networkManager.GetComponentUnityTransport();//服务器地址填写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 players PlayerObjectif (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./// /summarypublic 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 transforms 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);}}
}
总结
项目源码 链接