unity做多人联网游戏,用Network Manager组件,offlineu3d scenemanager和Onlineu3d scenemanager中场景拖不进去,为什么?

Unity5.1 新的网络引擎UNET(三) UNET NetworkManager
我们先来看看这第一个大类的 定义:直接继承自& ,& 还有就是被设计成了单例& singleton NetworkManager 网络管理器是一个方便的HLAPI 类,用于管理网络系统 。&&&&&&& 对于简单的网络应用NetworkManager 网络管理器可以使用HLAPI控制 。它提供了简单的方法来& 启动和停止& 客户端和服务器,以及 管理场景,而且具有虚拟函数,用户代码可以使用 实现 网络事件的处理程序。NetworkManager 网络管理器一次处理一个客户端。下面的示例演示一个最小的网络设置。using UnityEngine.N
public class Manager : NetworkManager {
public override void OnServerConnect(NetworkConnection conn)
Debug.Log (&OnPlayerConnected&);
}NetworkManager 网络管理器是 管理网络状态的多人游戏的一个组成部分。它实际上被实现完全使用 HLAPI,所以它做的一切都是可被其他forms的开发人员使用的。然而网络管理器包装了很多有用的功能,使得创建、 运行和调试尽可能简单的多人游戏。网络管理器可以使用完全不用脚本。它有在编辑器中有 inspector 控件,允许配置其所有功能,和 NetworkManagerHUD 提供简单、默认的用户界面,可以在运行时允许被用户控制的网络游戏。为高级的使用,开发人员可以从网络管理器派生出类 并通过重写虚函数,为它提供的任何自定义其行为。网络管理器的功能包括:o Game State Managemento Spawning Managemento Scene Managemento Debugging Informationo Matchmaking 匹配系统o Customization 可定制入门 NetworkManager网络管理器可以作为控制组件的多人游戏的核心。若要开始,在你开始的场景,创建一个空的游戏对象或挑选一个方便管理器对象。从Network/NetworkManager菜单项,然后添加NetworkManager组件。新添加的NetworkManager应如所示:在编辑器中的NetworkManager的的inspector 面板上 允许您配置和控制与网络相关的很多东西。NetworkManagerHUD 是与NetworkManager相关的的另一个组件。游戏运行控制网络状态时,它给你一个简单的用户界面。这是很好的入门知识网络项目,但不能用作游戏最终的 ui 设计。NetworkManagerHUD 看起来像: &真正的游戏会有正确的UI ,用于控制游戏状态 和 允许玩家选择什么样的游戏 。但是,若要开始,我们可以暂时以此来控制游戏。Game State Management作为客户端,作为一个专用的服务器,或作为 “Host” 是客户端和服务器在同一时间具备 ,UNet 多人游戏可以在三种模式下-运行。UNet 旨在使相同的游戏 代码和资产 在所有这些情况下工作。发展为& 单人游戏版本游戏和& 多人游戏版本游戏& 应该是同一件事。网络管理器& 具有用于输入每一种模式的方法。NetworkManager.StartClient()、 NetworkManager.StartServer() 和 NetworkManager.StartHost()& 是所有可用的脚本代码,所以它们可以被调用,从键盘输入的处理程序或自定义UI 事件 。可以选择要显示的默认运行时控件也调用这些相同的功能。也有按钮在 NetworkManagerHUD 的 inspector上,在Play 模式时调用同一函数:无论哪种方法用来 改变游戏状态、 networkAddress网络地址和&networkPort网络端口 属性被 使用。当启动时后的服务器 或主机 时,networkPort 成为& 侦听端口。当客户端启动时,networkAddress是要连接到的地址、networkPort 是要连接到的端口。Spawning Management网络管理器可以用于管理网络对象从预置的实例化 。大多数游戏都有 prefab 用作player 的对象,因此网络管理器有一个 槽(字段),拖动player prefab进行赋值。当一个player prefab 设置时,player 对象会自动产生从该prefab, 为每个用户在游戏中创建。这适用于在本地player托管hosted服务器上,和远程客户端上的远程players 参与者。请注意player prefab 必须有 NetworkIdentity 组件。除了player prefab,其他对象的预置将动态地被生成了但是必须是ClientScene登 记的。这可以通过使用 ClientScene.RegisterPrefab() 函数,或者它可以由网络管理器自动完成。添加 预置生成列表 会使他们自动注册。NetworkManager的 inspector 的字段 配置看起来像:一旦设置了一个player prefab ,你应该能够作为主机开始游戏,看到 player 对象产生。停止这场比赛应该使player 对象被销毁。当要运行另一个副本的游戏和 连接到本地主机的客户端应使另一个player 对象出现,并停止该客户端应该使该客户端player 对象被销毁。&player object 被被生成是由& NetworkManager.OnServerAddPlayer 默认实现。 如果你想自定义&player object 的创建的方式,你可以重写的虚函数。默认实现是类似:public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
}请注意,新创建player object.时NetworkServer.AddPlayerForConnection() 必须被调用函数,所以它是被生成和与客户端的连接相关联。这将产生的对象,所以 NetworkServer.Spawn 不需要为 player object.Start Positions若要控制players 被创建,在这里,你可以使用 NetworkStartPosition 组件。网络管理器查找场景中的 NetworkStartPosition 对象,如果它找到了,然后它将产生Player的位置和方向 。自定义代码可以通过NetworkManager.startPositions列表 ,访问可用的 NetworkStartPositions,也是一个 helper 函数 GetStartPosition() 对网络管理器,可以在执行 OnServerAddPlayer 用于查找起始位置。Scene Management大多数游戏都有多个场景。在至少有通常是标题屏幕 或 开始菜单场景 还有玩这个游戏的场景。网络管理器是设置来自动管理场景状态 和 场景切换 适合多人游戏的方式。网络管理器的属性面板 有两个插槽: offlineScene 和 onlineScene。将 场景对象拖放到这些插槽 激活网络场景管理。服务器或主机启动时,将加载online在线的场景。这将会成为当前的网络场景。连接到该服务器的任何客户端将奉命加载这个场景。这个场景的名称存储在 networkSceneName 属性中。当网络停止时,通过停止的服务器或主机,或断开连接,客户端将加载offline脱机的场景。断开多人游戏时游戏允许自动返回到菜单场景 。通过调用 NetworkManager.ServerChangeScene(),游戏处于活动状态时,还可以更改场景。这将使所有当前连接的客户端更改场景,并将更新 networkSceneName,新客户还将加载新的场景。虽然网络的场景管理处于活动状态,调用任何游戏状态管理功能 NetworkManager.StartHost() 或 NetworkManager.StopClient() 可导致场景变化。这适用于运行时控制 UI。所以通过设置场景 并调用这些函数很容易控制流的多人游戏。注意,场景变化导致的所有对象在场景将被销毁。这可能包括网络管理器!& 如果你想要网络管理器在转换是不被销毁,那就确保 “Dont Destroy On Load” 属性被设置为 true。在简单的情况下,这是最佳配置。但是,它是可能有网络管理器在每个使用不同的设置,以控制增量的预制加载或不同的场景切换的场景。Debugging InformationNetworkManagerHUD 属性面板在运行时显示有关网络状态的其他信息。这包括:o 网络连接o&激活 NetworkIdentity 服务器对象o&激活 NetworkIdentity 客户端对象o client peers另外,预览 窗口中显示所注册的客户端消息处理程序。Matchmaking匹配系统网络管理器在运行时 用户界面和网络管理 inspector& UI 允许与匹配服务的交互。NetworkManager.StartMatchmaker() 函数作为匹配接口,并填充具有一个 NetworkMatch 对象的 NetworkManager.matchmaker 属性。一旦这是激活的默认 Ui 使用它和 回调函数对网络管理器让您执行简单配对。有虚拟派生类的网络管理器的函数 可以使用自定义的 respoding 给matchmaker回调的行为。Customization自定义网络管理器的派生类上的虚拟函数可以使用自定义行为。当执行这些职能时,一定要照顾的默认实现提供的功能。 例如,在 OnServerAddPlayer(),NetworkServer.AddPlayer 函数必须调用到激活的Player对象连接。在Server/Host上调用的函数:// called when a client connects
public virtual void OnServerConnect(NetworkConnection conn);
// called when a client disconnects
public virtual void OnServerDisconnect(NetworkConnection conn)
NetworkServer.DestroyPlayersForConnection(conn);
// called when a client is ready
public virtual void OnServerReady(NetworkConnection conn)
NetworkServer.SetClientReady(conn);
// called when a new player is added for a client
public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayer(conn, player, playerControllerId);
// called when a player is removed for a client
public virtual void OnServerRemovePlayer(NetworkConnection conn, short playerControllerId)
if (conn.GetPlayer(playerControllerId, out player))
if (player.NetworkIdentity != null && player.NetworkIdentity.gameObject != null)
NetworkServer.Destroy(player.NetworkIdentity.gameObject);
// called when a network error occurs
public virtual void OnServerError(NetworkConnection conn, int errorCode);
在客户端调用的函数 :// called when connected to a server
public virtual void OnClientConnect(NetworkConnection conn)
ClientScene.Ready(conn);
ClientScene.AddPlayer(0);
// called when disconnected from a server
public virtual void OnClientDisconnect(NetworkConnection conn)
StopClient();
// called when a network error occurs
public virtual void OnClientError(NetworkConnection conn, int errorCode);
// called when told to be not-ready by a server
public virtual void OnClientNotReady(NetworkConnection conn);
匹配时调用的函数:// called when a match is created
public virtual void OnMatchCreate(CreateMatchResponse matchInfo)
// called when a list of matches is received
public virtual void OnMatchList(ListMatchResponse matchList)
// called when a match is joined
public void OnMatchJoined(JoinMatchResponse matchInfo)inspector
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?Unity官网多人联网游戏入门教程译文(Multiplayer&Networking)&二_丑图_新浪博客
Unity官网多人联网游戏入门教程译文(Multiplayer&Networking)&二
3.&创建玩家预制件
默认状态下,NetworkManager组件会为每一个连接到网络的玩家创建游戏物体,通过克隆玩家与之间然后将克隆体派生到游戏中。网络派生与玩家游戏物体在客户端上的同步将会在后续讨论。
此案例中,玩家游戏物体是一个简单的胶囊体,配置一个“护目镜”,以标明胶囊体的朝向。最终的玩家游戏物体如下图:​
创建玩家游戏物体:
&1.&创建一个新的胶囊体。
&2.&重命名为“Player”.
&3.&在Player游戏物体上添加一个小立方体为其子物体并设为黑色。
&4.&选中Player游戏物体。
&5.&添加一个小立方体为其子物体。
&6.&将新的小立方体重命名为“Visor”。
&7.&设置Visor的Scale为(0.95,
0.25,0.5)。
&8.&设置Visor的Position为(0.0,
0.5,0.24)。
&9.&创建一个新的材质,命名为“Black”。
&10.&选中材质,将其Albedo的颜色改成黑色。
&11.&设置Visor的材质为Black材质。
为了标识出Player是一个网络状态下的游戏物体,将其添加NetworkIdentity组件:
&12.&选中Player。
&13.&添加组件Network&&
NetworkIdentity。
NetworkIdentity用于辨别物体是否在网络状态下,并且通知网络系统。关于NetworkIdentity更多细节详见:/Manual/class-NetworkIdentity.html?_ga=1.9508192
&14.&勾选NetworkIdentity组件中的LocalPlayer
Authority。
让客户端能够控制这个游戏物体的动作。
用Player创建玩家预制件:
&15.&将Player拖入工程窗口,这样就创建了一个预制件。
&16.&在场景中删除Player,保存场景。
关于玩家游戏物体(player
GameObjects)更多细节详见:/Manual/UNetPlayers.html?_ga=1.9508192
4.&注册玩家预制件
创建玩家预制件之后,必须在网络系统中完成注册工作,Network
Manager会用预制件往场景中派生玩家游戏物体。
&1.&在Hierarchy窗口选中NetworkManager游戏物体。
&2.&在检视面板中打开NetworkManager组件中的SpawnInfo折页。
&3.&将Player预制件拖入PlayerPrefab。
NetworkManager组件用于管理联网游戏物体的派生,包括玩家物体。大部分游戏都有独立的预制件来代表所有玩家,NetworkManager为每一个玩家预制件都安排了位置。每个玩家客户端加入主机的时候都会创建新的游戏物体来代表玩家。关于NetworkManager更多细节详见:/Manual/UNetManager.html?_ga=1.9508192
博客等级:
博客积分:0
博客访问:2,057
关注人气:0
荣誉徽章:[Unet] NetworkLobbyManager 从LobbyScene 加载到PlayeScene_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,017贴子:
[Unet] NetworkLobbyManager 从LobbyScene 加载到PlayeScene收藏
利用Unet自带的NetworkLobbyManager组件从 LObbyscene到 PlayerScene时,客户端会掉线以及卡顿的问题该如何解决?? 我个人认为是
PlayerScene 场景资源太大,加载不易。同时也是 UNet的实现原理是基于 UDP协议的!!!
unity3d模型上京东,优质有保障,炫酷玩新任你High选,精选大牌等你来点,超值选&购&中!unity3d模型-上京东购玩具乐器,全套产品线服务,多仓直达送货快!购得省心又放心!
或者大家又关于unet的基本问题也可以问我
我描述下我的基本情况: 因为 unet自带的networkLobbymanager 的UI比较low,然后自己就修改了 unity Asstor 中的
NetworkLobby 插件的示例,经过简单测试,是完全可行的, 但是随着后期主场景(也就是 NetworkLobbyManager中的 Play scene)的资源变得越来越多,大厅加载时,就会耗时很多,然后客户端还容易掉线!!!求解,
我来总结下我的问题:利用 NetworkLobbyManager进行联网是测试时是没有问题的,现在的情况是主场景资源变多,导致无法加载成功!!求解决方法,或者分析其成因也可以!!
楼主这个问题解决了没有,我也遇到这个问题,考虑能不能再两个场景切换时,加个进度条
是基于Unet开发的弱联网,存在的情况是断网的情况,精度条无法解决,我后来的解决方案是通过优化主场景 的资源,然后再需要的时候通过AssetBundle动态加载来解决的。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或关于UNET的一些自学的记录_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,017贴子:
关于UNET的一些自学的记录收藏
直接就上我博客的地址吧,更新了蛮多的就发出来的,嗯大牛不算,勉强能教教初学者一些东西吧。最近在想要不要出视频教程的,如果有人需要我就出吧。
unity3d模型上京东,优质有保障,炫酷玩新任你High选,精选大牌等你来点,超值选&购&中!unity3d模型-上京东购玩具乐器,全套产品线服务,多仓直达送货快!购得省心又放心!
不要光讲局域网 讲讲不同局域网通过中转服务器互联p2p
出啊 我一直在看 那个广东孙xx出的全英文的
天天都得自己顶- -
还剩最后两个部分就更完了!今天把倒二的那个更了!
666 顶顶顶 收藏了
野狗实时数据同步SDK+API,帮你解决游戏开发中的游戏数据实时同步,玩家实时沟通问题,优化弱网络下的游戏体验,同时提供安全的身份认证.简单易用,注册即可免费体验.
顶,大哥,最近开发项目遇到一个难题,现在在host和client都只能用相同的PlayerPrefab,我要怎样才在不同的client生成不同的PlayerPrefab啊
public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId){
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);}
public class NetworkManager_Custom : NetworkManager {public GameObject[] playerPpublic override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId){GameObject playerPre = playerPrefabs[Random.Range(0, 2)];GameObject player = (GameObject)Instantiate(playerPre, playerPre.transform.position, Quaternion.identity);NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);}}哥们,我用这样的办法暂时可以更改预制了,但操蛋的是在host下都能正常显示预制体,在client下预制都不显示了,啥情况啊。/(ㄒoㄒ)/~~
我用networklobbymanager连接客户端的时候显示ClientScene::AddPlayer: playerControllerId of 0 already in use.UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()不知道楼主有没有遇到这种情况
楼主威武,全英文的视频看着心慌。谢谢楼主的解释!
不错哦 正要学这个
有博客就可以了,不用视频
这都不顶楼主天理难容啊
视频要有的啊
挺好,结合视频一起,学习学习
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 network组件 的文章

 

随机推荐