unity制作多人联网聊天室

技术概述

这个技术主要是使用unity在前端来实现一个通过Post方法从后端链接获取聊天数据,可以进行实时的联网聊天的聊天室功能。

技术详述

我先分几段把代码贴出来
这一段是最开始获取基本的房间信息
刚开始先通过post从服务器获取房间里的一些数据,包括房间的总人数peoNum,房间用户的账号数组acc[]等等。

    string str = Post("http://47.119.130.124:90/waitStart/getRoomInfo", "");       //中间http后面要改成自己服务器的地址  
    RootRoom room = JsonUtility.FromJson<RootRoom>(str);  //通过post获取数据
    peoNum = room.playerList.Count();   //获取房间的总人数
    for(int i=0;i<peoNum;i++){
        acc[i]=room.playerList[i].playerAccountNum;
        if(room.playerList[i].playerName==PlayerPrefs.GetString("Nickname")){
                mycolor=i;        //当前用户所代表的颜色
        }
    }

房间内还没有人发送过一条消息时当前用户发送第一条消息
后面的内容全都放在了update之中(如果怕服务器受不了太快的更新可以加一个限制更新速度的语句,一些相似度较高的内容可以单独作为一个函数写出来,函数这块儿我当时没有留意可能有做的不足的地方)。之所以要加一个root.roomChatInfo == null的判断是因为刚开始做的时候当房间内没有人发过消息直接使用root.roomChatInfo.Count()会因为roomChatInfo是空的报错没办法使用,于是在这里多加一条房间内发送第一条消息的路线,这以后roomChatInfo就不为空了。

string str = Post("http://47.119.130.124:90/common/getChatInfo", "");//中间http后面要改成自己服务器的地址 
RootChat root = JsonUtility.FromJson<RootChat>(str);

if (root.roomChatInfo == null)   //判断当前房间内还未有人发过信息
{
    if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter))
    {
        if (chatInput.text != "")
        {
            message++;            //用来记录当前这个客户端已经更新了几条数据的参数
            switch (mycolor)     //我做的这个会根据每个用户不同的颜色编号来决定用户发送消息时候昵称的颜色
            {
                case 0:
                    Onecolor="blue";
                    break;       
                case 1:
                    Onecolor="green";
                    break;
                case 2:
                    Onecolor="red";
                    break;
                case 3:
                    Onecolor="yellow";
                    break;
                case 4:
                    Onecolor="black";
                    break;
            }
            string addText = "\n  " + "<color="+Onecolor+">" + PlayerPrefs.GetString("Nickname") + "</color>: " + chatInput.text + message;
            chatText.text += addText;
            string userData = "{\"type\":\"" + "room" + "\",\"context\":\"" + chatInput.text + "\"}";
            Post("http://47.119.130.124:90/common/sendChatInfo", userData);   //中间http后面要改成自己服务器的地址 
            chatInput.text = "";
            chatInput.ActivateInputField();
            Canvas.ForceUpdateCanvases();       
            scrollRect.verticalNormalizedPosition = 0f; 
            Canvas.ForceUpdateCanvases();
        }
    }
}

客户端更新别人发送的消息
这是正常情况下聊天室更新聊天信息的情况,颜色主要是根据用户在acc[]数组中的顺序来确定的,这里还省略了一段当前用户发送消息的代码,和上面一段类似就没有贴出来

if (root.roomChatInfo.Count() != message)
{
    message++;
    for(int i=0;i<peoNum;i++)//先把这个消息发送者的颜色判断出来acc[]数组用来存放房间内所有用户的账号
    {
        if(acc[i]==root.roomChatInfo[message - 1].accountNum) 
        {
            color=i;
            break;
        }
    }
    switch (color)
    {
        case 0:
            Onecolor="blue";
            break;
        case 1:
            Onecolor="green";
            break;
        case 2:
            Onecolor="red";
            break;
        case 3:
            Onecolor="yellow";
            break;
        case 4:
            Onecolor="black";
            break;
     }
     string addText = "\n  " + "<color="+Onecolor+">" + root.roomChatInfo[message - 1].accountNum + "</color>: " + root.roomChatInfo[message - 1].content;
     chatText.text += addText;
     Canvas.ForceUpdateCanvases();  
     scrollRect.verticalNormalizedPosition = 0f; 
     Canvas.ForceUpdateCanvases();
}

流程图如下
unity 消息管理 unity聊天系统_聊天室

进行总结
在这次的团队项目中聊天室这个功能是我自己查找资料完成的,应该说参考的链接给了我很大的帮助,我只是在参考链接的基础上对界面进行了一些修改,同时增加了联网聊天和根据房间内用户不同的顺序来显示不同颜色用户名的功能,整体过程还算顺利,需要注意的就是roomInfo数组可能为空,导致.count()报错的问题,需要在前面多加一个判断。

参考链接
unity制作聊天室界面