B2:Unity制作Moba类游戏——聊天系统

news2024/11/26 2:34:30

一场游戏对局中,和队友进行友好的有礼貌的有效的沟通可以极大提升对局胜率。在LOL国服,打字和队友聊天沟通战术是非常常见的行为:

语言的力量是无限的,甚至可以和外国小伙伴效沟通战术:

 

    聊天系统制作起来非常简单,只要熟练掌握C#的TCP通讯协议即可,然后在服务器和客户端做好分发,流程就是:

某个客户端定义文字数据,发送给服务器(开喷) ==> 服务器接收消息分发给所有客户端 ==> 所有客户端接收消息判断消息归属IP,调用UI显示内容 ==> 回喷……

嗯,对,就是这样,剩下的就交给上帝吧......

    第一步,定义Socket通讯协议,定义收发消息的方法

/// <summary>
/// Socket协议
/// </summary>
public enum MessageType
{
    /// <summary>
    /// 链接协议
    /// </summary>
    Connect = 0,
    /// <summary>
    /// 游戏逻辑协议
    /// </summary>
    GameLogic = 1,
    /// <summary>
    /// 游戏环境设置协议
    /// </summary>
    GameSetting = 2,
    /// <summary>
    /// 玩家操作协议
    /// </summary>
    Player = 3,

}

/// <summary>
/// 连接Socket协议
/// </summary>
public enum ConnectMessage
{
    /// <summary>
    /// 加入房间
    /// </summary>
    Join = 0,
    /// <summary>
    /// 请求断开连接
    /// </summary>
    Exit = 1,
    /// <summary>
    /// 中途离开游戏
    /// </summary>
    ExitGame = 2,
    /// <summary>
    /// 中途加入游戏
    /// </summary>
    JoinGame = 3,
    /// <summary>
    /// 关闭服务器
    /// </summary>
    Close = 4,
}

/// <summary>
/// 玩家操作Socket协议
/// </summary>
public enum PlayerMessage
{
    /// <summary>
    /// 发送聊天数据
    /// </summary>
    SendChat = 0,
    /// <summary>
    /// 操作移动
    /// </summary>
    Move = 1,
    /// <summary>
    /// 释放技能
    /// </summary>
    Skill = 2,
    /// <summary>
    /// 执行英雄动画
    /// </summary>
    Animator = 3,
    /// <summary>
    /// 同步英雄transform数据
    /// </summary>
    SyncTransform = 4,
    /// <summary>
    /// 击杀判定
    /// </summary>
    KillJudge = 5,
    /// <summary>
    /// 属性变化
    /// </summary>
    AttributeJudge = 6,
    /// <summary>
    /// 属性面板变化
    /// </summary>
    PropertyPanel = 7,
    /// <summary>
    /// 背包内容变化
    /// </summary>
    PackageChange = 8,

}

第二步,定义客户端发送消息的方法:

using System.Net.Sockets;
    
    /// <summary>
    /// 客户端Socket
    /// </summary>
    public Socket clientSocket;

    /// <summary>
    /// 发送一条文字信息给服务器
    /// </summary>
    /// <param name="msg"></param>
    public void PutMessageToQueue(MessageData msgdata)
    {
        //将对象序列化发过去
        byte[] msgBytes = ToolsUtil.StringToByteArray(JsonMapper.ToJson(msgdata));
        if (msgBytes.Length > 2048)
        {
            iDebug.YiYan("数据长度大于2048,请减少数据");
        }
        else
        {
            SendBytesMessageToServer(msgBytes, 0, msgBytes.Length);
        }
    }

    /// <summary>
    /// 发送消息的方法
    /// </summary>
    /// <param name="sendMsgContent">消息内容</param>
    /// <param name="offset">从消息内容第几个开始发送</param>
    /// <param name="size">发送的长度</param>
    public void SendBytesMessageToServer(byte[] sendMsgContent, int offset, int size)
    {
        //  Debug.Log("开始发送!!准备发送长度=" + size);
        if (clientSocket.Connected == true)
        {
            clientSocket.BeginSend(sendMsgContent, offset, size, SocketFlags.None, SendMessageCallback, "");
        }
        else
        {
            EventManager.playerControl_C.ClearData();
        }
    }

第三步,定义客户端接收消息并显示的方法:

    /// <summary>
    /// 接收消息的方法
    /// </summary>
    /// <param name="byteArray"></param>
    /// <param name="offset"></param>
    /// <param name="length"></param>
    public void ReceiveMsgData(byte[] byteArray, int offset, int length)
    {
        string msg = ToolsUtil.ByteArrayToString(byteArray, offset, length);
        //  Debug.Log("收到信息:" + msg);
        if (msg.Length > 0)
        {
            //对信息进行处理
            MessageData data = JsonMapper.ToObject<MessageData>(msg);
            Action_Talk(data);

        }
        else
        {
            Debug.LogError("连接中断……");
            EventManager.playerControl_C.ClearData();
        }

    }

    /// <summary>
    /// 执行对话
    /// </summary>
    /// <param name="value"></param>
    public void Action_Talk(MessageData value)
    {
        PlayerSocketData playerSocketData = JsonMapper.ToObject<PlayerSocketData>(value.socketData);

        if (localMacID == playerSocketData.MacID)
        {
            UIManager.console_C.ReceiveMessage("我:" + value.msg);
        }
        else
        {
            UIManager.console_C.ReceiveMessage(playerSocketData.Name + "说:" + value.msg);
        }

        DataManager.playerData_C.GetData(playerSocketData.UserID).heroAI.heroCanvas.StartTalk(value.msg);

        //发送弹幕
        BulletScreen.Single.PushComments(playerSocketData.Name + ":" + value.msg);
    }

在“执行对话”Action_Talk 方法里,通过socket接收到的消息需要在UI上实时显示即可,这里就不多做赘述啦~~ 感兴趣的小伙伴,可以做成弹幕哦~~

原理很简单,就是以服务器作为中转,看了第一篇socket帧同步的小伙伴很容易实现聊天系统

下一篇开始开始游戏AI的制作,尽请期待哈~ ~ ~

文末福利:↓↓↓

 

 

 不羡鸳鸯不羡仙,羡慕韩国财阀每一天~~~ 嘿嘿嘿嘿~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jQuery图片批量上传插件源码,支持批量上传、预览、删除、放大,可配置上传数量、上传大小、追加方式,含详细使用文档

jQuery图片批量上传插件源码&#xff0c;支持批量上传、预览、删除、放大&#xff0c;可配置上传数量、上传大小、追加方式&#xff0c;含详细使用文档 程序包内含使用Demo 完整程序源代码&#xff1a;jQuery图片批量上传插件源码 上传前 上传后 使用方法 1、先引入jquer…

linux搭建nexus私服仓库并简单使用

linux搭建nexus私服仓库并简单使用1、linux搭建nexus私服仓库1.1、下载安装包1.2、linux安装1.3、启动和关闭1.4、登录控制台1.5、账号与密码2、创建自己的私服仓库3、上传 jar 包4、具体项目引入私服仓库1、linux搭建nexus私服仓库 1.1、下载安装包 下载nexus包&#xff0c;这…

用Python写一个新年倒计时

❤️‍&#x1f525;前言&#xff1a; 春回大地&#xff0c;万象更新!春在招手&#xff0c;朋友们&#xff0c;我们一起互相祝愿吧!一年更比一年好。时光苒&#xff0c;岁月如梭。踏着新年欢快的钟声&#xff0c;我们又迎来了这个期待已久的日子过去的一年&#xff0c;我们有泪…

m基于PSO粒子群优化的柔性制造系统AGV调度模型matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在PSO中&#xff0c;群中的每个粒子表示为向量。在投资组合优化的背景下&#xff0c;这是一个权重向量&#xff0c;表示每个资产的分配资本。矢量转换为多维搜索空间中的位置。每个粒子也会记住它…

Word控件Spire.Doc 【超链接】教程(5):使用 C# 更改颜色或从 Word 中的超链接中删除下划线

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

STM32 ~ 定时器

定时器的基本框图&#xff1a; 不管是做PWM输出、定时中断还是输入捕获都肯定要搞清楚CK_INT 从哪里来&#xff0c;频率是多少&#xff1f;才能正确使用定时器。时钟肯定是来自时钟树&#xff0c;那我们就要去Reference manual里找找&#xff1a; 时钟源确实可以找到&#xf…

奈雪收购乐乐茶,茶饮品牌开启整合之路

近日&#xff0c;奈雪的茶以5.25亿元收购了乐乐茶43.64%的股权&#xff0c;成为其第一大股东。这是今年以来新式茶饮品牌最大的一笔投资&#xff0c;也使得奈雪的股价一路飙涨&#xff0c;五日涨幅超过15%&#xff0c;创下年内新高。 据《2022年中国新式茶饮研究报告》显示&…

【程序人生】卡塔尔世界杯吉祥物python海龟绘图(附源代码),世界杯主题前端特效5个(附源码)

卡塔尔世界杯吉祥物python海龟绘图&#xff08;附源代码&#xff09; 世界杯主题前端特效5个&#xff08;附源码&#xff09;程序人生 本文目录&#xff1a; 一、python turtle海龟绘图卡塔尔世界杯吉祥物 &#xff08;1&#xff09;、世界杯吉祥物“Laeeb”绘制效果图 &am…

数据结构---栈和队列

栈和队列栈入栈出栈栈的JAVA实现队列入队出队循环队列栈和队列。这两者都属于逻辑结构&#xff0c;它们的物理实现既可以利用数组&#xff0c;也可以利用链表来完成。 栈 栈&#xff08;stack&#xff09;是一种线性数据结构&#xff0c;它就像一个上图所示的放入乒乓球的圆筒…

实施 GitOps 的三个关键步骤

GitOps 是一种自动化和管理基础架构和应用程序的模型&#xff0c;通过许多团队已经使用的相同 DevOps 最佳实践来形成的模型&#xff0c;例如版本控制、代码审查和 CI/CD 流水线。在实施 DevOps 时&#xff0c;我们找到了自动化软件开发生命周期的方法&#xff0c;但在基础设施…

[附源码]Python计算机毕业设计高铁乘坐舒适性在线调查及评价系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

3399的-mipi适应多个lcd屏显示-后续2-linux内核中的修改

一、前提&#xff1a; 1. rk3399核心板 2.linux4.4.19 源码 3. 多个MIPI显示屏的启动序列以及显示时序&#xff08;重要&#xff09; 4.rk3399MIPI通道0 5.接上一个uboot中的修改配置 二、内核驱动的修改 0. dts就不再给出了&#xff0c;请参考uboot的修改 1. 主要涉及的…

基于C#开发的(WinForm)图书管理系统【100010037】

图书管理系统项目开发说明书 项目简介 项目背景&#xff08;选择这个项目的原因、前景&#xff0c;面向的用户&#xff0c;优势&#xff09;&#xff1b; * 根据学院需要希望能够充分利用现代科技来提高图书管理的效率&#xff0c;在原有的办公系统基础上进行扩展&#xff0c…

ArkUI框架,更懂程序员的UI信息语法

ArkUI框架&#xff0c;更懂程序员的信息语法ArkUI框架简化代码的“秘密” 在传统的开发过程中&#xff0c;总有个问题在困扰我&#xff1a;如何实现前端view与后端数据的同步更改&#xff1f;例如&#xff1a;在某个视频类app的页面&#xff0c;如果我想要实现视频的点击播放功…

移动端touch拖动事件和click事件冲突问题解决

通过本课程你会学到什么 1.系统掌握 Web 全栈技能树 2.网络、前后端、持久化等核心技术解析 3.全栈开发的技术比较和选型 4.拓宽技术视野&#xff0c;培养全栈思维 今天我们要接触一个和 MVC 密切相关的&#xff0c;能带来思维模式改变的编程范型——面向切面编程&#xff08;…

OpenCV StudyNote

Open CV学习 图像读取与显示 灰度图像 - 单通道 彩色图像 - 三通道 (B, G, R) 一般步骤 import cv2 as cv # 导入OpenCV支持(cv2是包的名称不是版本号) import numpy as np # 所有图像数据都是以 numpy 数组方式存储 imread(filename[,flags]) # imread 函数&am…

自助服务:怎么提高客服人员效率?

越来越多的企业意识到了客服效率的重要性&#xff0c;大家通过布局全渠道系统、智能客服机器人、人员岗前培训等方式来提升客服效率&#xff0c;为客户提供更迅速、专业、优质的服务。人员效率的提升不仅能提高客户体验&#xff0c;还有助于企业的长期发展&#xff0c;带来更多…

【Vue2+Element ui通用后台】头部

文章目录headerheader 在 components 中新建 CommonHeader.vue 组件来完成头部组件的编写 <template><div class"header-container"><div class"l-content"><el-button icon"el-icon-menu" size"mini"><…

【MySQL】索引基础介绍

一、常见的存储引擎有哪些&#xff1f;区别是什么&#xff1f; Mysql 默认的存储引擎是&#xff1a;InnoDB&#xff0c;具有支持事务、行级锁、高并发访问性能。MyIsAM&#xff1a;访问速度快&#xff0c;实际运用如果是以读和插入操作为主&#xff0c;并对事物完整性和并发性…

面向对象程序设计期末项目总结

面向对象程序设计期末项目总结 开发前准备 MysqlNavicatTomCatIDEA 一&#xff0c;配置项目环境 右键项目名&#xff0c;添加新模块 命名后右键新建的模块 选中Web模块 到此项目创建完毕&#xff0c;接下来是配置环境。 打开IDEA–>File找到Project Structure 添加所…