UNet系统初次使用——联网Boxing游戏(2)

来源:互联网 发布:java对象锁和类锁 编辑:程序博客网 时间:2024/05/18 19:46

UNet系统初次使用——联网Boxing游戏(1)

场景和人物模型搭建完毕后,就正式开始搭建网络环境。对于Unet的相关知识网上有很多介绍,在此不多说,列出几个博客可以参考学习。
http://blog.csdn.net/u010019717/article/details/46849341
http://www.cnblogs.com/zhouxin/p/5820161.html

三、 NetworkManager

NetworkManager可以说是整个Unet的核心组件。所有的客户端和服务器,都是通过NetworkManager进行通信。当我们使用Unet制作联网游戏的时候,最先就是给一个对象挂上NetworkManager组件。
(1)
这里是我的NetworkManager组件的参数
这里写图片描述
基本使用默认的就好
其中Player Prefab是客户端在连入服务器时自动生成的prefab
而Registered Spawnable Prefabs 是在NetworkManager上注册的prefab。
如果是没有注册的prefab则不能在服务器上生成后同步到各个客户端。
(2)
NetworkManagerHUD是一个跟NeworkManager同步使用的组件。
在play模式下会自动生成一个这样的gui,可以简便低开启server或者client或者host。
这里写图片描述
同时也会显示当前NetworkManager上的信息。
这里写图片描述
(3)
所有要注册在NetworkManager的prefab都要挂在NetworkIdentity的组件。
每个被NetworkManager生成的gameobject都是通过这个组件与networkManager联系。同时如果要挂载继承的是NetworkBehaviour的代码的时候,相应的gameobject也要有NetworkIdentity组件。
这里写图片描述

四、Player和场景的加载

(1)NetworkStartPosition
这里写图片描述
NetworkStartPosition 也是一个Unet的相关组件,给某个gameobject挂载之后,就会将其的Transform信息注册到NetworkManager的StarPosition一个List中。
player就从这些startposition中选一个作为初始transform生成。
(2)加载player

先上一段源代码。前面说过,client在连入server时,如果注册了Player Prefab,则会自动生成一个player gameobject。而这个代码就是server生成player gameobject时调用的。

        Transform startPosition = this.GetStartPosition();        GameObject player;        if (startPosition != null)        {            player = Object.Instantiate<GameObject>(this.m_PlayerPrefab, startPosition.get_position(), startPosition.get_rotation());        }        else        {            player = Object.Instantiate<GameObject>(this.m_PlayerPrefab, Vector3.get_zero(), Quaternion.get_identity());        }        NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);

其中关键的点是
Transform startPosition = this.GetStartPosition();
GetStartporion有两种方式,一个是随机(Random)一个是轮转(Round Robin),可以在NetworkManager中选择。
在这里我们选用Round Robin, 那么会从Startposition的list中按顺序选择位置生成player,设定好startposition就可以在指定位置加载player了。

(3)加载场景
其实我个人认为,这些场景不需要根据服务器加载的,直接在本地的scene中预先设定好就好。不过当时我是通过服务器加载的,也介绍一下这种方法。

public class SceneObjectSpawn : NetworkBehaviour{    public List<GameObject> ServerPrefabs;    public override void OnStartServer()    {        for (int i = 0; i < ServerPrefabs.Count; i++)        {            GameObject obj = Instantiate(ServerPrefabs[i]) as GameObject;            NetworkServer.Spawn(obj);        }    }}

核心的代码就是这个,在服务器启动的时候,将所有的prefab创建成对应的GameObject然后通过NetworkServer.Spawn(obj);在networkServer上生成,并在所有客户端上生成。

在按下HUD的Lan Host之后,便会生成player和擂台。
这里写图片描述

0 0
原创粉丝点击