猫史档案馆


做魂环最重要的不过就是举一反三()

用户:查看:5 回复:3 评论:5 创建时间:2021-09-27T21:49:09


众所周知,做代码最重要的就是举一反三

就是用吉吉喵的教程的主体代码也可以换出其他花样(佬勿喷)

据说吉吉喵曾经出过一个角色跟随的代码。

今天咱就来好好改装一下。

 

 

首先,先拿出绾兮大大压仓底的素材

center_image

Tip:找到模型要去云端模型库搜“魂环”,放完模型后记得删除模型(白说)

 

然后,把吉吉喵的代码复制过来:

链接:https://shequ.codemao.cn/community/378184

就是这样的:

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

咱把代码删去不要用的,加上要用的:

function buddyFollow(entity, hunhuanname, y,meshScale) {//更改函数配置
    const buddy = world.createEntity({
        mesh:'mesh/'+hunhuanname+'.vb',
        position: entity.position,
        meshScale,
        gravity: false, //不受重力影响
        fixed: false, //可推移
        collides: false, //可碰撞
        mass: 0.01, //非常轻
    })
    buddy.i=0
    buddy.j=1
    const tgPos = entity.position//僚机的目标位置
    const budPos = buddy.position//僚机的当前位置
    const facing = entity.meshOrientation//玩家的朝向
    const ratio = 1//追随的灵敏度, 最好设在0.5左右, 1.0表示立即移到玩家位置

    const dist = 0 //与玩家保持的距离
    const yOffset = y //y轴位移, 保持僚机在头顶或脚下

    const ticker = world.onTick(() => {
        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)//设置僚机速度

    })
    xvanzhuan(buddy)//这个后面会讲
    return () => {
        ticker.cancel() //关掉tick循环
        buddy.destroy() //移除僚机实体
    }
}

Tip:模型名称为了方便我设置了只要输入除格式外的部分(真正的模型名)不要搞混。

接着,在地图里面放上一堆魂兽(像最后的江湖(也可以说肝帝的江湖))那样

center_image

 

 

我放的是我自己画的老鼠(美名曰岩鼠(石头做的))

把老鼠们全部加上“魂兽”标签,加上以下代码:

for(const hunshou of world.querySelectorAll('.魂兽')){
    if(hunshou.id.includes('岩鼠')){//懒得改名,直接用检测有没有目标文本
        hunshou.hunhuan=Math.round(Math.random()*(20-100) + 100)//随机取数
        if(9<hunshou.hunhuan<100){
            buddyFollow(hunshou,'十年魂环',0,hunshou.meshScale)//刚刚的函数 ,meshScale是表示将魂环的大小设置为和魂兽一样
        }
        hunshou.hp=100*hunshou.hunhuan/100
        hunshou.maxHp=100*hunshou.hunhuan/100
        hunshou.id='岩鼠  魂环:'+hunshou.hunhuan+'年'//改名
        hunshou.damage=hunshou.hunhuan/5//伤害值
        hunshou.enableDamage=true
        hunshou.onInteract(async({entity,targetEntity})=>{//受到伤害
            if(entity.gongji-hunshou.damage>=1){
                targetEntity.hurt(entity.gongji-hunshou.damage)
            }else{
                targetEntity.hurt(1)
            }
        })
    }
    //注:下面的绝对不可以放到前面。
    hunshou.enableInteract = true //允许当前npc实体触发交互
    hunshou.interactRadius = 4.5 //交互范围
    hunshou.interactHint = hunshou.id //交互提示文本显示实体名字
    hunshou.interactColor.set(1, 1, 1) //交互提示文本颜色为绿色
}

为了让魂环转起来,我们需要另一个函数。回到刚刚的函数代码,我们可以看到有这样一行代码,是我自己加的。

xvanzhuan(buddy)

咱看看咋设置这行函数:

async function xvanzhuan(entity){//异步函数
    while(true){//重复执行
    for(k=0;k<1000/2;k++){//重复500次
        await sleep(1000/16)//等待,不然会乱掉
        entity.i+=4/1000//在刚刚的大函数里设置的两个方向变量,一加一减
        entity.j-=4/1000
        entity.meshOrientation=new Box3Quaternion(0,entity.i,0,entity.j)//设置新朝向
    }
    entity.i=0//在刚刚的大函数里设置的两个方向变量,归零
    entity.j=1
    entity.meshOrientation=new Box3Quaternion(0,entity.i,0,entity.j)
    }
}

成果咱来看看图片:

center_image

建议自己在自己的地图里看看效果哈(我没b站号)

 

就到这里啦(当然这个代码不是完整的,只是如何创建带魂环的魂兽的代码,以后或许会发魂兽喵后的代码)


回复

上一页1 页 / 共 1下一页
星星上的雪花星星上的雪花

其实,魂环移动位置的代码一行就能解决的...

点赞0


评论


Weeb_ETOWeeb_ETO

666

点赞0


评论


今天突然发现个要注意的问题:玩家的变量设置我没复制下来,请大家要用的时候自己加上去(应该看得出来是哪些吧?)

点赞0


评论