Your browser does not support video tags.
核心原理 :通过[交互物]将[角色]与[高级轮式载具]连接在一起,在控制载具移动的同时,角色播放相应的动画,来模拟坐骑运动效果。
对象树结构:
角色属性设置:只替换了外观
脚本
@Component
export default class NewScript extends Script {
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected async onStart(): Promise<void> {
let NPCinter = await GameObject.asyncFindGameObjectById("1ED77DCE") as Interactor;
let NPC = await GameObject.asyncFindGameObjectById("22D302B3") as Character;
let vehicle = await GameObject.asyncFindGameObjectById("371C8B29") as AdvancedVehicle;
/**
* 设置多足角色
* 绑定多足角色:将多足角色绑定到交互物上
* 关闭碰撞:因为多足角色是通过交互物绑到在高级轮式载具上,所以无法和载具自身的物理碰撞进行合并,所以需要关闭多足角色的碰撞,防止与载具自身碰撞产生冲突
*/
NPCinter.enter(NPC)
NPC.setCollision(PropertyStatus.Off)
//加载动画并设置动画参数
let AnimRun = NPC.loadAnimation("181293");
let AnimStand = NPC.loadAnimation("181291");
AnimRun.loop = 0;
AnimStand.loop = 0;
//UI摇杆组件被按下,代表载具处于移动中,播放多足角色移动动画
Event.addLocalListener("JoystickDown", () => {
AnimRun.play();
})
//UI摇杆组件松开事件,代表载具即将停止移动
Event.addLocalListener("JoystickUP", () => {
//通过载具当前速度来判断是否已完全停止,并播放相应对画
let CCInterval = setInterval(() => {
if (vehicle.velocity < 0.5) {
AnimRun.stop();
AnimStand.play();
clearInterval(CCInterval);
}
}, 100);
})
/**
* 模拟跳跃
* 在载具当前位置动态生成一个冲量对象,将载具弹起,模拟跳跃的效果
* 载具下的方块模型用来和冲量对象发生作用
*/
InputUtil.onKeyDown(Keys.One, () => {
let VehicleImpulse = GameObject.spawn("PhysicsImpulse") as Impulse;
//生成冲量对象的位置
VehicleImpulse.worldTransform.position = vehicle.worldTransform.position;
//以当前载具的方向来设置冲量对象的方向
VehicleImpulse.worldTransform.rotation = vehicle.worldTransform.rotation;
//设置冲量对象属性
VehicleImpulse.impulseVector = new Vector(500, 0, 1000)
//完成“跳跃”后,销毁冲量对象
setTimeout(() => {
VehicleImpulse.destroy();
}, 1000);
})
}
}