unity弹幕功能实现

近年来直播app和视频app如日中天,在这些app里往往会有一个弹幕功能。实际的项目中肯定是用服务器客户端直接的数据来控制的,这里只在客户端进行测试实现弹幕核心功能。

下面说的就是我是如何实现弹幕功能的。

首先是需求:要求全屏有四行弹幕,从下至上排列,每行依次显示,弹幕从右往左移动。弹幕移动出屏幕就消失。

制作步骤:

1)建立弹幕文字的prefab和要显示的UI;(下图中DanmuText就是弹幕text的预设物体,parents是弹幕在UI中作为parents的子物体)

2)新建脚本productdanmu添加给Canvas,然后将弹幕预设和弹幕的父物体拖进去(如上图)。

重点是productdanmu脚本中弹幕移动的实现

下面是源码:


usingUnityEngine;

usingSystem.Collections;

usingUnityEngine.UI;

usingDG.Tweening;

usingSystem.Collections.Generic;

usingSystem.Text.RegularExpressions;

usingSystem;

publicclassproductdanmu : MonoBehaviour

{

publicGameObject

textsdanmu, Danmu_parents;//弹幕预设物体和其父物体

privateGameObject

texts;//生成的弹幕物体

privateQueue

texts_queue =newQueue();//弹幕物体的队列

privatefloatproduction_timer;//生成弹幕的时间间隔

privateint[]

numb =newint[]

{ 39, 139, 239, 339 };//四行弹幕的位置

privateintRow_index;//弹幕行数变化

privateinta;////弹幕行数变化中间变量(桥的作用)

privateVector3

textpositon;//生成弹幕位置

privateQuaternion

textrotation;//生产弹幕角度

privatestringcontent;//弹幕文字内容

voidStart()

{

Row_index

= numb[0];//默认弹幕生产在第一行

textpositon

=newVector3(96,

Row_index, 0);//弹幕默认位置

textrotation.eulerAngles

=newVector3(0,

0, 0);

production_timer

= 2f;

}

voidUpdate()

{

production_timer-=Time.deltaTime;

if(production_timer<=0f)

{

inti

= UnityEngine.Random.Range(0, DanMuStrings.Length);//弹幕的随机内容

content

= DanMuStrings[i];

createDanMuEntity();//调用生成弹幕方法

production_timer

= 2f;//每隔2秒生成一个弹幕

}

#region

判断应该在第几行

foreach(GameObject

texintexts_queue.ToArray())//判断每一行是否满了

{

if(tex.transform.localPosition.y

== numb[0])//第一行

{

a

= 2;

}

else

if(tex.transform.localPosition.y

== numb[1])//第二行

{

a

= 3;

}

else

if(tex.transform.localPosition.y

== numb[2])//第三行

{

a

= 4;

}

else

if(tex.transform.localPosition.y

== numb[3])//第4行

{

a

= 1;

}

}

switch(a)

{

case1:

Row_index

= numb[0];

break;

case2:

Row_index

= numb[1];

break;

case3:

Row_index

= numb[2];

break;

case4:

Row_index

= numb[3];

break;

default:

Debug.Log("没有满足任何一行");

break;

}

#endregion

if(texts_queue.Count

>0)//退出队列方法一(节省资源开销)

{

GameObject

go = texts_queue.Peek();

if(go.transform.localPosition.x

< -999)//当弹幕位置移出屏幕

{

texts_queue.Dequeue();//移出队列

Destroy(go);//销毁弹幕

Debug.Log("save==="+

texts_queue.Count);

}

}

//foreach

(GameObject tex in texts_queue.ToArray())//退出队列方法二(耗费资源开销)

//{

//

if (tex.transform.localPosition.x < -999)//当弹幕位置移出屏幕

//

{

//

texts_queue.Dequeue();//移出队列

//

Destroy(tex);//销毁弹幕

//

Debug.Log("save===" + texts_queue.Count);

//

}

//}

}

[HideInInspector]

#region

弹幕内容(测试用)

publicstring[]

DanMuStrings =

{

"这个剧情也太雷人了吧!",

"还是好莱坞的电影经典啊,这个太次了还是好莱坞的电影经典啊,这个太次了",

"是电锯惊魂的主角,尼玛",

"这个游戏还是很良心的么",

"卧槽还要花钱,这一关也太难卧槽还要花钱,这一关也太难了卧槽还要花钱,这一关也太难了卧槽还要花钱,这一关也太难了了",

"这个游戏好棒偶",

"全是傻逼",

"求约:13122785566",

"最近好寂寞啊,还是这个游戏好啊是胸再大点就更是胸再大点就更是胸再大点就更",

"难道玩游戏还能撸",

"办证:010

- 888888",

"为什么女主角没有死?",

"好帅呦,你这个娘们儿",

"欠揍啊,东北人不知道啊",

"我去都是什么人啊,请文明用语还是好莱坞的电影经典啊,这个太次了是胸再大点就更",

"这个还是不错的",

"要是胸再大点就更好了",

"这个游戏必须顶啊",

"还是好莱坞的电影经典啊,这个太次了还是好莱坞的电影经典啊,这个太次了怎么没有日本动作爱情片中的角色呢?",

"好吧,这也是醉了!",

"他只想做一个安静的美男子!"

};

#endregion

publicvoidcreateDanMuEntity()//生成弹幕和移动弹幕

{

texts

= (GameObject)(Instantiate(textsdanmu, textpositon, textrotation));//生成弹幕

if(texts

!=null)

{

texts.transform.SetParent(Danmu_parents.transform);//设置父物体

//

texts.transform.parent = Danmu_parents.transform;//设置父物体的另种方法

texts.transform.localScale

=newVector3(1,

1, 1);

textrotation.eulerAngles

=newVector3(0,

0, 0);

texts.transform.localRotation

= textrotation;

texts.transform.localPosition

=newVector3(290,

Row_index, 0);//--弹幕移动的起始位置X

texts.transform.GetComponent().text

= content;//弹幕内容

if(texts.GetComponent()

==null)

texts.AddComponent();//添加DOTween插件

texts.transform.DOLocalMoveX(-1200,

20);//移动弹幕(20秒移动到-1200的位置)

}

texts_queue.Enqueue(texts);//生成的弹幕添加到队列

}

}

代码中的注释已经讲解了弹幕功能制作的每一步。大致思路是:

每隔2秒创建一个弹幕,然后使用DOTWeen插件进行弹幕移动和位置控制;用队列对生成的弹幕先后顺序进行控制和销毁。

运行效果如下;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,716评论 0 33
  • 单页应用的一个特点就是即时响应,对发生变化数据实现 UI 的快速变更。实现的基础技术不外乎 AJAX 和 WebS...
    窦豆逗阅读 916评论 0 0
  • 导语 创意写作:跳出一般的专业新闻、学术以及技术形式进行文学创作。 记录独特的经历 和有兴趣的人分享经验 对身心健...
    书山寻路蔡学士阅读 1,162评论 0 0
  • 如何用python做一些黑客的,很酷的事情? 安装python python 模块:pywin32 module、...
    法号无涯阅读 724评论 0 0
  • 明天要上班啦!还是有点小激动,本来以为不会有什么感觉,可是真要离开时又会舍不得,毕竟在那里生活了二十多年,不短了,...
    潘丽旭阅读 222评论 0 2