脚本
脚本是互动的关键,通过脚本我们可以让用户方便地编写业务逻辑和交互逻辑
示例
使用
基于 Tinoe 内置的 Script 继承,创建用户脚本,脚本提供了大量的钩子,让用户逻辑能够统一到脚本内,更方便组织业务逻辑,更多脚本钩子可以参考 API 部分。
// 这里只是少部分的钩子
class CubeScript extends Script {
onPointerEnter(): void {
console.log('in');
}
onPointerDrag(): void {
console.log('drag');
}
onAwake() {
console.log('awake');
}
onUpdate() {
if (this.instance.position.x < 3) {
this.instance.position.x += 0.02;
}
}
onCollisionEnter(ev: TinoeEvent): void {
console.log('enter');
}
}
常用能力
用户输入
Tinoe 脚本目前支持的用户输入在 pc 和移动端做到了统一,目前对外提供了移入、移出、抬起、点击、按下、拖拽这些事件节点,更多可以参考 交互
class MyScript extends Script {
onPointerEnter() {}
onPointerExit() {}
onPointerDrag() {}
onPointerUp() {}
onPointerDown() {}
onPointerClick() {}
}
碰撞事件
碰撞检测是互动引擎必不可少的能力,我们内置了碰撞检测的功能,用户可以通过给需要碰撞的 mesh 添加碰撞体,然后就可以为 mesh 添加脚本,通过脚本提供的碰撞钩子实现业务逻辑
class CubeScript extends Script {
// 开始碰撞
onCollisionEnter(ev: TinoeEvent) {}
// 碰撞持续
onCollisionStay(ev: TinoeEvent) {}
// 结束碰撞
onCollisionExit(ev: TinoeEvent) {}
}
scene.scriptManager.addScript(CubeScript, cube1);
const collider1 = new Collider(cube1);
const collider2 = new Collider(cube2);
const collider3 = new Collider(cube3);
scene.colliderManager.addCollider(collider1);
scene.colliderManager.addCollider(collider2);
scene.colliderManager.addCollider(collider3);
需要注意的是引擎自带的碰撞检测目前不附带物理效果,如果需要基于物理的碰撞,需要使用我们提供的物理引擎插件,详见 物理引擎
运行生命周期
实际上一个互动场景每一帧的流程我们可以分成逻辑更新、渲染两步,Tinoe 内部也是这么做的,并且我们针对这两部分整理出用户可介入的生命周期,通过脚本能力开放给用户:
tick {
// 用户逻辑阶段
tickLogic() {
update()
postUpdate()
}
// 渲染阶段
tickRender() {
preRender()
postRender()
}
}
对应的脚本:
class MyScript extends Script {
onPreRender() {}
onPostRender() {}
onPreUpdate() {}
onUpdate() {}
onPostUpdate() {}
}
需要注意的是,这些生命周期也为自定义插件提供了极大的便利。
Mesh 生命周期
Mesh 被创建、隐藏、销毁对应的时机也是用户逻辑可能会存在的时机,所以我们提供了对应的生命周期钩子让用户通过脚本介入。
class MyScript extends Script {
onAwake() {}
onEnable() {}
onDisable() {}
}