【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)

这篇具有很好参考价值的文章主要介绍了【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需要源码请点赞关注收藏后评论区留言并且私信~~~

下面利用Unity和C#语言做一个简单的聊天室程序,主要用到的技术就是Socket通信连接,需要一个客户端和一个服务器端,服务器端就使用C#语言的控制台完成

unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

 一、C#语言服务器端搭建

下面就开始搭建C#语言服务器端

1:新建一个C#语言控制台程序

2:命名项目为Server 右击项目新建项

3:新建类MessageData.cs ClientController.cs MessageData类存放指定的消息协议,每一条消息都由创建消息对象,设置消息类型和消息内容组成,服务器端和客户端都必须配置这个消息协议

ClientController脚本用来控制所有的客户端程序

部分代码如下

using System;
using System.Net.Sockets;
using System.Threading;

namespace Server
{
    class ClientController
    {
        /// <summary>
        /// 用户链接的通道
        /// </summary>
        private Socket clientSocket;
        //接收的线程
        Thread receiveThread;
        /// <summary>
        /// 昵称
        /// </summary>
        public string nickName;
        public ClientController(Socket socket)
        {
            clientSocket = socket;
            //启动接收的方法
            //开始收的线程
            receiveThread = new Thread(ReceiveFromClient);
            //启动收的线程
            receiveThread.Start();
        }

        /// <summary>
        /// 客户端连接 监听消息
        /// </summary>
        void ReceiveFromClient()
        {
            while (true)
            {
                byte[] buffer = new byte[512];
                int lenght = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                string json = System.Text.Encoding.UTF8.GetString(buffer, 0, lenght);
                json.TrimEnd();
                if (json.Length > 0)
                {
                    Console.WriteLine("服务器接收内容:{0}", json);
                    MessageData data = LitJson.JsonMapper.ToObject<MessageData>(json);
                    switch (data.msgType)
                    {
                        case MessageType.Login://登陆
                            nickName = data.msg;
                            //1、通知客户端登陆成功
                            MessageData backData = new MessageData();
                            backData.msgType = MessageType.Login;
                            backData.msg = "";
                            SendToClient(backData);
                            //2、通知所有客户端,XXX加入房间
                            MessageData chatData = new MessageData();
                            chatData.msgType = MessageType.Chat;
                            chatData.msg = nickName + " 进入了房间";
                            SendMessageDataToAllClientWithOutSelf(chatData);
                            break;
                        case MessageType.Chat://聊天
                            MessageData chatMessageData = new MessageData();
                            chatMessageData.msgType = MessageType.Chat;
                            chatMessageData.msg = nickName + ":" + data.msg;
                            SendMessageDataToAllClientWithOutSelf(chatMessageData);
                            break;
                        case MessageType.LogOut://退出
                                                //1、通知客户端,退出
                            MessageData logOutData = new MessageData();
                            logOutData.msgType = MessageType.LogOut;
                            SendToClient(logOutData);
                            //2、通知所有客户端,XXX退出了房间
                            MessageData logOutChatData = new MessageData();
                            logOutChatData.msgType = MessageType.Chat;
                            logOutChatData.msg = nickName + " 退出了房间";
                            SendMessageDataToAllClientWithOutSelf(logOutChatData);
                            break;
                    }
                }
            }
        }

        /// <summary>
        /// 向除了自身客户端的其他所有客户端广播消息
        /// </summary>
        /// <param name="data"></param>
        void SendMessageDataToAllClientWithOutSelf(MessageData data)
        {
            for (int i = 0; i < Program.clientControllerList.Count; i++)
            {
                if (Program.clientControllerList[i] != this)
                {
                    Program.clientControllerList[i].SendToClient(data);
                }
            }
        }

        /// <summary>
        /// 发消息给客户端
        /// </summary>
        /// <param name="data">需要发送的内容</param>
        void SendToClient(MessageData data)
        {
            //把对象转换为json字符串
            string msg = LitJson.JsonMapper.ToJson(data);
            //把json字符串转换byte数组
            byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
            //发送消息
            int sendLength = clientSocket.Send(msgBytes);
            Console.WriteLine("服务器发送信息成功,发送信息内容:{0},长度{1}", msg, sendLength);
            Thread.Sleep(50);
        }
    }
}

需要注意的是,这个脚本引用了一个LitJson程序包解析JSON数据,这个需要右击程序,选择管理NuGet程序包选项,在弹出的窗口中搜索LitJson然后安装即可

 unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

双击打开Program.cs脚本,这个脚本是C#语言控制台程序的主脚本,脚本中的一个Main函数是程序的入口函数 代码如下

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class Program
    {
        /// <summary>
        /// 客户端管理列表
        /// </summary>
        public static List<ClientController> clientControllerList = new List<ClientController>();
        static void Main(string[] args)
        {
            //定义socket
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //绑定IP和端口号
            IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
            Console.WriteLine("开始绑定端口号....");
            //将ip地址和端口号绑定
            serverSocket.Bind(ipendPoint);
            Console.WriteLine("绑定端口号成功,开启服务器....");
            //开启服务器
            serverSocket.Listen(100);
            Console.WriteLine("启动服务器{0}成功!", serverSocket.LocalEndPoint.ToString());
            while (true)
            {
                Console.WriteLine("等待连接.....");
                Socket clinetSocket = serverSocket.Accept();
                Console.WriteLine("客户端{0}成功连接", clinetSocket.RemoteEndPoint.ToString());
                ClientController controller = new ClientController(clinetSocket);
                //添加到列表中
                clientControllerList.Add(controller);
                Console.WriteLine("当前有{0}个用户", clientControllerList.Count);
            }
        }
    }
}

服务器端目录结构如下

unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

运行服务器端 启动正常会弹出一个窗口

 unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

 二、Unity客户端搭建

Unity客户端搭建主要分为以下三个方面

1:搭建UI界面

2:制定消息协议

3:编写客户端

首先搭建UI界面 UI界面分为三部分,分别是初始界面,登录界面和聊天界面 

搭建步骤省略 需要可点赞关注收藏后评论区留言私信 效果如下

unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

在Unity中新建一个Plugins文件夹 里面存放代码文件和依赖 目录如下

 unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

整体运行效果如下 

运行Unity客户端 出现两个聊天框 可以进行实时的聊天互动 

unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

C#控制台服务器端则会记录聊天的信息以及用户信息等等 

 unity 聊天系统,Unity 3D,c#,开发语言,unity,3d,游戏引擎

 部分代码如下

using UnityEngine;
using UnityEngine.UI;

public class ChatUIController : MonoBehaviour
{
    // 昵称
    public InputField nickNameInputField;
    //显示消息的文本
    public Text text;
    // 要发送的内容
    public InputField sendMsgInputField;
    // socket对象 代表客户端
    private ClientSocket clientSocket;
    //接收的消息
    private string receiveMsg;
    // 界面 0==loading 1==登陆  2==聊天
    public GameObject[] panels;
    //登录状态 0==loading 1==登陆  2==聊天
    private int LoadingState;
    void Start()
    {
        clientSocket = this.GetComponent<ClientSocket>();
        //委托和具体方法关联
        clientSocket.onConnectSuccess += OnSocketConnectSuccess;
        clientSocket.receiveMessageData += ReceiveMsgData;
    }
    void Update()
    {
       
        panels[0].SetActive(LoadingState == 0);
        panels[1].SetActive(LoadingState == 1);
        panels[2].SetActive(LoadingState == 2);
    }
    /// <summary>
    /// 发送按钮点击
    /// </summary>
    public void SendBtnClick()
    {
        if (sendMsgInputField != null && sendMsgInputField.text != "")
        {
            //发送
            clientSocket.PutMessageToQueue(sendMsgInputField.text);
            receiveMsg += "我:" + sendMsgInputField.text + "\n";
            //清理一下输入框内容
            sendMsgInputField.text = "";
        }
    }
    /// <summary>
    /// 加入房间按钮点击
    /// </summary>
    public void JoinInBtnClick()
    {
        if (nickNameInputField != null && nickNameInputField.text != "")
        {
            //创建数据对象
            MessageData data = new MessageData();
            data.msgType = MessageType.Login;
            data.msg = nickNameInputField.text;
            //发送数据对象
            clientSocket.PutMessageToQueue(data);
        }
        else
        {
            //提示
            Debug.Log("昵称不能为空!");
        }
    }
    /// <summary>
    /// 退出房间按钮点击事件
    /// </summary>
    public void LogOutBtnClick()
    {
        //消息数据
        MessageData data = new MessageData();
        data.msgType = MessageType.LogOut;
        //把消息传进去
        clientSocket.PutMessageToQueue(data);
    }
    /// <summary>
    /// 连接服务器成功的回调
    /// </summary>
    public void OnSocketConnectSuccess()
    {
        //进入登陆界面
        LoadingState = 1;
    }
    /// <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 = ClientSocket.ByteArrayToString(byteArray, offset, length);
        Debug.Log("收到信息:" + msg);
        //对信息进行处理
        MessageData data = LitJson.JsonMapper.ToObject<MessageData>(msg);
        switch (data.msgType)
        {
            case MessageType.Login://如果是登陆,代表界面可以切换了
                receiveMsg = "";
                LoadingState = 2;
                break;
            case MessageType.Chat://如果是聊天,代表进行聊天的显示
                receiveMsg += data.msg + "\n";
                break;
            case MessageType.LogOut://退出消息
                receiveMsg = "";
                LoadingState = 1;
                break;
        }
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~文章来源地址https://www.toymoban.com/news/detail-755433.html

到了这里,关于【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言Socket编程TCP简单聊天室

    这是一个使用C语言进行套接字编程实现的简单聊天室, 使用Pthread库进行多线程执行 服务端: svr.c 客户端: cli.c Makefile: Makefile 执行编译 启动服务器 启动客户端 聊天 退出

    2024年02月03日
    浏览(35)
  • Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

    在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的样式,可以通过一键点击后设置UI背景的样式,省

    2024年02月03日
    浏览(37)
  • Unity3d C#利用本地网页快速打开萤石云监控视频流(ezopen)实现云台,声音等控制,支持WebGL平台,替代UMP播放(含源码)

    之前我介绍了替代Universal?Media?PlayerUMP播放石云监控视频流(ezopen)的功能,效果还是很明显的,笔者的测试是差不多3-5秒就能打开监控画面,不过稍微遗憾的是,之前的功能是iframe打开石云提供的播放网页的形式,功能基本只有画质切换,声音开关等;具体可以移步查看(https

    2024年02月13日
    浏览(37)
  • 基于C# Socket实现的简单的Redis客户端

         Redis 是一款强大的高性能键值存储数据库,也是目前 NOSQL 中 最流行 比较流行的一款数据库,它在广泛的应用场景中扮演着至关重要的角色,包括但不限于缓存、消息队列、会话存储等。在本文中,我们将介绍如何基于 C# Socket 来实现一个简单的Redis客户端类 RedisClien

    2024年02月05日
    浏览(38)
  • Linux-Socket实现模拟群聊(多人聊天室)

    简单版本 服务端源码 客户端源码 服务器可以在特定的端口监听客户端的连接请求,若连接成功,服务器采用广播的形式向当前所有连接客户端发送该客户端登录成功消息多个客户端可以同时登录,在源码文件中可以配置最多群聊同时在线人数。服务端接收到客户端发送的群

    2024年02月10日
    浏览(78)
  • Python web实战 | 使用 Flask 实现 Web Socket 聊天室

        今天我们学习如何使用 Python 实现 Web Socket,并实现一个实时聊天室的功能。本文的技术栈包括 Python、Flask、Socket.IO 和 HTML/CSS/JavaScript。   Web Socket 是一种在单个 TCP 连接上进行全双工通信的协议。它是 HTML5 中的一部分,并且可以在浏览器和服务器之间创建实时的交互式

    2024年02月14日
    浏览(40)
  • 【你的第一个socket应用】Vue3+Node实现一个WebSocket即时通讯聊天室

    这篇文章主要是用WebSocket技术实现一个 即时通讯聊天室 ,首先先要了解为什么使用WebSocket而不是普通的HTTP协议,如果使用HTTP协议它是下面这种情况: 我发送一条消息,发送一个发送消息的请求;* 一直轮询接收别人发送的消息,不管有没有发送都要定时去调用接口。这里明

    2023年04月20日
    浏览(46)
  • 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能。多人聊天只需要将A客户端发来的消息,转发给除A客户端外的其他客户端,即可实现。如果你还不怎么熟悉服务端

    2024年02月03日
    浏览(51)
  • SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存

    引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/details/92410518 在此基础上实现对聊天记录的保存。 代码地址:链接:https://pan.baidu.com/s/1IJFZDa4S_DF08773sKJWeA 提取码:jkui 思路:新建一个实体类用于保存聊天记录,在消息发送时,设置对象的各个值然后保存到数据库中。

    2024年02月02日
    浏览(35)
  • C语言实现--基于UDP的多人在线聊天室

    目录 实现功能 实现思想 实现代码(部分及详解) 服务端部分代码 客户端部分代码 实现效果 项目中出现的问题和解决方法 项目整体代码展示 代码优化思路 服务端代码 客户端代码 服务端可以同时连接多个客户端; 新的客户端连接服务端时,可以在服务端显示自己的名字并

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包