Laya runtime 擴(kuò)展腳本 附加腳本

參考
runtime使用
擴(kuò)展腳本的使用
附加腳本的使用
按照上面的教程河狐,發(fā)現(xiàn)擴(kuò)展腳本實(shí)際上也是在用runtime虱朵,而附加腳本則是多了一個(gè)子元素:

一、IDE中不同表現(xiàn)

box1使用了擴(kuò)展腳本,box2使用了runtime肿孵,box3使用了附加腳本唠粥,ui文件是這樣的:

//注意,擴(kuò)展腳本和附加腳本的文件后綴不同停做,分別是prop和script
//MonkeyProp.prop:
<MonkeyProp className="game.MonkeyProp">
    <prop name="speed" tips="數(shù)字類(lèi)型" type="number"/>
    <prop name="userName" tips="人物名稱(chēng)" type="string"/>
</MonkeyProp>

//MonkeyProp2.script:
<MonkeyProp2 className="game.MonkeyProp2">
    <prop name="speed" tips="數(shù)字類(lèi)型" type="number"/>
    <prop name="userName" tips="人物名稱(chēng)" type="string"/>
</MonkeyProp2>

//TestGapUI.ui:
<Box x="268" y="150" appendProps="laya/pages/MonkeyProp.prop"
 speed="4" userName="xxa" var="box1" editorInfo="compId=45">
  <Image skin="game/doll_1.png" y="41" editorInfo="compId=43"/>
  <Label text="label" x="34" fontSize="36" width="102" height="36"
 name="userN" align="center" color="#100808" editorInfo="compId=44"/>
</Box>

<Box x="292" y="435" runtime="game.MonkeyProp" var="box2" editorInfo="compId=46">
  <Image skin="game/doll_1.png" y="41" editorInfo="compId=47"/>
  <Label text="label" x="34" fontSize="36" width="102" height="36"
 name="userN" align="center" color="#100808" editorInfo="compId=48"/>
</Box>

<Box y="703" x="302" var="box3" editorInfo="compId=49">
  <Image y="41" skin="game/doll_1.png" editorInfo="compId=50"/>
  <Label x="34" width="102" text="label" name="userN" height="36"
 fontSize="36" color="#100808" align="center" editorInfo="compId=51"/>
  <Script editorInfo="source=laya/pages/MonkeyProp2.script;compId=53"/>
</Box>

在IDE中晤愧,設(shè)置那兩個(gè)自定義屬性speed和userName的位置也不同。擴(kuò)展腳本因?yàn)槭抢^承自組件本身蛉腌,所以自定義屬性就在點(diǎn)擊box1時(shí)就能看到官份。而附加腳本,是直接變成box3的一個(gè)子元素了烙丛,需要選中子元素才能編輯舅巷。


image.png
二、生成的UI:

看一下生成的ui河咽,box1和box2都是同樣的類(lèi)型钠右,而box3還是Box類(lèi)型。

export class TestGapUI extends View {
    public box1:game.MonkeyProp;
    public box2:game.MonkeyProp;
        public box3:Laya.Box;

    public static  uiView:any ={"type":"View","props":{"width":750,"height":1334},"child":[...
    constructor(){ super()}
    createChildren():void {
                View.regComponent("game.MonkeyProp",game.MonkeyProp);
                View.regComponent("game.MonkeyProp2",game.MonkeyProp2);
        super.createChildren();
        this.createView(ui.TestGapUI.uiView);

    }

uiView部分太長(zhǎng)忘蟹,截取box1和box2看一下:

{"type":"Box","props":{"y":150,"x":268,"var":"box1","userName":"xxa","speed":4,"runtime":"game.MonkeyProp"},

{"type":"Box","props":{"y":435,"x":292,"var":"box2","runtime":"game.MonkeyProp"},

{"type":"Box","props":{"y":703,"x":302,"var":"box3"},
"child":[{"type":"Image","props":{"y":41,"skin":"game/doll_1.png"}},
{"type":"Label","props":{"x":34,"width":102,"text":"label","name":"userN",
"height":36,"fontSize":36,"color":"#100808","align":"center"}},
{"type":"Script","props":{"userName":"extraName","speed":3,"runtime":"game.MonkeyProp2"}

可以看到飒房,擴(kuò)展腳本是runtime的增強(qiáng)版:可以在IDE上指定屬性,然后把屬性值導(dǎo)出到ui配置中媚值,并且把這個(gè)值自動(dòng)映射類(lèi)的屬性中狠毯。而附加腳本,直接就是多了一個(gè)Script類(lèi)型的子元素褥芒。那么它是怎么解析的嚼松?
在View.as的createComp方法中可以看到:

if (node.type == "Script") {
    if ("owner" in tChild) {
        tChild["owner"] = comp;
    } else if ("target" in tChild) {
        tChild["target"] = comp;
    }
} else if (node.props.renderType == "mask" || node.props.name == "mask") {
    comp.mask = tChild;
} else {
    tChild is Sprite && comp.addChild(tChild);
}

所以,附加腳本就必需要定義owner或target屬性
另外锰扶,這個(gè)方法也能看到runtime那些屬性映射的操作:

var props:Object = uiView.props;
for (var prop:String in props) {
    var value:String = props[prop];
    setCompValue(comp, prop, value, view, dataMap);
}
三献酗、擴(kuò)展腳本和附加腳本對(duì)應(yīng)的類(lèi):

1.擴(kuò)展腳本MonkeyProp.ts

namespace game {
    export class MonkeyProp extends Laya.Box {
        /**攻擊速度(也可以不用定義該變量,在這里定義是為了打開(kāi)該類(lèi)的時(shí)候能夠一目了然的看到對(duì)應(yīng)的腳本中添加了哪些屬性)**/
        public speed: number = 0;
        /**人物名稱(chēng)(也可以不用定義該變量少辣,在這里定義是為了打開(kāi)該類(lèi)的時(shí)候能夠一目了然的看到對(duì)應(yīng)的腳本中添加了哪些屬性)**/
        public userName: string = "";
        /**記錄狀態(tài)**/
        private boo: boolean = false;

        constructor() {
            super();
            console.log("MonkeyProp");
            //自定義的腳本會(huì)有時(shí)序問(wèn)題凌摄,所以在此添加一個(gè)延時(shí)
            this.frameOnce(2, this, this.onFrame);
        }

        private onFrame(): void {
            //通過(guò)子元素的name值獲取該對(duì)象
            var userN: Laya.Label = this.getChildByName("userN") as Laya.Label;
            //設(shè)置文本內(nèi)容為屬性欄中給的值
            userN.text = this.userName;
            this.frameLoop(1, this, this.onLoop);
        }

        /**
         *設(shè)置幀循環(huán),實(shí)現(xiàn)左右移動(dòng) 
         * 
         */
        private onLoop(): void {
            if (this.x <= 0) {
                this.boo = false;
                this.x += this.speed;
            }
            else if (this.x < Laya.stage.width - this.width && this.boo == false) {
                this.x += this.speed;
            }
            else if (this.x >= Laya.stage.width - this.width || this.boo == true) {
                this.x -= this.speed;
                this.boo = true;
            }
        }
    }
}

2.附加腳本MonkeyProp2.ts

namespace game {
    export class MonkeyProp2 {
        /**攻擊速度(也可以不用定義該變量漓帅,在這里定義是為了打開(kāi)該類(lèi)的時(shí)候能夠一目了然的看到對(duì)應(yīng)的腳本中添加了哪些屬性)**/
        public speed: number = 0;
        /**人物名稱(chēng)(也可以不用定義該變量锨亏,在這里定義是為了打開(kāi)該類(lèi)的時(shí)候能夠一目了然的看到對(duì)應(yīng)的腳本中添加了哪些屬性)**/
        public userName: string = "";
        /**記錄狀態(tài)**/
        private boo: boolean = false;
        /**定義一個(gè)變量來(lái)接收Box組件實(shí)例**/        
        private monkeyBox:Laya.Sprite;

        /**
         *設(shè)置owner函數(shù),可以直接獲取到添加附加腳本的組件實(shí)例 
         * @param value
         * 
         */        
        public set owner(value:any){
            this.monkeyBox = value;
            //自定義的腳本會(huì)有時(shí)序問(wèn)題忙干,所以在此添加一個(gè)延時(shí)
            this.monkeyBox.frameOnce(2,this,this.onLoaded);
        }

        private onLoaded():void
        {
            //通過(guò)子元素的name值獲取該對(duì)象
            var userN:Laya.Label = this.monkeyBox.getChildByName("userN") as Laya.Label;
            //設(shè)置文本內(nèi)容為屬性欄中給的值
            userN.text = this.userName;
            this.monkeyBox.frameLoop(1,this,this.onLoop);
        }

        /**
         *設(shè)置幀循環(huán)器予,實(shí)現(xiàn)左右移動(dòng) 
         * 
         */
        private onLoop(): void {
            if (this.monkeyBox.x <= 0) {
                this.boo = false;
                this.monkeyBox.x += this.speed;
            }
            else if (this.monkeyBox.x < Laya.stage.width - this.monkeyBox.width && this.boo == false) {
                this.monkeyBox.x += this.speed;
            }
            else if (this.monkeyBox.x >= Laya.stage.width - this.monkeyBox.width || this.boo == true) {
                this.monkeyBox.x -= this.speed;
                this.boo = true;
            }
        }
    }
}
四、應(yīng)用場(chǎng)景

1.更改Laya組件的默認(rèn)行為捐迫,但是又不想直接改源代碼乾翔,畢竟那樣更新引擎時(shí)很麻煩。此時(shí)就可以用runtime繼承一下默認(rèn)的組件,然后override一下某些方法反浓。如果是想添加一些額外屬性萌丈,并且在IDE中指定不同的值,就可以用擴(kuò)展腳本了雷则,它算是runtime的可視化增強(qiáng)版辆雾,與IDE配合得更緊密。
2.某些組件要實(shí)現(xiàn)相同的行為月劈,最常見(jiàn)的例子就是一個(gè)Image支持點(diǎn)擊縮放效果的ScaleButton度迂,用runtime就行了。參見(jiàn)官方示例中的:


image.png

3.附加腳本猜揪,目前沒(méi)有用到惭墓。個(gè)人理解,它和擴(kuò)展腳本的區(qū)別而姐,就像組合和繼承的區(qū)別一樣腊凶。
4.比較不爽的是擴(kuò)展腳本和附加腳本都需要延時(shí):

//自定義的腳本會(huì)有時(shí)序問(wèn)題,所以在此添加一個(gè)延時(shí)
this.monkeyBox.frameOnce(2,this,this.onLoaded);

所以還是優(yōu)先考慮使用runTime吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毅人,一起剝皮案震驚了整個(gè)濱河市吭狡,隨后出現(xiàn)的幾起案子尖殃,更是在濱河造成了極大的恐慌丈莺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送丰,死亡現(xiàn)場(chǎng)離奇詭異缔俄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)器躏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)俐载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人登失,你說(shuō)我怎么就攤上這事遏佣。” “怎么了揽浙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵状婶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我馅巷,道長(zhǎng)膛虫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任钓猬,我火速辦了婚禮稍刀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敞曹。我一直安慰自己账月,他們只是感情好综膀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著局齿,像睡著了一般僧须。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上项炼,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天担平,我揣著相機(jī)與錄音,去河邊找鬼锭部。 笑死暂论,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拌禾。 我是一名探鬼主播取胎,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼湃窍!你這毒婦竟也來(lái)了闻蛀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤您市,失蹤者是張志新(化名)和其女友劉穎觉痛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茵休,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薪棒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榕莺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俐芯。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钉鸯,靈堂內(nèi)的尸體忽然破棺而出吧史,到底是詐尸還是另有隱情,我是刑警寧澤唠雕,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布贸营,位于F島的核電站,受9級(jí)特大地震影響及塘,放射性物質(zhì)發(fā)生泄漏莽使。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一笙僚、第九天 我趴在偏房一處隱蔽的房頂上張望芳肌。 院中可真熱鬧,春花似錦、人聲如沸亿笤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)净薛。三九已至汪榔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肃拜,已是汗流浹背痴腌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留燃领,地道東北人士聪。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像猛蔽,于是被迫代替她去往敵國(guó)和親剥悟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)曼库、插件区岗、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 《你只是看起來(lái)很努力》 李尚龍 路 一步步地走,走得很慢毁枯,但沒(méi)有停慈缔。正在努力的你并不孤獨(dú),其實(shí)后众,努力的人從來(lái)沒(méi)有孤...
    別動(dòng)放那閱讀 353評(píng)論 2 1
  • 突然從睡夢(mèng)中醒來(lái) 像往常一樣 翻手機(jī) 屏幕里那刺眼的話(huà)語(yǔ) 讓心冷卻無(wú)讓眼睛相信 看著看著入睡了… 夢(mèng)里有你快樂(lè)的模...
    米夏小雨閱讀 170評(píng)論 0 1