猫史档案馆


给地图做彩蛋(中)

用户:云游de军长渡云游de军长渡查看:0 回复:1 评论:0 创建时间:2022-08-25T12:03:19


//给第二个npc使用时,里面的npc3要更改,更改成啥没要求,但是要更换成统一的字母/数字 constnpc3=world.querySelector('#彩蛋-2'); npc3.enableInteract=true;//允许进行互动 npc3.interactRadius=2;//实体的互动范围 npc3.interactHint=npc3.id;//互动提示框显示实体的名称 npc3.interactColor=newBox3RGBColor(1,1,1);//互动提示的文字颜色 //玩家与实体进行交互时触发 npc3.onInteract(async({entity})=>{ constresult=awaitentity.player.dialog({ type:Box3DialogType.TEXT,//对话框的类型,TEXT是文本框。 title:npc3.id,//对话框标题为NPC名字,表示正在说话的是NPC lookEye:entity,//将相机放在玩家位置 lookTarget:npc3,//相机镜头对准NPC content:`${entity.player.name},恭喜你找到彩蛋-2,可以发射蛛丝`, }); }); npc3.onInteract(async({entity})=>{//当玩家和npc3交互时 entity.player.onPress(async({raycast,button})=>{ //点击鼠标左键发射蛛丝,并飞向蛛丝射中的位置 if(button==Box3ButtonType.ACTION0){ //首先实现发射蜘蛛丝的效果 //并拿到蜘蛛丝的实体做后续操作 constspiderSilk=fireSpiderSilk(raycast,entity) //使用animate模拟飞行过程中,蛛丝逐渐缩短的效果 shortenSpiderSilk(raycast,spiderSilk) awaitsleep(1000) //蛛丝开始缩放后,给玩家沿着蛛丝方向的速度,模拟蛛丝拉扯飞行的效果 firePlayer(raycast,entity) //最后要记得销毁蛛丝,避免卡顿 awaitsleep(500) spiderSilk.destroy() } }) }) /**发射玩家*/ functionfirePlayer(raycast,entity){ //准心击中位置与玩家位置做向量减法,获得蛛丝的方向向量 constdirection=raycast.hitPosition.sub(entity.position) //给方向向量乘以一个合适的系数,模拟玩家飞出去的效果。y轴速度小一些的原因是避免飞太高 constvelocity=newBox3Vector3(direction.x*0.15,direction.y*0.1,direction.z*0.15) entity.velocity=velocity.clone() //小技巧~~如果射中了其他玩家,可以给他一个反方向速度,模拟粘过来的效果 if(raycast.hitEntity&&raycast.hitEntity.isPlayer){ raycast.hitEntity.velocity=velocity.scale(-1) } } /**蛛丝缩短的效果*/ functionshortenSpiderSilk(raycast,spiderSilk){ //飞行过程中,蛛丝变化的属性有:position、meshScale //如果只缩短蛛丝,而不更改蛛丝位置,不能完整模拟出效果 //蛛丝初始生成位置 conststartPos=spiderSilk.position //蛛丝在缩短的过程中需要移动到准心击中的位置 constendPos=raycast.hitPosition //蛛丝初始缩放值 constinitialScale=spiderSilk.meshScale //蛛丝最终需沿x轴缩到最短 constendScale=newBox3Vector3(0,1/16,1/16) constani=spiderSilk.animate([ {position:startPos,meshScale:initialScale,duration:1}, {position:endPos,meshScale:endScale,duration:0}, ]) ani.play({ duration:16*0喵,//播放过程0喵秒,如需更改缩放时间,更改这个数值。相应的也需更改玩家的飞行速度 iterations:1,//只播放一次 direction:Box3AnimationDirection.NORMAL,//正常播放 }) } /**发射蜘蛛丝*/ functionfireSpiderSilk(raycast,entity){ //准心击中位置与玩家位置做向量减法,获得蛛丝的方向向量 constdirection=raycast.hitPosition.sub(entity.position) //通过射出的方向向量,计算出蛛丝的旋转四元数 constmeshOrientation=getOrientationByVector(direction) //准心击中位置与玩家位置的距离,为蛛丝的长度 constdistance=raycast.hitPosition.distance(entity.position) //1/16为基准缩放值。蛛丝的设计模型为沿x轴方向设计,且为两个方块长度。因此x轴缩放值为1/16*distance/2 constinitialScale=newBox3Vector3(1/16*distance/2,1/16,1/16) //蛛丝的生成位置应为准心击中位置与玩家位置的向量插值的中心点 constinitialPos=entity.position.lerp(raycast.hitPosition,0.5) //用各种计算好的数值创建蛛丝 constspiderSilk=world.createEntity({ mesh:"mesh/钢丝.vb",//文件中要加一个叫钢丝的东西 position:initialPos, collides:false, gravity:false, meshScale:initialScale, meshOrientation:meshOrientation }) returnspiderSilk } //本示例中用到的钢丝模型为沿着x轴方向设计。因此用的Box3Quaternion(0,0,0,1)四元数去做旋转计算 //如果大家使用沿其他轴向设计的模型,请使用下面注释的四元数去做旋转计算 constQuat=newBox3Quaternion(0,0,0,1)//沿x轴方向设计的蛛丝,初始化四元数,用于旋转计算 //constQuat=newBox3Quaternion(0.000,0.000,-0.707,0.707)//沿y轴方向设计的资源用 //constQuat=newBox3Quaternion(0.000,0.707,0.000,0.707)//沿z轴方向设计的资源用 /**通过射出的方向向量,计算出蛛丝的旋转四元数*/ functiongetOrientationByVector(vector3){ constsrc=vector3 letdx=src.x letdy=src.y letdz=src.z letdist=Math.sqrt(dx*dx+dz*dz) constrotx=Math.atan2(dy,dist) returnQuat.rotateX(rotx).rotateY(Math.atan2(dz,dx)) }//改编自老吉的飞檐走壁代码


回复

上一页1 页 / 共 1下一页
云游de军长渡云游de军长渡

啊啊啊啊啊啊啊啊啊啊啊啊,为什么还是这种效果

点赞0


评论