【原理】

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

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

【步骤】

  • 新建一个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<ScrollRect>();scrollbar = GetComponentInChildren<Scrollbar>();content = transform.Find("ViewPort").Find("Content").GetComponent<RectTransform>();lastPos = 0;halfHeadLength = leftBubblePrefab.transform.Find("head").GetComponent<RectTransform>().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.text = content;if (text.preferredWidth > maxTextWidth){text.GetComponent<LayoutElement>().preferredWidth = maxTextWidth;}//计算气泡的水平位置float hPos = isMy ? stepHorizontal / 2 : -stepHorizontal / 2;//计算气泡的垂直位置float vPos = - stepVertical - halfHeadLength + lastPos;newBubble.transform.localPosition = new Vector2(hPos, vPos);//更新lastPosImage bubbleImage = newBubble.GetComponentInChildren<Image>();float imageLength = GetContentSizeFitterPreferredSize(bubbleImage.GetComponent<RectTransform>(), bubbleImage.GetComponent<ContentSizeFitter>()).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<string> dialogue = new List<string>();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微信聊天框界面制作相关推荐

  1. Andriod 实现一个微信聊天框(一)

    Andriod 实现一个微信聊天框(一) 这周做了第一次Andriod作业,虽然是对着老师的视频桥的代码,还是遇到了相当多的技术问题和bug,再次记录一下解决问题的过程,以便于后期复习使用. 这次实验 ...

  2. 微信聊天框如何隐藏(微信教程分享)

    微信是很多人经常使用的社交平台.其中还包括很多隐私内容.如果你担心别人借手机的时候翻来覆去.可以隐藏指定的聊天对话框.所以其他人在聊天界面找不到.你知道怎么设置吗?快来一起看看吧. 微信聊天框如何隐藏 ...

  3. 元素浮动布局,微信聊天框

    元素浮动布局,微信聊天框 知识导入: 文字的浮动布局 浮动元素会脱离网页文档,与其他元素发生重叠,但是与文字内容不会发生重叠即文字环绕效果 由此要注意:浮动元素是不占据空间的, 容器浮动:多个容器达到 ...

  4. 微信聊天框(html+css+js)实现

    微信聊天框(html+css+js)实现 1.来源 这是我在哔哩哔哩的上面的一个js网课的案例,说是有未添加js的版本(也就是只有样式的html),但我找不到,就只能自己写,比较丑. 主要是小图标,都 ...

  5. Unity NGUI 网络斗地主 -界面制作

    Unity NGUI 网络斗地主 -界面制作 源文件在群(63438968群共享!) @灰太龙 这一节说一下NGUI的界面摆放,并且教会大家使用NGUI的自适应功能! 在这里感谢@Gamer,是他给我 ...

  6. 2022在线微信对话生成器源码,抖音微信聊天搞笑视频制作神器

    在线微信对话生成器源码,抖音微信聊天搞笑视频制作神器 微信对话生成器,是一款在线微信聊天对话制作的工具,它可以设置苹果或安卓状态栏,包括手机电量.手机时间等,还可以设置不同用户的角色,然后发送文字.语 ...

  7. android qq功能实现原理,Android QQ、微信聊天消息界面设计原理与实现

     Android QQ.微信聊天消息界面设计原理与实现 原理:Android平台上,典型的以腾讯的QQ.微信这些聊天消息界面通常可以采用ListView设计与实现,需要使用ListView 适配器 ...

  8. Android QQ、微信聊天消息界面设计原理与实现

     原理:Android平台上,典型的以腾讯的QQ.微信这些聊天消息界面通常可以采用ListView设计与实现,需要使用ListView 适配器Adapter的getItemViewType()和g ...

  9. php类似微信聊天框,仿微信聊天功能

    摘要: 微信聊天 window.onload = () => { // 获取按钮 let btn = document.getElementById('btn'); // 获取输入框 let t ...

最新文章

  1. Vue Router路由及路由重定向
  2. linux文件-access函数
  3. 关于汉诺塔,C++代码,代码效果演算
  4. 在日常办公能做什么_日常生活中电烤箱能烤制什么美食呢?
  5. 史上最详细的IDEA优雅整合Maven+SSM框架(详细思路+附带源码)
  6. FPGA系统时间戳偶尔异常分析及定位
  7. HP server ILO
  8. bin转txt工具_Shell笔记之常用工具
  9. Delphi XE11APP编译出错
  10. 安装cudnn时, library和deb模式的区别
  11. php让iframe 重定向,利用可以在iframe中嵌入网页进行重定向
  12. Unity3d的ShadeSH9环境光的球谐函数的应用
  13. 如何从官网下载hibernate
  14. java一定时间间隔的定时任务_详解java定时任务
  15. Django3 快速入门
  16. CTSC2016APIO2016爆零记
  17. 使用近场探头和电流探头进行EMI干扰排查
  18. 三国志战略版:四大阵营武将总结——魏国篇
  19. 50多款Android运用法式遭Rootkit病毒侵扰进犯
  20. 被放逐的皇后 金建云

热门文章

  1. github-copilot的使用步骤
  2. JAVA中常见练习题
  3. mRemote 中VNC的使用
  4. HTML中overflow的作用(转)
  5. 如何把Python列表中的元素重复n次
  6. python制作窗口界面_python爬虫如何制作可视化界面?(pyqt5环境配置篇)
  7. handlebar.js模板使用方法简记
  8. 贵金属跌跌不休竞相比惨黄金跌去二位数钯金跌去三位数
  9. 【Java基础】属性编辑器PropertyEditor
  10. #边学边记 必修4 高项:对事的管理 第4章 项目进度管理之估算活动资源