用户:
追梦喵aowC查看:19 回复:21 评论:19 创建时间:2021-08-30T10:37:36
众所周知玩家发射激光的特效可谓是肥肠nice)
所以今天就直奔主题,如何做一个激光的攻击特效?
首先我们要知道激光的长度是不好把握的,所以为了方便我用了单个的激光模型经过多次放置组合成一段比较长的模型,通过控制for循环的次数就可以控制激光的长度(虽说有亿点卡)
首先我们先写好大体的框架
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
}
})
然后再用for循环放置模型拼接成一个长的激光
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
for(let i=1/*这里必须是1*/;i<=20;i++)//因为我的模型比较小所以要放20次
{
const w =world.createEntity({//放个模型
mesh:"mesh/new_del.vb",//这里随便用了个模型
fixed:false,
gravity:false,
collides:false,
meshScale:[0.1,0.1,0.1],//缩放
meshEmissive: 1,
position:[entity.position.x+i*raycast.direction.x*2,entity.position.y+ i*raycast.direction.y*2,entity.position.z+ i*raycast.direction.z*2],//这里是神奇的规定格式)
})
}
}
})
别问我这缩进怎么这么“美观”()()
所以为什么是这个亚子呢)

因为这里还有个问题)就是模型的旋转并没有调)所以运行了就会出现神奇的bug)))
所以我们先去天启扒下来04的旋转公式(划掉)
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
for(let i=1;i<=20;i++)
{
const Quat = new Box3Quaternion(0,0,0,1);//这里是初始的方向
const w =world.createEntity({//放个模型
mesh:"mesh/new_del.vb",
fixed:false,
gravity:false,
collides:false,
meshScale:[0.1,0.1,0.1],
meshEmissive: 1,
position:[entity.position.x+i*raycast.direction.x*2,entity.position.y+ i*raycast.direction.y*2,entity.position.z+ i*raycast.direction.z*2],//这里是神奇的规定格式)
})
w.meshOrientation=Quat.rotateX(Math.atan2(raycast.direction.y, Math.sqrt(raycast.direction.x ** 2 + raycast.direction.z ** 2))).rotateY(
Math.atan2(raycast.direction.z, raycast.direction.x))//这里是神奇的旋转)
}
}
})
这个时候就已经比较像样了
但是因为没有删除)
所以就会变成这个样)
我们再加上setTimeout来删除激光
world.onPress(async({ button, entity, raycast }) => { //事件
if(button ==='action0'){
for(let i=1;i<=20;i++)
{
const Quat = new Box3Quaternion(0,0,0,1);//这里是初始的方向
const w =world.createEntity({//放个模型
mesh:"mesh/new_del.vb",
fixed:false,
gravity:false,
collides:false,
meshScale:[0.1,0.1,0.1],//缩放
meshEmissive: 1,//发光度
position:[entity.position.x+i*raycast.direction.x*2,entity.position.y+ i*raycast.direction.y*2,entity.position.z+ i*raycast.direction.z*2],//这里是神奇的规定格式)
})
w.meshOrientation=Quat.rotateX(Math.atan2(raycast.direction.y, Math.sqrt(raycast.direction.x ** 2 + raycast.direction.z ** 2))).rotateY(
Math.atan2(raycast.direction.z, raycast.direction.x))//这里是神奇的旋转)
setTimeout(()=>{
w.destroy()//摧毁激光单个节段
},200);//过200毫秒后执行
}
}
})
现在整个特效已经基本完成了
聪明的童鞋还可以加上区域判断来检测受伤)
不是天启的源码)是我拍脑袋想的)
以上就是全部教程啦
那么怎样才能食用此教程呢?
首先拿出yhh就地踩Infinity次(doge)
然后添加一个激光模型把文件名改成new_del
如果想要更长一点就改改for循环里的数字
祝你吃的开心(滑稽)