国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity 3D】利用C#、Unity和Socket實(shí)現(xiàn)簡(jiǎn)單的在線聊天室工具(附源碼 簡(jiǎn)單易懂)

這篇具有很好參考價(jià)值的文章主要介紹了【Unity 3D】利用C#、Unity和Socket實(shí)現(xiàn)簡(jiǎn)單的在線聊天室工具(附源碼 簡(jiǎn)單易懂)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

需要源碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言并且私信~~~

下面利用Unity和C#語(yǔ)言做一個(gè)簡(jiǎn)單的聊天室程序,主要用到的技術(shù)就是Socket通信連接,需要一個(gè)客戶(hù)端和一個(gè)服務(wù)器端,服務(wù)器端就使用C#語(yǔ)言的控制臺(tái)完成

unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

?一、C#語(yǔ)言服務(wù)器端搭建

下面就開(kāi)始搭建C#語(yǔ)言服務(wù)器端

1:新建一個(gè)C#語(yǔ)言控制臺(tái)程序

2:命名項(xiàng)目為Server 右擊項(xiàng)目新建項(xiàng)

3:新建類(lèi)MessageData.cs ClientController.cs MessageData類(lèi)存放指定的消息協(xié)議,每一條消息都由創(chuàng)建消息對(duì)象,設(shè)置消息類(lèi)型和消息內(nèi)容組成,服務(wù)器端和客戶(hù)端都必須配置這個(gè)消息協(xié)議

ClientController腳本用來(lái)控制所有的客戶(hù)端程序

部分代碼如下

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

namespace Server
{
    class ClientController
    {
        /// <summary>
        /// 用戶(hù)鏈接的通道
        /// </summary>
        private Socket clientSocket;
        //接收的線程
        Thread receiveThread;
        /// <summary>
        /// 昵稱(chēng)
        /// </summary>
        public string nickName;
        public ClientController(Socket socket)
        {
            clientSocket = socket;
            //啟動(dòng)接收的方法
            //開(kāi)始收的線程
            receiveThread = new Thread(ReceiveFromClient);
            //啟動(dòng)收的線程
            receiveThread.Start();
        }

        /// <summary>
        /// 客戶(hù)端連接 監(jiān)聽(tīng)消息
        /// </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("服務(wù)器接收內(nèi)容:{0}", json);
                    MessageData data = LitJson.JsonMapper.ToObject<MessageData>(json);
                    switch (data.msgType)
                    {
                        case MessageType.Login://登陸
                            nickName = data.msg;
                            //1、通知客戶(hù)端登陸成功
                            MessageData backData = new MessageData();
                            backData.msgType = MessageType.Login;
                            backData.msg = "";
                            SendToClient(backData);
                            //2、通知所有客戶(hù)端,XXX加入房間
                            MessageData chatData = new MessageData();
                            chatData.msgType = MessageType.Chat;
                            chatData.msg = nickName + " 進(jìn)入了房間";
                            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、通知客戶(hù)端,退出
                            MessageData logOutData = new MessageData();
                            logOutData.msgType = MessageType.LogOut;
                            SendToClient(logOutData);
                            //2、通知所有客戶(hù)端,XXX退出了房間
                            MessageData logOutChatData = new MessageData();
                            logOutChatData.msgType = MessageType.Chat;
                            logOutChatData.msg = nickName + " 退出了房間";
                            SendMessageDataToAllClientWithOutSelf(logOutChatData);
                            break;
                    }
                }
            }
        }

        /// <summary>
        /// 向除了自身客戶(hù)端的其他所有客戶(hù)端廣播消息
        /// </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>
        /// 發(fā)消息給客戶(hù)端
        /// </summary>
        /// <param name="data">需要發(fā)送的內(nèi)容</param>
        void SendToClient(MessageData data)
        {
            //把對(duì)象轉(zhuǎn)換為json字符串
            string msg = LitJson.JsonMapper.ToJson(data);
            //把json字符串轉(zhuǎn)換byte數(shù)組
            byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
            //發(fā)送消息
            int sendLength = clientSocket.Send(msgBytes);
            Console.WriteLine("服務(wù)器發(fā)送信息成功,發(fā)送信息內(nèi)容:{0},長(zhǎng)度{1}", msg, sendLength);
            Thread.Sleep(50);
        }
    }
}

需要注意的是,這個(gè)腳本引用了一個(gè)LitJson程序包解析JSON數(shù)據(jù),這個(gè)需要右擊程序,選擇管理NuGet程序包選項(xiàng),在彈出的窗口中搜索LitJson然后安裝即可

?unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

雙擊打開(kāi)Program.cs腳本,這個(gè)腳本是C#語(yǔ)言控制臺(tái)程序的主腳本,腳本中的一個(gè)Main函數(shù)是程序的入口函數(shù) 代碼如下

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

namespace Server
{
    class Program
    {
        /// <summary>
        /// 客戶(hù)端管理列表
        /// </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和端口號(hào)
            IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
            Console.WriteLine("開(kāi)始綁定端口號(hào)....");
            //將ip地址和端口號(hào)綁定
            serverSocket.Bind(ipendPoint);
            Console.WriteLine("綁定端口號(hào)成功,開(kāi)啟服務(wù)器....");
            //開(kāi)啟服務(wù)器
            serverSocket.Listen(100);
            Console.WriteLine("啟動(dòng)服務(wù)器{0}成功!", serverSocket.LocalEndPoint.ToString());
            while (true)
            {
                Console.WriteLine("等待連接.....");
                Socket clinetSocket = serverSocket.Accept();
                Console.WriteLine("客戶(hù)端{(lán)0}成功連接", clinetSocket.RemoteEndPoint.ToString());
                ClientController controller = new ClientController(clinetSocket);
                //添加到列表中
                clientControllerList.Add(controller);
                Console.WriteLine("當(dāng)前有{0}個(gè)用戶(hù)", clientControllerList.Count);
            }
        }
    }
}

服務(wù)器端目錄結(jié)構(gòu)如下

unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

運(yùn)行服務(wù)器端 啟動(dòng)正常會(huì)彈出一個(gè)窗口

?unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

?二、Unity客戶(hù)端搭建

Unity客戶(hù)端搭建主要分為以下三個(gè)方面

1:搭建UI界面

2:制定消息協(xié)議

3:編寫(xiě)客戶(hù)端

首先搭建UI界面 UI界面分為三部分,分別是初始界面,登錄界面和聊天界面?

搭建步驟省略 需要可點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言私信 效果如下

unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

在Unity中新建一個(gè)Plugins文件夾 里面存放代碼文件和依賴(lài) 目錄如下

?unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

整體運(yùn)行效果如下?

運(yùn)行Unity客戶(hù)端 出現(xiàn)兩個(gè)聊天框 可以進(jìn)行實(shí)時(shí)的聊天互動(dòng)?

unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

C#控制臺(tái)服務(wù)器端則會(huì)記錄聊天的信息以及用戶(hù)信息等等?

?unity 聊天系統(tǒng),Unity 3D,c#,開(kāi)發(fā)語(yǔ)言,unity,3d,游戲引擎

?部分代碼如下

using UnityEngine;
using UnityEngine.UI;

public class ChatUIController : MonoBehaviour
{
    // 昵稱(chēng)
    public InputField nickNameInputField;
    //顯示消息的文本
    public Text text;
    // 要發(fā)送的內(nèi)容
    public InputField sendMsgInputField;
    // socket對(duì)象 代表客戶(hù)端
    private ClientSocket clientSocket;
    //接收的消息
    private string receiveMsg;
    // 界面 0==loading 1==登陸  2==聊天
    public GameObject[] panels;
    //登錄狀態(tài) 0==loading 1==登陸  2==聊天
    private int LoadingState;
    void Start()
    {
        clientSocket = this.GetComponent<ClientSocket>();
        //委托和具體方法關(guān)聯(lián)
        clientSocket.onConnectSuccess += OnSocketConnectSuccess;
        clientSocket.receiveMessageData += ReceiveMsgData;
    }
    void Update()
    {
       
        panels[0].SetActive(LoadingState == 0);
        panels[1].SetActive(LoadingState == 1);
        panels[2].SetActive(LoadingState == 2);
    }
    /// <summary>
    /// 發(fā)送按鈕點(diǎn)擊
    /// </summary>
    public void SendBtnClick()
    {
        if (sendMsgInputField != null && sendMsgInputField.text != "")
        {
            //發(fā)送
            clientSocket.PutMessageToQueue(sendMsgInputField.text);
            receiveMsg += "我:" + sendMsgInputField.text + "\n";
            //清理一下輸入框內(nèi)容
            sendMsgInputField.text = "";
        }
    }
    /// <summary>
    /// 加入房間按鈕點(diǎn)擊
    /// </summary>
    public void JoinInBtnClick()
    {
        if (nickNameInputField != null && nickNameInputField.text != "")
        {
            //創(chuàng)建數(shù)據(jù)對(duì)象
            MessageData data = new MessageData();
            data.msgType = MessageType.Login;
            data.msg = nickNameInputField.text;
            //發(fā)送數(shù)據(jù)對(duì)象
            clientSocket.PutMessageToQueue(data);
        }
        else
        {
            //提示
            Debug.Log("昵稱(chēng)不能為空!");
        }
    }
    /// <summary>
    /// 退出房間按鈕點(diǎn)擊事件
    /// </summary>
    public void LogOutBtnClick()
    {
        //消息數(shù)據(jù)
        MessageData data = new MessageData();
        data.msgType = MessageType.LogOut;
        //把消息傳進(jìn)去
        clientSocket.PutMessageToQueue(data);
    }
    /// <summary>
    /// 連接服務(wù)器成功的回調(diào)
    /// </summary>
    public void OnSocketConnectSuccess()
    {
        //進(jìn)入登陸界面
        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);
        //對(duì)信息進(jìn)行處理
        MessageData data = LitJson.JsonMapper.ToObject<MessageData>(msg);
        switch (data.msgType)
        {
            case MessageType.Login://如果是登陸,代表界面可以切換了
                receiveMsg = "";
                LoadingState = 2;
                break;
            case MessageType.Chat://如果是聊天,代表進(jìn)行聊天的顯示
                receiveMsg += data.msg + "\n";
                break;
            case MessageType.LogOut://退出消息
                receiveMsg = "";
                LoadingState = 1;
                break;
        }
    }
}

創(chuàng)作不易 覺(jué)得有幫助請(qǐng)點(diǎn)贊關(guān)注收藏~~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-755433.html

到了這里,關(guān)于【Unity 3D】利用C#、Unity和Socket實(shí)現(xiàn)簡(jiǎn)單的在線聊天室工具(附源碼 簡(jiǎn)單易懂)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語(yǔ)言Socket編程TCP簡(jiǎn)單聊天室

    C語(yǔ)言Socket編程TCP簡(jiǎn)單聊天室

    這是一個(gè)使用C語(yǔ)言進(jìn)行套接字編程實(shí)現(xiàn)的簡(jiǎn)單聊天室, 使用Pthread庫(kù)進(jìn)行多線程執(zhí)行 服務(wù)端: svr.c 客戶(hù)端: cli.c Makefile: Makefile 執(zhí)行編譯 啟動(dòng)服務(wù)器 啟動(dòng)客戶(hù)端 聊天 退出

    2024年02月03日
    瀏覽(27)
  • Unity3d C#利用Editor編輯器拓展實(shí)現(xiàn)配置UI背景樣式一鍵設(shè)置UI背景樣式功能(含源碼)

    Unity3d C#利用Editor編輯器拓展實(shí)現(xiàn)配置UI背景樣式一鍵設(shè)置UI背景樣式功能(含源碼)

    在開(kāi)發(fā)UI滾動(dòng)列表的時(shí)候,經(jīng)常會(huì)有每項(xiàng)的背景圖不統(tǒng)一的情況,會(huì)間隔重復(fù)的情況居多。這種情況下,手動(dòng)去設(shè)置間隔一行的背景圖或者顏色是比較麻煩的。在此背景下,筆者嘗試寫(xiě)個(gè)小工具,在搭建UI時(shí)配置一下循環(huán)背景的樣式,可以通過(guò)一鍵點(diǎn)擊后設(shè)置UI背景的樣式,省

    2024年02月03日
    瀏覽(29)
  • Unity3d C#利用本地網(wǎng)頁(yè)快速打開(kāi)螢石云監(jiān)控視頻流(ezopen)實(shí)現(xiàn)云臺(tái),聲音等控制,支持WebGL平臺(tái),替代UMP播放(含源碼)

    Unity3d C#利用本地網(wǎng)頁(yè)快速打開(kāi)螢石云監(jiān)控視頻流(ezopen)實(shí)現(xiàn)云臺(tái),聲音等控制,支持WebGL平臺(tái),替代UMP播放(含源碼)

    之前我介紹了替代Universal?Media?PlayerUMP播放石云監(jiān)控視頻流(ezopen)的功能,效果還是很明顯的,筆者的測(cè)試是差不多3-5秒就能打開(kāi)監(jiān)控畫(huà)面,不過(guò)稍微遺憾的是,之前的功能是iframe打開(kāi)石云提供的播放網(wǎng)頁(yè)的形式,功能基本只有畫(huà)質(zhì)切換,聲音開(kāi)關(guān)等;具體可以移步查看(https

    2024年02月13日
    瀏覽(93)
  • 基于C# Socket實(shí)現(xiàn)的簡(jiǎn)單的Redis客戶(hù)端

    基于C# Socket實(shí)現(xiàn)的簡(jiǎn)單的Redis客戶(hù)端

    ???? Redis 是一款強(qiáng)大的高性能鍵值存儲(chǔ)數(shù)據(jù)庫(kù),也是目前 NOSQL 中 最流行 比較流行的一款數(shù)據(jù)庫(kù),它在廣泛的應(yīng)用場(chǎng)景中扮演著至關(guān)重要的角色,包括但不限于緩存、消息隊(duì)列、會(huì)話存儲(chǔ)等。在本文中,我們將介紹如何基于 C# Socket 來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Redis客戶(hù)端類(lèi) RedisClien

    2024年02月05日
    瀏覽(19)
  • Linux-Socket實(shí)現(xiàn)模擬群聊(多人聊天室)

    Linux-Socket實(shí)現(xiàn)模擬群聊(多人聊天室)

    簡(jiǎn)單版本 服務(wù)端源碼 客戶(hù)端源碼 服務(wù)器可以在特定的端口監(jiān)聽(tīng)客戶(hù)端的連接請(qǐng)求,若連接成功,服務(wù)器采用廣播的形式向當(dāng)前所有連接客戶(hù)端發(fā)送該客戶(hù)端登錄成功消息多個(gè)客戶(hù)端可以同時(shí)登錄,在源碼文件中可以配置最多群聊同時(shí)在線人數(shù)。服務(wù)端接收到客戶(hù)端發(fā)送的群

    2024年02月10日
    瀏覽(21)
  • Python web實(shí)戰(zhàn) | 使用 Flask 實(shí)現(xiàn) Web Socket 聊天室

    Python web實(shí)戰(zhàn) | 使用 Flask 實(shí)現(xiàn) Web Socket 聊天室

    ? ? 今天我們學(xué)習(xí)如何使用 Python 實(shí)現(xiàn) Web Socket,并實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天室的功能。本文的技術(shù)棧包括 Python、Flask、Socket.IO 和 HTML/CSS/JavaScript。 ? Web Socket 是一種在單個(gè) TCP 連接上進(jìn)行全雙工通信的協(xié)議。它是 HTML5 中的一部分,并且可以在瀏覽器和服務(wù)器之間創(chuàng)建實(shí)時(shí)的交互式

    2024年02月14日
    瀏覽(25)
  • 【你的第一個(gè)socket應(yīng)用】Vue3+Node實(shí)現(xiàn)一個(gè)WebSocket即時(shí)通訊聊天室

    【你的第一個(gè)socket應(yīng)用】Vue3+Node實(shí)現(xiàn)一個(gè)WebSocket即時(shí)通訊聊天室

    這篇文章主要是用WebSocket技術(shù)實(shí)現(xiàn)一個(gè) 即時(shí)通訊聊天室 ,首先先要了解為什么使用WebSocket而不是普通的HTTP協(xié)議,如果使用HTTP協(xié)議它是下面這種情況: 我發(fā)送一條消息,發(fā)送一個(gè)發(fā)送消息的請(qǐng)求;* 一直輪詢(xún)接收別人發(fā)送的消息,不管有沒(méi)有發(fā)送都要定時(shí)去調(diào)用接口。這里明

    2023年04月20日
    瀏覽(31)
  • 【Unity】Socket網(wǎng)絡(luò)通信(TCP) - 實(shí)現(xiàn)簡(jiǎn)單的多人聊天功能

    【Unity】Socket網(wǎng)絡(luò)通信(TCP) - 實(shí)現(xiàn)簡(jiǎn)單的多人聊天功能

    多客戶(hù)端連接服務(wù)器其原理是在服務(wù)端保存客戶(hù)端連入后與客戶(hù)端通信的socket,由于等待客戶(hù)端連接會(huì)阻塞主線程,所以結(jié)合多線程就能實(shí)現(xiàn)多客戶(hù)端連入功能。多人聊天只需要將A客戶(hù)端發(fā)來(lái)的消息,轉(zhuǎn)發(fā)給除A客戶(hù)端外的其他客戶(hù)端,即可實(shí)現(xiàn)。如果你還不怎么熟悉服務(wù)端

    2024年02月03日
    瀏覽(39)
  • SpringBoot與webSocket實(shí)現(xiàn)在線聊天室——實(shí)現(xiàn)私聊+群聊+聊天記錄保存

    SpringBoot與webSocket實(shí)現(xiàn)在線聊天室——實(shí)現(xiàn)私聊+群聊+聊天記錄保存

    引用參考:原文章地址:https://blog.csdn.net/qq_41463655/article/details/92410518 在此基礎(chǔ)上實(shí)現(xiàn)對(duì)聊天記錄的保存。 代碼地址:鏈接:https://pan.baidu.com/s/1IJFZDa4S_DF08773sKJWeA 提取碼:jkui 思路:新建一個(gè)實(shí)體類(lèi)用于保存聊天記錄,在消息發(fā)送時(shí),設(shè)置對(duì)象的各個(gè)值然后保存到數(shù)據(jù)庫(kù)中。

    2024年02月02日
    瀏覽(88)
  • C語(yǔ)言實(shí)現(xiàn)--基于UDP的多人在線聊天室

    C語(yǔ)言實(shí)現(xiàn)--基于UDP的多人在線聊天室

    目錄 實(shí)現(xiàn)功能 實(shí)現(xiàn)思想 實(shí)現(xiàn)代碼(部分及詳解) 服務(wù)端部分代碼 客戶(hù)端部分代碼 實(shí)現(xiàn)效果 項(xiàng)目中出現(xiàn)的問(wèn)題和解決方法 項(xiàng)目整體代碼展示 代碼優(yōu)化思路 服務(wù)端代碼 客戶(hù)端代碼 服務(wù)端可以同時(shí)連接多個(gè)客戶(hù)端; 新的客戶(hù)端連接服務(wù)端時(shí),可以在服務(wù)端顯示自己的名字并

    2024年02月04日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包