千家信息网

Unity如何实现微信聊天框界面

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了Unity如何实现微信聊天框界面,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。【原理】一个聊天界面主要由三个部分组成
千家信息网最后更新 2026年10月31日Unity如何实现微信聊天框界面

这篇文章主要介绍了Unity如何实现微信聊天框界面,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

【原理】

一个聊天界面主要由三个部分组成:内容区、可见区、滑动条

可见区在内容区上边,内容区会随着聊天内容变得非常长,但只有位于可见区的部分才能被看见,其他区域的看不见。通过滑动条上下移动内容区,看见的内容发生变化。

【步骤】

  • 新建一个UI->Panel,重命名为ChatPanel,添加Scroll Rect组件

  • 在ChatPanel下新建一个UI->Panel,重命名为ViewPort,添加Mask组件

  • 在ChatPanel下新建一个UI->Scrollbar,Direction选择Bottom To Top

  • 在ViewPort下新建一个UI->Panel,移除Image组件,重命名为Content,调整其Anchor和Pivot

  • 调整ViewPort、Content、Scrollbar的Height一致

  • 给Scroll Rect组件复制如下

  • 创建聊天气泡

效果如下

  • 在bubble上添加 ContentSizeFitter和Vertical Layout Group组件,使得bubble大小随文本大小改变。在Text上添加LayoutElement。效果如下

  • 创建右边的聊天气泡,效果如下:

  • 新建一个脚本,名为ChatPanelManager,挂在ChatPanel下

【脚本】

using UnityEngine;using UnityEngine.UI; public class ChatPanelManager : MonoBehaviour{    public GameObject leftBubblePrefab;    public GameObject rightBubblePrefab;     private ScrollRect scrollRect;    private Scrollbar scrollbar;        private RectTransform content;     [SerializeField]     private float stepVertical; //上下两个气泡的垂直间隔    [SerializeField]     private float stepHorizontal; //左右两个气泡的水平间隔    [SerializeField]    private float maxTextWidth;//文本内容的最大宽度     private float lastPos; //上一个气泡最下方的位置    private float halfHeadLength;//头像高度的一半     public void Init()    {        scrollRect = GetComponentInChildren();        scrollbar = GetComponentInChildren();        content = transform.Find("ViewPort").Find("Content").GetComponent();        lastPos = 0;        halfHeadLength = leftBubblePrefab.transform.Find("head").GetComponent().rect.height / 2;    }     public void AddBubble(string content, bool isMy)    {        GameObject newBubble = isMy ? Instantiate(rightBubblePrefab, this.content) : Instantiate(leftBubblePrefab, this.content);        //设置气泡内容        Text text = newBubble.GetComponentInChildren();        text.text = content;        if (text.preferredWidth > maxTextWidth)        {            text.GetComponent().preferredWidth = maxTextWidth;        }        //计算气泡的水平位置        float hPos = isMy ? stepHorizontal / 2 : -stepHorizontal / 2;        //计算气泡的垂直位置        float vPos = - stepVertical - halfHeadLength + lastPos;        newBubble.transform.localPosition = new Vector2(hPos, vPos);        //更新lastPos        Image bubbleImage = newBubble.GetComponentInChildren();        float imageLength = GetContentSizeFitterPreferredSize(bubbleImage.GetComponent(), bubbleImage.GetComponent()).y;        lastPos = vPos - imageLength;        //更新content的长度        if (-lastPos > this.content.rect.height)        {            this.content.sizeDelta = new Vector2(this.content.rect.width, -lastPos);        }         scrollRect.verticalNormalizedPosition = 0;//使滑动条滚轮在最下方    }     public Vector2 GetContentSizeFitterPreferredSize(RectTransform rect, ContentSizeFitter contentSizeFitter)    {        LayoutRebuilder.ForceRebuildLayoutImmediate(rect);        return new Vector2(HandleSelfFittingAlongAxis(0, rect, contentSizeFitter),            HandleSelfFittingAlongAxis(1, rect, contentSizeFitter));    }     private float HandleSelfFittingAlongAxis(int axis, RectTransform rect, ContentSizeFitter contentSizeFitter)    {        ContentSizeFitter.FitMode fitting =            (axis == 0 ? contentSizeFitter.horizontalFit : contentSizeFitter.verticalFit);        if (fitting == ContentSizeFitter.FitMode.MinSize)        {            return LayoutUtility.GetMinSize(rect, axis);        }        else        {            return LayoutUtility.GetPreferredSize(rect, axis);        }    }}

【测试脚本--按空格添加内容】

using System.Collections.Generic;using UnityEngine;  public class test : MonoBehaviour{    public ChatPanelManager cpm;    private int count;    private List dialogue = new List();    void Start()    {        cpm.Init();        dialogue.Add("永恒之星");        dialogue.Add("永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星");        dialogue.Add("永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星永恒之星");    }     void Update()    {        if (Input.GetKeyDown(KeyCode.Space))        {           cpm.AddBubble(dialogue[count],Random.Range(0,2)>0);           count++;           if (count > dialogue.Count-1)           {               count = 0;           }        }    }}

【测试结果】

【补充说明】

这里核心是实现了聊天气泡内容的添加,至于头像和name,比较简单,我们可以在AddBubble方法中自己补充实现。

感谢你能够认真阅读完这篇文章,希望小编分享的"Unity如何实现微信聊天框界面"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

之星 内容 气泡 组件 篇文章 界面 位置 效果 脚本 上下 两个 大小 头像 文本 水平 部分 更新 测试 调整 一致 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网和科技技术 互联网科技公司的优势 智网互联网科技 迪茉互联网科技 互联网科技logo设计 上海卓越科技 互联网 人人互联网科技是培训 互联网科技股有哪些 海南购全球互联网科技 太原新华互联网科技学校怎么样 互联网科技产品 成都互联网科技公司工作好不好 洛阳共同富裕互联网科技有限公司 产业互联网科技服务公司 互联网科技股为什么大涨 广东鹅鹅鹅互联网科技有限公司 上海万顺科技互联网有限公司招聘 数字互联网科技有限公司 重庆科技产业互联网有哪些 互联网大会出现的黑科技 广东万易互联网科技有限公司惠州分公司 广州淘业互联网络科技 礼当家互联网科技 米客互联网科技 国外互联网科技网站 科技赋能互联网健康 厦门千工互联网科技有限公司 广州新华互联网科技学校电竞方面 深圳市罗太互联网科技有限公司 互联网科技快讯热点
0