聊天功能,实现:每增加一条消息整体往上移动,滚动查看聊天记录

别说谁变了你拦得住时间么 提交于 2019-12-02 13:01:29
如今直播APP火的简直不像样子了。在直播间里会有观众和主播交流的功能。主要方式是主播动口(说),观众动手(打字)。这篇文章讲解一下观众客户端聊天功能的实现。这里为了更清楚的看到效果功能,我做了一个客户端单机版来讲解。(该版本为unity5.3.2f1)
需求功能是:观众新发送了聊天消息会把之前的消息顶到上面,用户也可以通过滚动聊天栏翻看之前的用户聊天记录。

先看下面gif图功能:

 


下面讲如何实现:
第一:整个功能我分了三个组件,一个蓝色背景image,一个用来滑动的image(上图图中的黄色光芒图片),一个text的预设物体。(如下图:)
为了方便将这三个物体的pivot都设置为(0,0)。
如下图(根据需求可自定义大小坐标等):

 




第二:给蓝色背景图片添加滑动组件和Mask组件,指定滑动目标为光芒的那个图片。
添加脚本slidertext,然后把text的预设和预设生成的父物体(光芒的那个图片)拖到对应位置。
如下图:

 


第三:脚本slidertext的源码:(这才是重点)
该代码和之前我写的弹幕生产的方法相似(弹幕方法链接http://www.manew.com/thread-95590-1-1.html

脚本里实现了两种文本移动方法:一种是直接跳到上面的位置,另个是缓慢移动上去(上面gif图的样子),缓慢移动使用了DoTween插件来实现。

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using UnityEngine.UI;  
  4. using DG.Tweening;  
  5. using System.Collections.Generic;  
  6. using System.Text.RegularExpressions;  
  7. using System;  
  8.    
  9. public class productsliderm : MonoBehaviour  
  10. {  
  11.     public GameObject Textslidermessage, Textslidermessage_parents;  
  12.     private GameObject texts;//生成的物体  
  13.     public Queue<GameObject> Textslider_queue = new Queue<GameObject>();//物体的队列(生成物体)    
  14.       
  15.      
  16.       
  17.        
  18.        
  19.     private Vector3 textpositon;  
  20.     private Quaternion textrotation;  
  21.    
  22.     private string content;//文字内容(ceshi)  
  23.     float production_timer = 2;//生成的时间间隔  
  24.    
  25.    
  26.     void Update()  
  27.     {  
  28.         #region//仅测试用  
  29.    
  30.         production_timer -= Time.deltaTime;  
  31.    
  32.         if (production_timer <= 0f)  
  33.         {  
  34.             int i = UnityEngine.Random.Range(0, DanMuStrings.Length);//弹幕的随机内容  
  35.             content = DanMuStrings[i];  
  36.    
  37.             
  38.             createDanMuEntity(content);  
  39.             production_timer = 2;  
  40.         }  
  41.         #endregion  
  42.    
  43.    
  44.    
  45.         
  46.         if (Textslider_queue.Count > 100)//退出队列方法一  
  47.         {  
  48.             GameObject go = Textslider_queue.Peek();  
  49.             Textslider_queue.Dequeue();  
  50.                 Destroy(go);//销毁弹幕  
  51.                
  52.         }  
  53.     }  
  54.    
  55.       
  56.     public void createDanMuEntity(string textMsg)  
  57.     {  
  58.         
  59.    
  60.         texts = (GameObject)(Instantiate(Textslidermessage, textpositon, textrotation));//生成text框  
  61.         if (texts != null)  
  62.         {  
  63.             texts.transform.SetParent(Textslidermessage_parents.transform);  
  64.    
  65.             texts.transform.localScale = new Vector3(1, 1, 1);  
  66.             textrotation.eulerAngles = new Vector3(0, 0, 0);  
  67.             texts.transform.localRotation = textrotation;  
  68.             texts.transform.localPosition = new Vector3(0, 0, 0);  
  69.    
  70.                
  71.             texts.GetComponent<Text>().text = textMsg;  
  72.    
  73.             
  74.    
  75.             if (texts.GetComponent<DOTweenAnimation>() == null)//移动组件添加  
  76.                 texts.AddComponent<DOTweenAnimation>();  
  77.    
  78.             
  79.    
  80.    
  81.    
  82.             if (Textslider_queue.Count >= 1)  
  83.             {  
  84.                    
  85.                 foreach (GameObject textssliders in Textslider_queue.ToArray())//凡是在队列中的每一个都要移动  
  86.                 {  
  87.                     Debug.Log("fouzei++++" + texts.GetComponent<RectTransform>().sizeDelta.y);  
  88.    
  89.                     //直接移动  
  90.                     //textssliders.transform.localPosition= new Vector3(textssliders.transform.localPosition.x, textssliders.transform.localPosition.y + texts.GetComponent<RectTransform>().sizeDelta.y, 0f);  
  91.   
  92.   
  93.                     #region //缓缓移动   
  94.    
  95.                     Vector3 kk  = new Vector3(textssliders.transform.localPosition.x, textssliders.transform.localPosition.y + texts.GetComponent<RectTransform>().sizeDelta.y, 0f);  
  96.                      
  97.                     textssliders.transform.DOLocalMove(kk, 2,true);  
  98.                     #endregion  
  99.                 }  
  100.    
  101.             }  
  102.    
  103.             Textslider_queue.Enqueue(texts);//添加到队列  
  104.         }  
  105.    
  106.           
  107.     }  
  108.    
  109.    
  110.    
  111.    
  112.     [HideInInspector]  
  113.   
  114.     #region 测试用  
  115.     public string[] DanMuStrings =  
  116.    {  
  117.         "这个剧情也太雷人了吧!",  
  118.         "还是好莱坞的电影经典啊,这个太次了还是好莱坞的电影经典啊,这个太次了",  
  119.         "是电锯惊魂的主角,尼玛",  
  120.         "这个游戏还是很良心的么",  
  121.         "卧槽还要花钱,这一关也太难卧槽还要花钱,这一关也太难了卧槽还要花钱,这一关也太难了卧槽还要花钱,这一关也太难了了",  
  122.         "这个游戏好棒偶",  
  123.         "全是傻逼",  
  124.         "求约:13122785566",  
  125.         "最近好寂寞啊,还是这个游戏好啊是胸再大点就更是胸再大点就更是胸再大点就更",  
  126.         "难道玩游戏还能撸",  
  127.         "办证:010 - 888888",  
  128.         "为什么女主角没有死?",  
  129.         "好帅呦,你这个娘们儿",  
  130.         "欠揍啊,东北人不知道啊",  
  131.         "我去都是什么人啊,请文明用语还是好莱坞的电影经典啊,这个太次了是胸再大点就更",  
  132.         "这个还是不错的",  
  133.         "要是胸再大点就更好了",  
  134.         "这个游戏必须顶啊",  
  135.         "还是好莱坞的电影经典啊,这个太次了还是好莱坞的电影经典啊,这个太次了怎么没有日本动作爱情片中的角色呢?",  
  136.         "好吧,这也是醉了!",  
  137.         "他只想做一个安静的美男子!"  
  138.     };  
  139.     #endregion  
  140.    
  141. }  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!