猫史档案馆


【每日一个岛3建图小技巧】拥有一个跟随的皮卡丘?就决定是你啦!

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


center_image

想拥有一只独一无二的跟随宠物吗?

想成为《学习吧!小精灵》里的被精灵环绕的大神吗?

学会这招,你就是岛上最靓的崽~

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() //干掉宠物
})

给大家布置一个小作业:

用什么办法能让无人机出现在你的正上方呢?

把你的答案写在评论区吧!

emotion_编程猫_加油

开发API文档:https://docs.box3.codemao.cn/

加入代码岛3.0官方内测Q喵

官网:box3.codemao.cn

下面的二维码会扫出来什么呢?( =•ω•= )m

center_image


回复

上一页1 页 / 共 3下一页
Architect_皮卡awaArchitect_皮卡awa

沙发

点赞1


评论


GZ006GZ006

前排

点赞1


评论


LUS圣武士LUS圣武士

前排

点赞2


评论


AbnormalLOGAbnormalLOG

dd后排

点赞1


评论


Lonely_wandererLonely_wanderer

后后排

点赞2


评论


编程梦想家编程梦想家

emotion_编程猫_加油emotion_编程猫_厉害了

点赞0


评论


编程梦想家编程梦想家

里面的喵是什么?

点赞0


评论


AbnormalLOGAbnormalLOG

 

喵是v x吗?(去掉空格)

点赞0


评论


该账号已被封禁该账号已被封禁

前排

点赞0


评论


Moira屑玖iMoira屑玖i

是不是以前发过这样的呀吉吉喵

点赞1


评论


啸猫啸猫

http爱://weixin.皮qq.com/r/Ijh卡5YX-EoyLcrTsC9丘20w

点赞0


评论


一个STUB用户_6715468一个STUB用户_6715468

建议加上分号(分号保命)

点赞1


评论


凌_墨水凌_墨水

古坟广告https://shequ.codemao.cn/community/298341emotion_doge

点赞1


评论


一个STUB用户_6715468一个STUB用户_6715468

交作业

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


评论


难起的名字难起的名字

喵是啥???()

点赞0


评论


async_functionasync_function

前排

点赞0


评论


迷失冷光迷失冷光

啊啊啊天启大陆那么多人都没有关掉tick,我也是醉了

点赞0


评论


霸道的疾风雀3KNp霸道的疾风雀3KNp

太好了,终于发了!

点赞0


评论


霸道的疾风雀3KNp霸道的疾风雀3KNp

点赞0


评论


./'./'

//交作业咯~

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


评论


爱笑的赤星芽芽牛爱笑的赤星芽芽牛

收藏

点赞0


评论


霸道的疾风雀3KNp霸道的疾风雀3KNp

交作业:

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


评论


trashtrash

为什么地图上很模糊?

点赞0


评论


7654Fox7654Fox

收藏,有用

点赞0


评论


天气娃娃天气娃娃

emotion_雷电猴_疑问

点赞0


评论


上辈子死于话多上辈子死于话多

那可达鸭呢【狗头】

点赞0


评论


幸福快乐喵幸福快乐喵

我和宠物上山他就上不来了

点赞0


评论


神岛吉吉喵神岛吉吉喵

代码中有两处被“喵”的地方是v x(去掉中间空格)

emotion_编程猫_搓头

点赞0


评论


AB骉AlobokAB骉Alobok

console.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


评论