IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity3d C# 基于UGUI实现类似WX聊天气泡功能(含源码) -> 正文阅读

[游戏开发]Unity3d C# 基于UGUI实现类似WX聊天气泡功能(含源码)

前言

如题的需求本人曾在NGUI上实现过,不过当下很多年没有用NGUI了,现在的需求就需要继续在UGUI版本上实现一边,感觉配合grid 和 ContentSizeFitter等组件较快就可以实现。折腾了一个小时初步成型了,在这分享给大家。

效果

在这里插入图片描述

实现

搭建UI

我们就进行大逻辑仿WX的效果进行这Demo。分对方和自己的聊天条。

主界面

聊天主界面主要是一个滚动记录面板 输入框 和发送按钮:
在这里插入图片描述

自己消息条

这个自己的消息条包含头像和聊天气泡,聊天气泡的大小是随内容的大小进行缩放的。而且在右侧,我们按如下搭建:
在这里插入图片描述

其中注意的是Text上增加了ContentSizeFitter组件,方便我们自动转行和文字框体大小获取,而横竖的自己适应大小需要动态设置。这个我们编码的时候会实现。

其中注意的是BG节点的设置:

在这里插入图片描述

这是为了方便内容大小变动气泡变动:
在这里插入图片描述

当然TalkSelf的设置同上。

对方消息条

对方的和自己的基本类似只是位置不一样。
这个对方的消息条包含头像和聊天气泡,聊天气泡的大小是随内容的大小进行缩放的。而且在左侧,我们按如下搭建:
在这里插入图片描述

其中注意的是Text上增加了ContentSizeFitter组件,方便我们自动转行和文字框体大小获取,而横竖的自己适应大小需要动态设置。这个我们编码的时候会实现。

其中注意的是BG节点的设置:
在这里插入图片描述

这是为了方便内容大小变动气泡变动:
在这里插入图片描述

当然TalkOther的设置同上。

编码实现

这个功能的核心思路就是,根据内容的大小设置气泡背景的大小和整个消息条目的大小。在区分一下对方和自己的消息即可。

消息条类

TalkItem这个脚本挂在TalkOther和TalkSelf上,其职责就是设置内容,同步设置气泡大小。

动态ContentSizeFitter 模式:

        if (Msgtext.preferredWidth >= TextMaxWidth)
        {
            MsgRect.sizeDelta = new Vector2(TextMaxWidth, 0);
            TextCSF.horizontalFit = ContentSizeFitter.FitMode.Unconstrained;
            TextCSF.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
        }
        else
        {
            TextCSF.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
            TextCSF.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
        }

当一行时自适应高宽;当多行时只需自适应高度。

同步条目、气泡高度:

    TextBGRect.sizeDelta = MsgRect.sizeDelta + SizeScal;
    ItemRect.sizeDelta = new Vector2(ItemRect.sizeDelta.x, TextBGRect.sizeDelta.y);
transform.localScale = Vector3.one;

聊天管理类

TalkMgr的核心职责就是按类别添加聊天信息。

    public void AddTalkRecord(string msg, bool IsSelf) {
        GameObject go = Instantiate(IsSelf? SelfItem: OtherItem, TalkParent);
        TalkItem ti = go.GetComponent<TalkItem>();
        ti.SetText(msg);
}

提供此接口,参数是信息内容和发送者。

测试脚本

TalkTest 的功能就测试发送和模拟回复。

    public void ClickSend() {
        TalkMgr.instance.AddTalkRecord(ipt.text, true);
        Invoke("Reply", Random.Range(1, 4));
    }
    public void Reply() {
        string Repmsg ="";
        for(int i = 0;i < Random.Range(1, 8);i++) 
            Repmsg += "这是个回复消息!";
        TalkMgr.instance.AddTalkRecord(Repmsg, false);
}

问题

在开发过程中发现个比较2的问题,这里也分享一下。问题如下:
在这里插入图片描述

能看出来在同步框的时候明显晚了一步,这个问题是ContentSizeFitter自适应会需要一点时间,我这边修复的方法是延时了0.2秒在把scale改为1,不能使用SetActive。

项目工程

https://download.csdn.net/download/qq_33789001/83784673
如打不开说明暂未通过审核

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:58:11  更:2022-03-10 22:59:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 14:25:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码