unity 使用socket制作局域网项目--激流勇进

        公司接了一个多人划船项目,开始使用一个程序来制作的,有多个相机,后面因为水面的反射问题,无法实现水面在两个相机的画面里有不同的反射效果,故只能使用联机模式。参考书籍《unity3d网络游戏实战(第2版)》,下面说到的网络技术点书上大部分都有说明。
        注意点:
        1.客户端要用一个写入队列Queue<ByteArray> writeQueue;来保存要发送的数据,保证所有数据都能顺利发送。
        2.客户端要用一个链表static List<ProtoBuf.IExtensible> msgList来保存读取到的消息,保证数据都能全部接收到。其中ProtoBuf.IExtensible是用ProtoBuf工具转换的消息基类,怎么使用ProtoBuf工具来自定义消息就不说了,自己百度或看书。
        3.服务端要用2个字典来保存客户端的连接信息和消息。每个客户端使用一个list消息队列才能保证能及时处理每个客户端的消息。
            //客户端Socket及状态信息
    public static Dictionary<Socket, ClientState> m_ClientDic = new Dictionary<Socket, ClientState>();
    //接收的消息列表
    static Dictionary<ClientState, List<ProtoBuf.IExtensible>> m_MsgDic = new Dictionary<ClientState, List<ProtoBuf.IExtensible>>();
        4.对于玩家类有本地玩家和同步玩家。本地玩家是我们自己控制的角色。同步玩家是其它程序端控制的角色,在我们程序端只同步位置和动画的角色。定义一个m_IsLocalPlayer布尔变量用于区分,这个变量对于联机模式很有用。
        比如,在Update中加一个判断:if (!m_IsLocalPlayer) return;,这样只有本地玩家才能控制玩家角色。而在碰撞的时候,也加入m_IsLocalPlayer的判断,这样只能本地玩家才能撞到物体。
        5.连接客户端不要太多,发送消息不要太快。因为服务端收到"同步位置"和"同步动画"信息时需要对所有客户端进行消息分发,每多一个客户端,每个客户端的接收到的消息就会多一份,消息太多会导致客户端来不及处理消息,最终导致客户端的BeginReceive接收不到消息,而此时客户端跟服务端还是处于连接状态,服务端也一直能收到所有客户端发送的心跳包信息。
        我采用一主三客能支持4个玩游戏的模式,然而一直会有客户端出现上述BeginReceive接收不到消息这个问题,所以最终改成了单人和双人模型,四人玩的多人模式取消。所以希望大家做这种同步性高的联机游戏时,最好只支持双人模式,超过两人的不要考虑,除非你们公司有大神或者你就是大神。还有一种方案就是采用unity自带的联机方案UNet,能支持多人联机,可能同步性要比我们自己写socket要好,这个要自己去研究了。

    使用到的插件:
    1.带水花的插件RealisticWater,有水花有反射水还清澈,画面这样子的。

    2.能做水面波纹涟漪的插件DynamicWaterRipples,本来划船的水波纹是用这个插件不是上面那个插件的,但是这个插件的水面有面数限制,不能太大,不然起伏的波纹会看到明显的三角面严重失真,所以这个插件只能用于小片水面,如固定画面的池塘小河等,像划船这种用到的河流以及湖泊海洋等大型水面不适合。
    3.后处理插件Post Processing Profiles,使用2017版的话导入后解压PP目录下的PostProcessing1压缩包,然后移动到Assets目录下就行。给相机加上PostProcessingBehaviour脚本,然后拖入Processing Profiles就可以在Processing Profiles中设置各种效果了。
            
        
        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值