猫史档案馆


【特效教程】如何做出像元气骑士那样的彩虹武器发射特效

用户:guxia666guxia666查看:14 回复:15 评论:14 创建时间:2022-04-18T08:28:45


首先,大家要先了解如何做出这样的特效(tm这不是废话emotion_doge

首先,彩虹发射特效=子弹发射代码+模型尾部彩虹特效

然后了解这一点就开始我们的代码emotion_doge

对了这次的特效代码利用到了渐变特效(特效代码如下:
                    particleLimit: 30,
                    particleLifetime: 5,
                    particleRate: 30,
                    particleRateSpread: 30,
                    particleSize: [5, 3, 5, 3, 5],
                    particleColor: [
                        new Box3RGBColor(10, 0, 0),
                        new Box3RGBColor(0, 10, 0),
                        new Box3RGBColor(0, 0, 10),
                    ], // 设置颜色(紫色)
                    particleVelocity: new Box3Vector3(0, 0, 0)

最后直接再写一个发射子弹代码就ok了

最后整体代码:

world.onPlayerJoin(({ entity }) => { //当玩家进入地图时
    if (entity.player.name === '搬砖喵' || entity.player.name === '吉吉喵') {
        entity.addTag('ghost') //本喵不受攻击
    }
    entity.enableDamage = true //允许这个玩家受伤
    entity.id = entity.player.userKey//把userKey作为玩家的id
    world.addCollisionFilter('#' + entity.id, '#' + entity.id)//让id跟玩家id一样的实体不会相互碰撞, 比如玩家的飞刀不会碰到玩家, 自己的飞刀之间也不会碰撞
})
world.addCollisionFilter('.ghost', '*')

world.onPlayerLeave(({ entity }) => { //当玩家离开地图时
    world.removeCollisionFilter('#' + entity.id, '#' + entity.id)//取消这个玩家的碰撞过滤器
})
const SHANGHAI = [3, 5]//伤害随机数
const Quat = new Box3Quaternion(0, 0, 0, 1);//不懂得不是人(doge)
const DAO = [0.1 / 16, 0.1 / 16, 0.1 / 16] //正常的模型缩放比例
world.onPress(async ({ entity, button }) => {
    if (button === 'action0' ) {
        
            //彩虹特效(分为两部分:1.发射子弹代码[子弹用的是光球]2.尾部有彩虹特效粒子)
            //以下部分实现的是发射子弹
            const d = entity.player.facingDirection //玩家的朝向
            const knife = world.createEntity({
                mesh: 'mesh/光球.vb',
                meshScale: DAO,
                collides: true, // 开启碰撞
                gravity: false, // 不受重力影响
                position: entity.position, // 在玩家的位置生成飞刀
                velocity: d.scale(2), // 飞刀的初速度是玩家朝向向量的2倍
                meshOrientation: Quat.rotateY(Math.atan2(d.z, d.x)),
            })
            const caihongtexiao = [knife];

            for (const e of caihongtexiao) {
                Object.assign(
                    e, {
                    particleLimit: 30,
                    particleLifetime: 5,
                    particleRate: 30,
                    particleRateSpread: 30,
                    particleSize: [5, 3, 5, 3, 5],
                    particleColor: [
                        new Box3RGBColor(10, 0, 0),
                        new Box3RGBColor(0, 10, 0),
                        new Box3RGBColor(0, 0, 10),
                    ], // 设置颜色(紫色)
                    particleVelocity: new Box3Vector3(0, 0, 0)

                }
                )
            }
            knife.id = entity.player.userKey //将小刀的id设置成玩家userKey, 便于碰撞过滤器识别
            knife.onEntityContact(({ other }) => {//每当飞刀碰到另一个实体
                other.hurt(SHANGHAI[Math.floor(Math.random() * SHANGHAI.length)])//被碰实体受随机伤害(这里的随机指3或5点伤害)
            })

            await sleep(2000)//等2秒后
            knife.destroy()//清除模型, 防止模型数量太多超过服务器负载
        }
    
})

当然如果让模型在不同时间切换不同的颜色效果会更好,这个就不演示了,就当作大家的作业了emotion_doge

(小声bb这期没有那么水了吧(bushi)emotion_doge

 


回复

上一页1 页 / 共 1下一页
guxia666guxia666

哎嘿顶

点赞0


评论


AlcalaAlcala

 new Box3RGBColor(10, 0, 0),

是啥意思,不是取值0~1吗

点赞0


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

沙发+收藏

点赞0


评论


guxia666guxia666

顶顶

点赞1


评论


Robot一只屑代码师Robot一只屑代码师

world.onPlayerJoin(({ entity }) => { //当玩家进入地图时
    if (entity.player.name === '搬砖喵' || entity.player.name === '吉吉喵') {
        entity.addTag('ghost') //本喵不受攻击
    }
    entity.enableDamage = true //允许这个玩家受伤
    entity.id = entity.player.userKey//把userKey作为玩家的id
    world.addCollisionFilter('#' + entity.id, '#' + entity.id)//让id跟玩家id一样的实体不会相互碰撞, 比如玩家的飞刀不会碰到玩家, 自己的飞刀之间也不会碰撞
})
world.addCollisionFilter('.ghost', '*')

world.onPlayerLeave(({ entity }) => { //当玩家离开地图时
    world.removeCollisionFilter('#' + entity.id, '#' + entity.id)//取消这个玩家的碰撞过滤器
})
const SHANGHAI = [3, 5]//伤害随机数
const Quat = new Box3Quaternion(0, 0, 0, 1);//不懂得不是人(doge)
const DAO = [0.1 / 16, 0.1 / 16, 0.1 / 16] //正常的模型缩放比例
world.onPress(async ({ entity, button }) => {
    if (button === 'action0' ) {
        
            //彩虹特效(分为两部分:1.发射子弹代码[子弹用的是光球]2.尾部有彩虹特效粒子)
            //以下部分实现的是发射子弹
            const d = entity.player.facingDirection //玩家的朝向
            const knife = world.createEntity({
                mesh: 'mesh/光球.vb',
                meshScale: DAO,
                collides: true, // 开启碰撞
                gravity: false, // 不受重力影响
                position: entity.position, // 在玩家的位置生成飞刀
                velocity: d.scale(2), // 飞刀的初速度是玩家朝向向量的2倍
                meshOrientation: Quat.rotateY(Math.atan2(d.z, d.x)),
            })
            const caihongtexiao = [knife];

            for (const e of caihongtexiao) {
                Object.assign(
                    e, {
                    particleLimit: 30,
                    particleLifetime: 5,
                    particleRate: 30,
                    particleRateSpread: 30,
                    particleSize: [5, 3, 5, 3, 5],
                    particleColor: [
                        new Box3RGBColor(10, 0, 0),
                        new Box3RGBColor(0, 10, 0),
                        new Box3RGBColor(0, 0, 10),
                    ], // 设置颜色(紫色)
                    particleVelocity: new Box3Vector3(0, 0, 0)

                }
                )
            }
            knife.id = entity.player.userKey //将小刀的id设置成玩家userKey, 便于碰撞过滤器识别
            knife.onEntityContact(({ other }) => {//每当飞刀碰到另一个实体
                other.hurt(SHANGHAI[Math.floor(Math.random() * SHANGHAI.length)])//被碰实体受随机伤害(这里的随机指3或5点伤害)
            })

            await sleep(2000)//等2秒后
            knife.destroy()//清除模型, 防止模型数量太多超过服务器负载
        }
    
})

点赞0


评论


Robot一只屑代码师Robot一只屑代码师

world.onPlayerJoin(({ entity }) => { //当玩家进入地图时
    if (entity.player.name === '搬砖喵' || entity.player.name === '吉吉喵') {
        entity.addTag('ghost') //本喵不受攻击
    }
    entity.enableDamage = true //允许这个玩家受伤
    entity.id = entity.player.userKey//把userKey作为玩家的id
    world.addCollisionFilter('#' + entity.id, '#' + entity.id)//让id跟玩家id一样的实体不会相互碰撞, 比如玩家的飞刀不会碰到玩家, 自己的飞刀之间也不会碰撞
})
world.addCollisionFilter('.ghost', '*')

world.onPlayerLeave(({ entity }) => { //当玩家离开地图时
    world.removeCollisionFilter('#' + entity.id, '#' + entity.id)//取消这个玩家的碰撞过滤器
})
const SHANGHAI = [3, 5]//伤害随机数
const Quat = new Box3Quaternion(0, 0, 0, 1);//不懂得不是人(doge)
const DAO = [0.1 / 16, 0.1 / 16, 0.1 / 16] //正常的模型缩放比例
world.onPress(async ({ entity, button }) => {
    if (button === 'action0' ) {
        
            //彩虹特效(分为两部分:1.发射子弹代码[子弹用的是光球]2.尾部有彩虹特效粒子)
            //以下部分实现的是发射子弹
            const d = entity.player.facingDirection //玩家的朝向
            const knife = world.createEntity({
                mesh: 'mesh/光球.vb',
                meshScale: DAO,
                collides: true, // 开启碰撞
                gravity: false, // 不受重力影响
                position: entity.position, // 在玩家的位置生成飞刀
                velocity: d.scale(2), // 飞刀的初速度是玩家朝向向量的2倍
                meshOrientation: Quat.rotateY(Math.atan2(d.z, d.x)),
            })
            const caihongtexiao = [knife];

            for (const e of caihongtexiao) {
                Object.assign(
                    e, {
                    particleLimit: 30,
                    particleLifetime: 5,
                    particleRate: 30,
                    particleRateSpread: 30,
                    particleSize: [5, 3, 5, 3, 5],
                    particleColor: [
                        new Box3RGBColor(10, 0, 0),
                        new Box3RGBColor(0, 10, 0),
                        new Box3RGBColor(0, 0, 10),
                    ], // 设置颜色(紫色)
                    particleVelocity: new Box3Vector3(0, 0, 0)

                }
                )
            }
            knife.id = entity.player.userKey //将小刀的id设置成玩家userKey, 便于碰撞过滤器识别
            knife.onEntityContact(({ other }) => {//每当飞刀碰到另一个实体
                other.hurt(SHANGHAI[Math.floor(Math.random() * SHANGHAI.length)])//被碰实体受随机伤害(这里的随机指3或5点伤害)
            })

            await sleep(2000)//等2秒后
            knife.destroy()//清除模型, 防止模型数量太多超过服务器负载
        }
    
})world.onPlayerJoin(({ entity }) => { //当玩家进入地图时
    if (entity.player.name === '搬砖喵' || entity.player.name === '吉吉喵') {
        entity.addTag('ghost') //本喵不受攻击
    }
    entity.enableDamage = true //允许这个玩家受伤
    entity.id = entity.player.userKey//把userKey作为玩家的id
    world.addCollisionFilter('#' + entity.id, '#' + entity.id)//让id跟玩家id一样的实体不会相互碰撞, 比如玩家的飞刀不会碰到玩家, 自己的飞刀之间也不会碰撞
})
world.addCollisionFilter('.ghost', '*')

world.onPlayerLeave(({ entity }) => { //当玩家离开地图时
    world.removeCollisionFilter('#' + entity.id, '#' + entity.id)//取消这个玩家的碰撞过滤器
})
const SHANGHAI = [3, 5]//伤害随机数
const Quat = new Box3Quaternion(0, 0, 0, 1);//不懂得不是人(doge)
const DAO = [0.1 / 16, 0.1 / 16, 0.1 / 16] //正常的模型缩放比例
world.onPress(async ({ entity, button }) => {
    if (button === 'action0' ) {
        
            //彩虹特效(分为两部分:1.发射子弹代码[子弹用的是光球]2.尾部有彩虹特效粒子)
            //以下部分实现的是发射子弹
            const d = entity.player.facingDirection //玩家的朝向
            const knife = world.createEntity({
                mesh: 'mesh/光球.vb',
                meshScale: DAO,
                collides: true, // 开启碰撞
                gravity: false, // 不受重力影响
                position: entity.position, // 在玩家的位置生成飞刀
                velocity: d.scale(2), // 飞刀的初速度是玩家朝向向量的2倍
                meshOrientation: Quat.rotateY(Math.atan2(d.z, d.x)),
            })
            const caihongtexiao = [knife];

            for (const e of caihongtexiao) {
                Object.assign(
                    e, {
                    particleLimit: 30,
                    particleLifetime: 5,
                    particleRate: 30,
                    particleRateSpread: 30,
                    particleSize: [5, 3, 5, 3, 5],
                    particleColor: [
                        new Box3RGBColor(10, 0, 0),
                        new Box3RGBColor(0, 10, 0),
                        new Box3RGBColor(0, 0, 10),
                    ], // 设置颜色(紫色)
                    particleVelocity: new Box3Vector3(0, 0, 0)

                }
                )
            }
            knife.id = entity.player.userKey //将小刀的id设置成玩家userKey, 便于碰撞过滤器识别
            knife.onEntityContact(({ other }) => {//每当飞刀碰到另一个实体
                other.hurt(SHANGHAI[Math.floor(Math.random() * SHANGHAI.length)])//被碰实体受随机伤害(这里的随机指3或5点伤害)
            })

            await sleep(2000)//等2秒后
            knife.destroy()//清除模型, 防止模型数量太多超过服务器负载
        }
    
})

点赞0


评论


guxia666guxia666

啊啊啊顶顶顶

点赞0


评论


alopdopsalopdops

bhdwv

 

点赞0


评论


NeutrophilsNotNeutrophilsNot

nb

点赞0


评论


YLG_個YLG_個

()

点赞0


评论


yee089yee089

《遇上彩虹吃定彩虹》

点赞0


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

挖小坟()

点赞0


评论


指令者指令者

《遇上彩虹吃定彩虹》

点赞1


评论


全能代码师全能代码师

awa

点赞0


评论


37303730

挖坟()

点赞0


评论