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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值