unity之NetworkManager应用初级

这篇博客介绍了Unity中的NetworkManager组件在游戏网络同步中的应用,包括位置、动画和数据同步。通过添加NetworkManager组件,实现场景切换、物体生成等功能。文章详细解释了NetworkTransform用于位置同步,NetworkAnimator用于动画同步,以及使用Command和Rpc实现数据同步。还讨论了如何处理客户端和服务器之间的交互,避免不同客户端间错误的同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单学过Socket的人都知道用Socket完成一个完整的游戏非常的困难,但如果只是想简单的完成一个传输,unity已经写好了一个非常实用的东西NetworkManager


对于初学者来说他还有一个很方便的ui和上面那个脚本放在一起就会出现一个效果


这里不做介绍,可以自己尝试,我们先来简单说明一下NMS(NetworkManagerScript)的组件有什么作用。

首先看到DontDestroyOnLoad,我们的脚本是添加在某个东西上的,然而切换场景的时候就会被Destroy掉,选了勾之后运行就会出现一个来防止被摧毁。

然后是officeScene和OnlineScene这其实是提供了一个简单的场景切换功能,office指的是没有建立连接时显示的场景,Online则是连接成功之后的场景,当然你自己做服务器创建主机的时候也算。


然后是SpawnInfo这个名字是真的奇怪,居然叫卵生,我也不是很懂到底是翻译的锅还是unity官方乱来,这里面的player Prefab顾名思义就是生成一个预设体,而且是只在联网状态下生成,所以预设体必须加入一个组件

才可以正常生成。


接下来我们来说说代码页的常规操作,我们以前实用Socket来实现连接的时候非常的麻烦而且还要写异步。

Server代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;

public class NetManagerScript : MonoBehaviour {
    private byte[] buffer = new byte[1024];
    // Use this for initialization
    void Start () {
        //开启异步
        System.Action async= StartServer;
        async.BeginInvoke(CloseAsync,async);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
    //开启服务器
    private void StartServer()
    {

        //打开socket服务端接口,                     ipv4              stream流式传输       Tcp协议               
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //终端:IP+Port(端口)
        IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8888);
        //绑定终端
        server.Bind(endPoint);
        //开启监听
        server.Listen(10);
        //开启异步监听
        server.BeginAccept(AsynvAccept,server);
        //不知道客户端会发送多少数据所以给的大一点
        
    }

    //关闭异步
    void CloseAsync(System.IAsyncResult result)
    {
        //AsyncState指的就是BeginInvoke(CloseAsync,async)的async
        System.Action async = result.AsyncState as System.Action;
        async.EndInvoke(result);
    }
    //异步接受的回调
    //异步接受客户端
    void AsynvAccept(System.IAsyncResult result)
    {
        //获取服务器对象和客户端对象
        Socket server = result.AsyncState as Socket;
        Socket client = server.EndAccept(result);
        //再次开启异步
        server.BeginAccept(AsynvAccept, server);
        
        //获取长度
        //异步接受信息
        client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None, AsyncReceive, client);
        
        string msg = System.Text.Encoding.UTF8.GetString(buffer);
        Debug.Log("server ok");
    }

    //异步接受客户端信息
    void AsyncReceive(System.IAsyncResult result)
    {
        Socket clien
### Unity 中 `NetworkManager` 的使用教程 #### 初始化与设置 为了初始化和配置 `NetworkManager` 组件,在脚本中引入必要的命名空间,并创建一个公共变量来引用该组件实例。这允许开发者轻松访问其属性和方法。 ```csharp using UnityEngine; using UnityEngine.Networking; public class NetworkGameController : MonoBehaviour { public NetworkManager networkManager; // 引用NetworkManager组件 void Start() { networkManager.networkAddress = "localhost"; // 设置服务器地址 networkManager.StartHost(); // 启动网络作为主机 } } ``` 这段代码展示了如何在场景加载时自动连接到本地运行的服务端[^1]。 #### 常见问题及其解决方案 ##### 无法建立连接 如果遇到客户端尝试加入房间失败的情况,可能是因为服务端未正确启动或是防火墙阻止了通信。确认服务端已成功调用了 `StartServer()` 或者 `StartHost()` 方法,并且确保所使用的端口号没有被其他程序占用或受到安全软件拦截。 ##### 断线重连机制 对于希望实现断线后能够重新接入同一局域网内正在进行的游戏会话的应用来说,可以利用 `OnClientDisconnect` 和 `OnServerDisconnected` 这两个事件处理函数来进行相应的逻辑编写。当检测到玩家掉线时记录下当前状态信息以便后续恢复;而一旦发现有新设备试图再次登录,则依据之前保存的数据完成同步操作。 ##### 数据传输效率低下 针对数据包频繁发送造成带宽浪费的问题,可以通过调整 `NetworkIdentity` 上的 `sendInterval` 参数减少不必要的更新频率,或者采用自定义的消息类型仅传递必需的信息字段以降低负载量。此外,合理规划对象销毁时机也有助于减轻服务器压力并提高整体响应速度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值