用户:
神岛吉吉喵查看:58 回复:68 评论:58 创建时间:2021-05-22T18:13:45

想拥有一只独一无二的跟随宠物吗?
想成为《学习吧!小精灵》里的被精灵环绕的大神吗?
学会这招,你就是岛上最靓的崽~
https://www.bilibili.com/video/BV1qK4y197s8
所需代码:
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() //干掉宠物
})
给大家布置一个小作业:
用什么办法能让无人机出现在你的正上方呢?
把你的答案写在评论区吧!

开发API文档:https://docs.box3.codemao.cn/
加入代码岛3.0官方内测Q喵
下面的二维码会扫出来什么呢?( =•ω•= )m

交作业
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 = 0; //与玩家保持的距离
const distY = 3;//与地面距离的高度
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 + distY;
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(); //干掉宠物
});点赞1
评论
./'//交作业咯~
c喵ole.clear()
c喵t mscale = 1 / 16
c喵t Quat = new Box3Quaternion(0, 0, 0, 1)
function buddyFollow(entity, mesh, y) {
c喵t buddy = world.createEntity({
mesh,
position: entity.position,
meshScale: [mscale, mscale, mscale],
gravity: false, //不受重力影响
fixed: false, //可推移
collides: true, //可碰撞
friction: 0, //无摩擦力
mass: 0.01, //非常轻
})
c喵t tgPos = entity.position//僚机的目标位置
c喵t budPos = buddy.position//僚机的当前位置
c喵t facing = entity.player.facingDirection//玩家的朝向
c喵t ratio = 0.3//追随的灵敏度, 最好设在0.5左右, 1.0表示立即移到玩家位置
c喵t dist = 1
c喵t yOffset = y //y轴位移, 保持僚机在头顶或脚下
c喵t ticker = world.onTick(() => {
//要让小精灵跟在玩家背后, 需要计算xz轴的位移: 玩家朝向的反方向
c喵t xOffset = facing.x * dist
c喵t zOffset = facing.z * dist
//当前位置与目标位置在xyz轴的差距
c喵t xDiff = tgPos.x - budPos.x
c喵t yDiff = tgPos.y - budPos.y
c喵t zDiff = tgPos.z - budPos.z
//计算xyz方向上 当前位置向目标位置靠拢的速度
c喵t 喵 = (xDiff + xOffset) * ratio
c喵t vy = (yDiff + yOffset) * ratio
c喵t 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', 2) //给玩家增加宠物
})
world.onPlayerLeave(({ entity }) => {
//玩家离开地图时, 切记一定要关掉tick循环以及销毁小精灵实体, 否则随着人数增加, 服务器积累到一定程度就会崩溃
entity.setPet() //干掉宠物
})点赞0
评论
无尽深空这是什么鬼?
//计算xyz方向上 当前位置向目标位置靠拢的速度
const→ 喵 ←= (xDiff + xOffset) * ratio
const vy = (yDiff + yOffset) * ratio
const vz = (zDiff + zOffset) * ratio点赞2
评论
交作业:
console.clear()
const mscale = 1 / 16
const Quat = new Box3Quaternion(0, 0, 0, 1)
function bu喵yFollow(entity, mesh, y) {
const bu喵y = 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 = bu喵y.position//僚机的当前位置
const facing = entity.player.facingDirection//玩家的朝向
const ratio = 0.5//追随的灵敏度, 最好设在0.5左右, 1.0表示立即移到玩家位置
const dist = 0 //与玩家保持的距离
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
bu喵y.velocity.set(喵, vy, vz)//设置僚机速度
if (bu喵y.velocity.sqrMag() > 0.005) {//速度要足够大, 才触发转向, 防止抖动
bu喵y.meshOrientation = Quat.rotateY(Math.atan2(zDiff, xDiff)) //让小精灵一直面向玩家
}
})
return () => {
ticker.cancel() //关掉tick循环
bu喵y.destroy() //移除僚机实体
}
}
world.onPlayerJoin(({ entity }) => {
entity.setPet = bu喵yFollow(entity, 'mesh/无人机.vb', 2) //给玩家增加宠物
})
world.onPlayerLeave(({ entity }) => {
//玩家离开地图时, 切记一定要关掉tick循环以及销毁小精灵实体, 否则随着人数增加, 服务器积累到一定程度就会崩溃
entity.setPet() //干掉宠物
})点赞1
评论
AB骉Alobokconsole.clear()
const mscale = 1 / 16
const Quat = new Box3Quaternion(2, 0, 0, 1)
function bu喵yFollow(entity, mesh, y) {
const bu喵y = 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 = bu喵y.position//僚机的当前位置
const facing = entity.player.facingDirection//玩家的朝向
const ratio = 0.5//追随的灵敏度, 最好设在0.5左右, 1.0表示立即移到玩家位置
const dist = 0 //与玩家保持的距离
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
bu喵y.velocity.set(喵, vy, vz)//设置僚机速度
if (bu喵y.velocity.sqrMag() > 0.005) {//速度要足够大, 才触发转向, 防止抖动
bu喵y.meshOrientation = Quat.rotateY(Math.atan2(zDiff, xDiff)) //让小精灵一直面向玩家
}
})
return () => {
ticker.cancel() //关掉tick循环
bu喵y.destroy() //移除僚机实体
}
}
world.onPlayerJoin(({ entity }) => {
entity.setPet = bu喵yFollow(entity, 'mesh/僵尸.vb', 2) //给玩家增加宠物
})
world.onPlayerLeave(({ entity }) => {
//玩家离开地图时, 切记一定要关掉tick循环以及销毁小精灵实体, 否则随着人数增加, 服务器积累到一定程度就会崩溃
entity.setPet() //干掉宠物
})
作业
点赞0
评论