场景和人物模型搭建完毕后,就正式开始搭建网络环境。对于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和擂台。