Laya 爆改Laya IDE和Laya引擎使其支持2D粒子爆发模式
@author ixenos 2019-11-01 19:47:26
1. 修改IDE的功能需要深入到/resources/app/out/vs/layaEditor路径下
1)其中,在/resources/app/out/vs/layaEditor/renderer/laya.editorUI.xml可以修改各个属性编辑器的开放属性,就像我们手动写IDE脚本一样,不过这个将会对应所有用到的实例;
1
2
3
4 .....5
2)其中,比如粒子编辑器的播放模块就可以在/resources/app/out/vs/layaEditor/h5/renders/particle/editor.max.js进行修改
3)etc.具体怎么修改IDE,直接用开发者工具进行调试定位功能代码模块
2.调试2D粒子功能得知,粒子的创建由发射基类EmitterBase的advanceTime方法负责:
1 public function advanceTime(passedTime:Number = 1, burstNum:int = 1):void{
2 _emissionTime -=passedTime;
3 if (_emissionTime < 0) return;
4 _frameTime +=passedTime;
5 if (_frameTime < minEmissionTime) return;
6 while (_frameTime >minEmissionTime) {
7 _frameTime -=minEmissionTime;
8 emit();
9 }
10 }
这个方法在一个帧循环中进行,这意味着在限定时间内尽量绘制粒子,那么我们只需要在时间判断中直接输出所有粒子,那就等于在一帧中绘制所有粒子的运动,这就是爆炸效果:
1 public function advanceTime(passedTime:Number = 1, burstNum:int = 1):void{
2 _emissionTime -=passedTime;
3 if (_emissionTime < 0) return;
4 _frameTime +=passedTime;
5 if (_frameTime < minEmissionTime) return;
6 while (_frameTime >minEmissionTime) {
7 for (var i:int = 0; i < burstNum; i++) {
8 _frameTime -=minEmissionTime;
9 emit();
10 }
11 }
12 }
这里开放burstNum参数用于控制爆炸效果(最大值是setting.maxParticles)
另外在ParticleSetting类中加入我们额外的参数:
1 public classParticleSetting {
2 /**是否爆发*/
3 public var burstEnable:Boolean = false;
4 /**播放时长*/
5 public var playDuration:Number = 2147483647;
6 ...
7 }
同时需要修改粒子载体Particle2D:
1 /**2 * 设置粒子配置数据3 * @param settings 粒子配置数据4 */
5 public function setParticleSetting(setting:ParticleSetting):void{6 _setting =setting;7
8 ...9
10 if(autoPlay) {11 start();//这里将emitter.start()修改为我们自己封装的start()12 play();13 }14 }
1 public function start():void{2 if(emitter){3 if(_setting && _setting.playDuration>0){4 emitter.start(_setting.playDuration);//同时我们也让IDE支持控制总播放时长5 }else{6 emitter.start();7 }8 }9 }
1 /**2 * 时钟前进3 * @param passedTime 时钟前进时间4 */
5 public function advanceTime(passedTime:Number = 1):void{6 if(_canvasTemplate) {7 _canvasTemplate.advanceTime(passedTime);8 }9 if(_emitter) {10 if(_setting &&_setting.burstEnable){11 _emitter.advanceTime(passedTime, _setting.maxPartices);//这里传入maxPartices表示在一帧中全部开始绘制12 }else{13 _emitter.advanceTime(passedTime);14 }15 }16 }
3.最终效果:
这些数值最终导出到配置文件.part中(实质是JSON)
4.在这个过程中有个曲折的地方就是,我想按官方的脚本方法来该IDE的属性面板,结果粒子的属性面板用脚本改不了,我以为没有办法了,就转而用Laya编写一个粒子编辑器,配合FileSaver.js将配置文件再保存出来,
最后再翻看的时候发现了可以直接爆改IDE。All Right! 条条大路通罗马。。。