Lv.1
在 有人就来吧 中回复
console.clear()
const mscale = 1 / 16
const Quat = new Box3Quaternion(0, 0, 0, 1)
function buddyFollow(entity, mesh, y) {
const buddy = world.createEntity({
mesh,
position: entity.position,
meshScale: [mscale, mscale, mscale],
gravity: false, //不受重力影响
fixed: false, //可推移
collides: true, //可碰撞
friction: 0, //无摩擦力
mass: 0.01, //非常轻
})
const tgPos = entity.position//僚机的目标位置
const budPos = buddy.position//僚机的当前位置
const facing = entity.player.facingDirection//玩家的朝向
const ratio = 0.3//追随的灵敏度, 最好设在0.5左右, 1.0表示立即移到玩家位置
const dist = 2 //与玩家保持的距离
const yOffset = y //y轴位移, 保持僚机在头顶或脚下
const ticker = world.onTick(() => {
//要让小精灵跟在玩家背后, 需要计算xz轴的位移: 玩家朝向的反方向
const xOffset = -facing.x * dist
const zOffset = -facing.z * dist
//当前位置与目标位置在xyz轴的差距
const xDiff = tgPos.x - budPos.x
const yDiff = tgPos.y - budPos.y
const zDiff = tgPos.z - budPos.z
//计算xyz方向上 当前位置向目标位置靠拢的速度
const 喵 = (xDiff + xOffset) * ratio
const vy = (yDiff + yOffset) * ratio
const vz = (zDiff + zOffset) * ratio
buddy.velocity.set(喵, vy, vz)//设置僚机速度
if (buddy.velocity.sqrMag() > 0.005) {//速度要足够大, 才触发转向, 防止抖动
buddy.meshOrientation = Quat.rotateY(Math.atan2(zDiff, xDiff)) //让小精灵一直面向玩家
}
})
return () => {
ticker.cancel() //关掉tick循环
buddy.destroy() //移除僚机实体
}
}
world.onPlayerJoin(({ entity }) => {
entity.setPet = buddyFollow(entity, 'mesh/皮卡丘.vb', -1) //给玩家增加宠物,名称需与地图内放置的模型的名称一致
})
world.onPlayerLeave(({ entity }) => {
//玩家离开地图时, 切记一定要关掉tick循环以及销毁小精灵实体, 否则随着人数增加, 服务器积累到一定程度就会崩溃
entity.setPet() //清除掉宠物
})2022-10-17T14:18:28 点赞:0
在 哪位大佬会修bug帮个忙谢谢https://box3.codemao.cn/e/喵e81cf2f5 中回复
https://box3.codemao.cn/e/84896be1ee1b8fba411c
2022-10-20T10:27:42 点赞:0
在 求助!!!谁可以给我box3玩家出生变为模型的代码!!!求求~ 中回复
/* 玩家进入游戏时,变成一颗星星。5秒后恢复。 */
world.onPlayerJoin(async({ entity }) => {
const originPlayerMesh = entity.mesh;
// 需要先在场景摆放一个名字为 星星 的模型
entity.mesh = world.querySelector('#星星').mesh
entity.meshScale = new Box3Vector3(1/24, 1/24, 1/24);
entity.meshOrientation = new Box3Quaternion(0, 1, 0, 0)
entity.player.invisible = true;
await sleep(5000)
entity.mesh = originPlayerMesh
entity.player.invisible = false;
});2022-10-22T17:30:22 点赞:0
在 【求助】怎么在神岛做出按钮选项效果 中回复
//封装成函数是因为它会被多次用到(显示玩家状态, 显示与NPC交互结果)
function textDialog(entity, content, title) {
return entity.player.dialog({ //弹出对话框
type: Box3DialogType.TEXT, //对话框类型为纯文本
content, //文本内容
title, //对话框左上角标题内容
})
}
world.onPlayerJoin(({ entity }) => { //玩家进入游戏时在这里初始化玩家的资产
entity.junk = 0 //废品
entity.money = 0 //钱
entity.itemList = [] //口袋里的货品
entity.player.onPress(({ button }) => { //每当有按钮被按下
if (button == Box3ButtonType.ACTION1) { //如果按钮是右键
textDialog(entity, `你身上有:\n\n${entity.money}元, ${entity.junk}个废品\n道具: [${entity.itemList}]`)
}
})
})2022-10-24T18:17:01 点赞:0
在 【求助】怎么在神岛做出按钮选项效果 中回复
else if (npc.id == '小卖部老板') { //如果实体名是'小卖部老板'
npc.onInteract(async ({ entity }) => { //当玩家对这个npc按E触发交互, npc问你想买哪些商品
const goodsList = ['薯片', '可乐', '糖果'] //货品列表
const priceList = [7, 5, 4] //价格列表
const selection = await entity.player.dialog({
type: Box3DialogType.SELECT, //对话框类型为选择框
content: `你有${entity.money}元, 想买点什么呢?`,
title: npc.id, //对话框左上角显示NPC名字
options: ['薯片 (7元)', '可乐 (5元)', '糖果 (4元)'], //选项
})
})
}2022-10-24T18:17:26 点赞:0