脚本代码绑定,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 }