Unity3D多線程UI之聊天框

先附上git地址

https://github.com/huqiang0204/huqiang.UnitySubThreadUI

代碼量比較多团滥,UI設(shè)計(jì)可以去看示例

這里我綁定了三個(gè)模型多柑,一個(gè)左邊對(duì)話,右邊對(duì)話和中間旁白茎截,綁定模型可以自由定制

public class ChatBoxPage:UIPage

{

? ? class View

? ? {

? ? ? ? public UIContainer container;

? ? ? ? public ModelElement Left;//左邊人說(shuō)話的模型

? ? ? ? public ModelElement Right;//右邊人說(shuō)話的模型

? ? ? ? public ModelElement Center;//中間旁白模型

? ? ? ? public EventCallBack narrator;//切換到旁白按鈕

? ? ? ? public EventCallBack hero;//切換到主角按鈕

? ? ? ? public EventCallBack supporter;//切換到配角按鈕

? ? ? ? public EventCallBack send;

? ? ? ? public TextInput input;//輸入框

? ? ? ? public EventCallBack Last;

? ? ? ? public EventCallBack Next;

? ? }

? ? View view;

? ? class TextDialogue//左右對(duì)話UI模型,可自由定制

? ? {

? ? ? ? public RawImageElement avatar;

? ? ? ? public TextElement name;

? ? ? ? public EmojiElement content;

? ? ? ? public ModelElement back;

? ? }

? ? class Narrator//旁白UI模型,可自由定制

? ? {

? ? ? ? public EmojiElement content;

? ? }

? ? class DialogueData//左右對(duì)話數(shù)據(jù)模型案训,可自由定制

? ? {

? ? ? ? public string avatar;

? ? ? ? public string name;

? ? ? ? public string content;

? ? ? ? public Vector2 contentSize;

? ? }

? ? class NarratorData//旁白數(shù)據(jù)模型,可自由定制

? ? {

? ? ? ? public string content;

? ? ? ? public Vector2 contentSize;

? ? }

? ? UILinker<TextDialogue, DialogueData> LeftLink, RightLink;

? ? UILinker<Narrator, NarratorData> CenterLink;

? ? public override void Initial(ModelElement parent, object dat = null)

? ? {

? ? ? ? view = LoadUI<View>("baseUI", "con");

? ? ? ? base.Initial(parent, dat);

? ? ? ? InitialEvent();

? ? ? ? view.Left.activeSelf = false;

? ? ? ? view.Right.activeSelf = false;

? ? ? ? view.Center.activeSelf = false;

? ? }

? ? int index = 0;

? ? void InitialEvent()

? ? {

? ? ? ? LeftLink = new UILinker<TextDialogue, DialogueData>(view.container, view.Left);

? ? ? ? LeftLink.ItemUpdate = DialogueItemUpdate;

? ? ? ? RightLink = new UILinker<TextDialogue, DialogueData>(view.container, view.Right);

? ? ? ? RightLink.ItemUpdate = DialogueItemUpdate;

? ? ? ? CenterLink = new UILinker<Narrator, NarratorData>(view.container, view.Center);

? ? ? ? CenterLink.ItemUpdate = NarratorItemUpdate;

? ? ? ? view.send.Click = SendClick;

? ? ? ? view.narrator.Click = (o, e) => { index = 0; };

? ? ? ? view.hero.Click = (o, e) => { index = 1; };

? ? ? ? view.supporter.Click = (o, e) => { index = 2; };

? ? ? ? view.Last.Click = (o, e) => { LoadPage<ScrollExTestPage>(); };

? ? ? ? view.Next.Click = (o, e) => { LoadPage<AniTestPage>(); };

? ? }

? ? float y = 0;

? ? void InputValueChanged(TextInput input)

? ? {

? ? ? ? TextElement.AsyncGetSizeY("", new Vector2(800, 120), 28, new EmojiString(input.InputString), FontStyle.Normal,

? ? ? ? ? ? (o) => {

? ? ? ? ? ? ? ? var mod = input.TextCom.model;

? ? ? ? ? ? ? ? var h = o.y - mod.data.sizeDelta.y;

? ? ? ? ? ? ? ? if (o.y > y)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if (h > 0)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? mod.data.sizeDelta = o;

? ? ? ? ? ? ? ? ? ? ? ? mod.data.localPosition.y += (o.y - y) / 2;

? ? ? ? ? ? ? ? ? ? ? ? mod.IsChanged = true;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? y = o.y;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? }

? ? void DialogueItemUpdate(TextDialogue txt, DialogueData dat, int index)

? ? {

? ? ? ? var model = txt.avatar.model.parent;

? ? ? ? model.data.sizeDelta.y = dat.contentSize.y + 70;

? ? ? ? txt.back.data.sizeDelta.x = dat.contentSize.x + 40;

? ? ? ? txt.back.data.sizeDelta.y = dat.contentSize.y + 20;

? ? ? ? txt.name.text = dat.name;

? ? ? ? txt.content.text = dat.content;

? ? ? ? ModelElement.ScaleSize(txt.avatar.model.parent);

? ? }

? ? void NarratorItemUpdate(Narrator nar, NarratorData dat, int index)

? ? {

? ? ? ? var mod = nar.content.model.parent;

? ? ? ? mod.data.sizeDelta.y = dat.contentSize.y + 80;

? ? ? ? nar.content.text = dat.content;

? ? ? ? ModelElement.ScaleSize(mod);

? ? }

? ? void SendClick(EventCallBack ele, UserAction action)

? ? {

? ? ? ? if (view.input.InputString == "")

? ? ? ? ? ? return;

? ? ? ? switch (index)

? ? ? ? {

? ? ? ? ? ? case 0:

? ? ? ? ? ? ? ? AddCenterData(view.input.InputString);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case 1:

? ? ? ? ? ? ? ? AddRightData(view.input.InputString);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case 2:

? ? ? ? ? ? ? ? AddLeftData(view.input.InputString);

? ? ? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? view.input.InputString = "";

? ? ? ? if (view.input.InputString == "")

? ? ? ? ? ? return;

? ? ? ? switch (index)

? ? ? ? {

? ? ? ? ? ? case 0:

? ? ? ? ? ? ? ? AddCenterData(view.input.InputString);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case 1:

? ? ? ? ? ? ? ? AddRightData(view.input.InputString);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case 2:

? ? ? ? ? ? ? ? AddLeftData(view.input.InputString);

? ? ? ? ? ? ? ? break;

? ? ? ? }

? ? ? ? view.input.InputString = "";

? ? ? ? var mod = view.input.TextCom.model;

? ? ? ? mod.data.sizeDelta.y = 120;

? ? ? ? mod.data.localPosition.y = 0;

? ? ? ? y = 0;

? ? ? ? mod.IsChanged = true;

? ? }

? ? void AddLeftData(string content)

? ? {

? ? ? ? DialogueData dialogue = new DialogueData();

? ? ? ? dialogue.name = "配角";

? ? ? ? dialogue.content = content;

? ? ? ? TextElement.AsyncGetSizeY("", new Vector2(780, 70), 28, new EmojiString(dialogue.content), FontStyle.Normal,

? ? ? ? ? ? (o) => {//異步獲取輸入文字高度

? ? ? ? ? ? ? ? dialogue.contentSize = o;

? ? ? ? ? ? ? ? float h = o.y + 70;

? ? ? ? ? ? ? ? if (h < 140)

? ? ? ? ? ? ? ? ? ? h = 140;

? ? ? ? ? ? ? ? LeftLink.AddData(dialogue, h);

? ? ? ? ? ? ? ? view.container.Move(h);

? ? ? ? ? ? });

? ? }

? ? void AddRightData(string content)

? ? {

? ? ? ? DialogueData dialogue = new DialogueData();

? ? ? ? dialogue.name = "主角";

? ? ? ? dialogue.content = content;

? ? ? ? TextElement.AsyncGetSizeY("", new Vector2(780, 70), 28, new EmojiString(dialogue.content), FontStyle.Normal,

? ? ? ? ? ? (o) => {

? ? ? ? ? ? ? ? dialogue.contentSize = o;

? ? ? ? ? ? ? ? float h = o.y + 80;

? ? ? ? ? ? ? ? if (h < 140)

? ? ? ? ? ? ? ? ? ? h = 140;

? ? ? ? ? ? ? ? RightLink.AddData(dialogue, h);

? ? ? ? ? ? ? ? view.container.Move(h);

? ? ? ? ? ? });

? ? }

? ? void AddCenterData(string content)

? ? {

? ? ? ? NarratorData dialogue = new NarratorData();

? ? ? ? dialogue.content = content;

? ? ? ? TextElement.AsyncGetSizeY("", new Vector2(780, 70), 28, new EmojiString(dialogue.content), FontStyle.Normal,

? ? ? ? ? ? (o) => {

? ? ? ? ? ? ? ? dialogue.contentSize = o;

? ? ? ? ? ? ? ? CenterLink.AddData(dialogue, o.y + 100);

? ? ? ? ? ? ? ? view.container.Move(o.y + 100);

? ? ? ? ? ? });

? ? }

}

效果如下粪糙,自己做的UI很難看


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末强霎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蓉冈,更是在濱河造成了極大的恐慌城舞,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寞酿,死亡現(xiàn)場(chǎng)離奇詭異家夺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)伐弹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)拉馋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惨好,你說(shuō)我怎么就攤上這事煌茴。” “怎么了日川?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蔓腐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我龄句,道長(zhǎng)回论,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任分歇,我火速辦了婚禮傀蓉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卿樱。我一直安慰自己僚害,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著萨蚕,像睡著了一般靶草。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岳遥,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天奕翔,我揣著相機(jī)與錄音,去河邊找鬼浩蓉。 笑死派继,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的捻艳。 我是一名探鬼主播驾窟,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼认轨!你這毒婦竟也來(lái)了绅络?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嘁字,失蹤者是張志新(化名)和其女友劉穎恩急,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纪蜒,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衷恭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纯续。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随珠。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杆烁,靈堂內(nèi)的尸體忽然破棺而出牙丽,到底是詐尸還是另有隱情,我是刑警寧澤兔魂,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布烤芦,位于F島的核電站,受9級(jí)特大地震影響析校,放射性物質(zhì)發(fā)生泄漏构罗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一智玻、第九天 我趴在偏房一處隱蔽的房頂上張望遂唧。 院中可真熱鬧,春花似錦吊奢、人聲如沸盖彭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)召边。三九已至铺呵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隧熙,已是汗流浹背片挂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贞盯,地道東北人音念。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躏敢,于是被迫代替她去往敵國(guó)和親闷愤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,028評(píng)論 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,312評(píng)論 0 10
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程父丰,因...
    小菜c閱讀 6,376評(píng)論 0 17
  • 方針管理(hoshin kanri)我們學(xué)習(xí)精益的兩大最重要的工具之一(另外一個(gè)是TBP)肝谭,日語(yǔ)中方針即是指針掘宪,指...
    王永存閱讀 1,120評(píng)論 1 2
  • 1蛾扇、付出不亞于任何人的努力 2、要謙虛不要驕傲 3魏滚、要每天反省 4镀首、活著就要感謝 5、積善行鼠次,思利他 6更哄、不要有感...
    泰優(yōu)匯普陀門(mén)店張毅閱讀 129評(píng)論 0 0