用户:
翎with珝查看:0 回复:0 评论:0 创建时间:2023-06-17T19:39:06
1.普通版编辑器代码
world.onPlayerJoin(async ({ entity }) => {
entity.player.lifting = false;//初始化玩家的电梯状态
})
//玩家对应的楼层坐标
var lift_Position_Gamer = [
new Box3Vector3(10, 12, 63),//1层坐标
new Box3Vector3(10, 24, 63),//2层坐标
new Box3Vector3(10, 36, 63),//3层坐标
new Box3Vector3(10, 48, 63),//4层坐标
]
//视角模型对应的楼层坐标
var lift_Position_Visual_Angle = [
new Box3Vector3(2.5, 12, 63),//1层坐标
new Box3Vector3(2.5, 24, 63),//2层坐标
new Box3Vector3(2.5, 36, 63),//3层坐标
new Box3Vector3(2.5, 48, 63),//4层坐标
]
//电梯主代码
world.querySelectorAll("*").forEach(async (e) => {
if (e.hasTag('电梯')) {//遍历的实体有名为“电梯”的标签,则设置该实体为可互动
e.enableInteract = true
e.interactRadius = 3
e.interactHint = `${e.id}层电梯`
e.onInteract(async ({ entity }) => {
//遍历可用电梯
let lift = [];
world.querySelectorAll("*").forEach(async (t) => {
if (t.hasTag('电梯') && e.id !== t.id && !lift.includes(`${t.id}层`)) {
lift.push(`${t.id}层`)
}
});
lift.push('退出');
//选择楼层
let storey = await entity.player.dialog({
type: Box3DialogType.SELECT,
titleBackgroundColor: new Box3RGBColor(255, 215, 0),
title: `${e.id}层电梯`,
content: entity.player.lifting == false ? `你当前处于第 ${e.id} 层\n目前共有 ${lift.length - 1} 组可用电梯\n${lift.length - 2 == 0 || lift.length - 1 == 0 ? '没有电梯可以使用' : '请问你要前往几层'}` : `当前有 ${lift.length - 1} 组可用电梯\n你正在乘坐电梯`,
options: entity.player.lifting == false ? lift.sort() : ['退出']
});
if (!storey) return;
if (storey) {
if (storey.value == '退出') {
entity.player.cancelDialogs();
return;
} else {
await lift_Run(
entity,//玩家
lift_Position_Visual_Angle[parseFloat(e.id) - 1],//视角初始位置
lift_Position_Visual_Angle[parseFloat(storey.value) - 1],//视角结束位置
lift_Position_Gamer[parseFloat(storey.value) - 1],//玩家传送位置
//绝对值视角动画时间
Math.abs(
(parseFloat(e.id) - 1) - (parseFloat(storey.value) - 1)
)
)
}
}
})
}
})
//视角动画
async function lift_Run(entity, start_Lift, over_Lift, over_Gamer, range) {
//创建一个实体“e”,设置坐标为视角的初始位置
let e = world.createEntity({
position: start_Lift,
})
//实体的动画,玩家的视角目标为实体
let ani = e.animate([
{ position: start_Lift, duration: 1 },
{ position: start_Lift, duration: 5 },
{ position: over_Lift, duration: 1 },
], {
duration: 24 * (12 / (2 * 2)) * range,
iterations: 1,
direction: Box3AnimationDirection.NORMAL,
})
//设置玩家的状态
entity.player.directMessage('电梯启动')
entity.player.cameraEntity = e
entity.player.disableInputDirection = Box3InputDirection.BOTH
entity.player.showName = false
entity.player.invisible = true
entity.player.enableJump = false
entity.player.lifting = true
ani.onFinish(async () => {
world.querySelectorAll("player").forEach(async (p) => {
if (p.player.name == entity.player.name) {
//停止运行后将玩家数据恢复
entity.player.directMessage('电梯停了')
entity.player.cameraEntity = entity
entity.player.cameraMode = Box3CameraMode.FOLLOW
entity.position.copy(over_Gamer)
entity.player.disableInputDirection = Box3InputDirection.NONE
entity.player.showName = true
entity.player.invisible = false
entity.player.enableJump = true
entity.player.lifting = false
}
})
//删除实体
e.destroy()
});
};
2.PRO版编辑器代码
world.onPlayerJoin(async ({ entity }) => {
entity.player.lifting = false;//初始化玩家的电梯状态
})
//玩家对应的楼层坐标
var lift_Position_Gamer = [
new GameVector3(10, 12, 63),//1层坐标
new GameVector3(10, 24, 63),//2层坐标
new GameVector3(10, 36, 63),//3层坐标
new GameVector3(10, 48, 63),//4层坐标
]
//视角模型对应的楼层坐标
var lift_Position_Visual_Angle = [
new GameVector3(2.5, 12, 63),//1层坐标
new GameVector3(2.5, 24, 63),//2层坐标
new GameVector3(2.5, 36, 63),//3层坐标
new GameVector3(2.5, 48, 63),//4层坐标
]
//电梯主代码
world.querySelectorAll("*").forEach(async (e) => {
if (e.hasTag('电梯')) {//遍历的实体有名为“电梯”的标签,则设置该实体为可互动
e.enableInteract = true
e.interactRadius = 3
e.interactHint = `${e.id}层电梯`
e.onInteract(async ({ entity }) => {
//遍历可用电梯
let lift = [];
world.querySelectorAll("*").forEach(async (t) => {
if (t.hasTag('电梯') && e.id !== t.id && !lift.includes(`${t.id}层`)) {
lift.push(`${t.id}层`)
}
});
lift.push('退出');
//选择楼层
let storey = await entity.player.dialog({
type: GameDialogType.SELECT,
titleBackgroundColor: new GameRGBColor(255, 215, 0),
title: `${e.id}层电梯`,
content: entity.player.lifting == false ? `你当前处于第 ${e.id} 层\n目前共有 ${lift.length - 1} 组可用电梯\n${lift.length - 2 == 0 || lift.length - 1 == 0 ? '没有电梯可以使用' : '请问你要前往几层'}` : `当前有 ${lift.length - 1} 组可用电梯\n你正在乘坐电梯`,
options: entity.player.lifting == false ? lift.sort() : ['退出']
});
if (!storey) return;
if (storey) {
if (storey.value == '退出') {
entity.player.cancelDialogs();
return;
} else {
await lift_Run(
entity,//玩家
lift_Position_Visual_Angle[parseFloat(e.id) - 1],//视角初始位置
lift_Position_Visual_Angle[parseFloat(storey.value) - 1],//视角结束位置
lift_Position_Gamer[parseFloat(storey.value) - 1],//玩家传送位置
//绝对值视角动画时间
Math.abs(
(parseFloat(e.id) - 1) - (parseFloat(storey.value) - 1)
)
)
}
}
})
}
})
//视角动画
async function lift_Run(entity, start_Lift, over_Lift, over_Gamer, range) {
//创建一个实体“e”,设置坐标为视角的初始位置
let e = world.createEntity({
position: start_Lift,
})
//实体的动画,玩家的视角目标为实体
let ani = e.animate([
{ position: start_Lift, duration: 1 },
{ position: start_Lift, duration: 5 },
{ position: over_Lift, duration: 1 },
], {
duration: 24 * (12 / (2 * 2)) * range,
iterations: 1,
direction: GameAnimationDirection.NORMAL,
})
//设置玩家的状态
entity.player.directMessage('电梯启动')
entity.player.cameraEntity = e
entity.player.disableInputDirection = GameInputDirection.BOTH
entity.player.showName = false
entity.player.invisible = true
entity.player.enableJump = false
entity.player.lifting = true
ani.onFinish(async () => {
world.querySelectorAll("player").forEach(async (p) => {
if (p.player.name == entity.player.name) {
//停止运行后将玩家数据恢复
entity.player.directMessage('电梯停了')
entity.player.cameraEntity = entity
entity.player.cameraMode = GameCameraMode.FOLLOW
entity.position.copy(over_Gamer)
entity.player.disableInputDirection = GameInputDirection.NONE
entity.player.showName = true
entity.player.invisible = false
entity.player.enableJump = true
entity.player.lifting = false
}
})
//删除实体
e.destroy()
});
};
注:代码已测试,实用无BUG
By ZeYB