关于js脚本宿主对脚本代码的绑定

脚本代码绑定,Unity3D是这样做的。为了体现Unity3D的基于对象设计,Unity3D可以为每个对象绑定多个脚本文件,可以是js,可以是cs,也可以是boo。

threejs/editor也有与Unity3D类似的开发方式——绑定脚本给对象,比如场景,物体,灯光……。

单说js吧,这个是我当前需要用到的技术,cs已经可以理论上解决了,boo不需要,我更需要的是lua。

js脚本不像cs那样,需要一个类来承载update,start等宿主要调用的事件,仅需要在文件中写好全局函数名update、start即可。

threejs中的解决办法是将绑定的脚本保存在了json里,是一段字符串而已。在实际运行app时,将代码作为一个函数的主体,并将代码里面的函数塞到js对象作为返回值。然后执行这个函数,将内部的函数绑定给场景里的对应对象上。

 1 for (var uuid in json.scripts) {
 2     var object = scene.getObjectByProperty('uuid', uuid, true);
 3     if (object === undefined) {
 4         console.warn('APP.Player: Script without object.', uuid);
 5         continue;
 6     }
 7     var scripts = json.scripts[uuid];
 8     for (var i = 0; i < scripts.length; i++) {
 9         var script = scripts[i];
10         var functions = (new Function(scriptWrapParams, script.source + '\nreturn ' + scriptWrapResult + ';').bind(object))(this, renderer, scene, camera);
11         for (var name in functions) {
12             if (functions[name] === undefined) continue;
13             if (events[name] === undefined) {
14                 console.warn('APP.Player: Event type not supported (', name, ')');
15                 continue;
16             }
17             events[name].push(functions[name].bind(object));
18         }
19     }
20 }

 

posted @ 2017-02-22 14:01  fyter  阅读(589)  评论(0编辑  收藏  举报