【求助】使用发射器spawnProjectileInstanceLaunch时的问题

[复制链接]
108 |4
手可摘星辰 发表于 2024-10-29 14:43:49 | 显示全部楼层 |阅读模式
在S端上定义发射器,然后在S端使用spawnProjectileInstanceLaunch时,动画和实际落点不一致。
在C端上定义发射器,并且使用spawnProjectileInstanceLaunch,并且isAllClientLaunch为true时,动画和实际落点一致了,但是其他客户端不显示投掷物。

回复

使用道具 举报

丸子 发表于 2024-10-29 15:05:10 | 显示全部楼层
可以发一下你的工程不嘞
回复

使用道具 举报

手可摘星辰楼主 发表于 2024-10-29 15:27:50 | 显示全部楼层
本帖最后由 手可摘星辰 于 2024-10-29 15:35 编辑
丸子 发表于 2024-10-29 15:05
可以发一下你的工程不嘞

主要关于手雷的就是这部分


    private grenadeLauncher: ObjectLauncher; // 手雷发射器
    private grenadeEffect: string = "14329"; // 手雷爆炸效果ID
    private grenadeEffectScale: Vector = new Vector(0.4, 0.4, 0.4); // 手雷爆炸效果缩放


    // 投掷手雷
    private async throwGrenade(character: Character, direction: Vector): Promise<void> {
        const grenade = await GameObject.asyncSpawn("234389");
        await grenade.asyncReady();
        character.attachToSlot(grenade, HumanoidSlotType.RightHand);
        grenade.setCollision(PropertyStatus.Off);

        const throwAnimation = character.loadAnimation("268692");
        throwAnimation.slot = AnimSlot.Upper;
        throwAnimation.play();

        TimeUtil.delaySecond(0.2).then(() => {
            character.detachFromSlot(grenade);
            this.grenadeLauncher.spawnProjectileInstanceLaunch(grenade.gameObjectId, grenade.worldTransform.position, direction, true);
        });
    }
   
    // 初始化手雷发射器
    private async initGrenadeLauncher() {
        const launcher = await GameObject.asyncSpawn("ObjectLauncher") as ObjectLauncher;

        // 设置发射器参数
        launcher.initialSpeed = 3000; // 初始速度
        launcher.capsuleRadius = 25; // 碰撞半径
        launcher.capsuleHalfLength = 25; // 碰撞半长
        launcher.isShouldBounce = true; // 是否反弹
        launcher.collisionVelocityRetention = 0.3; // 碰撞速度衰减

        // 监听手雷飞行结束事件
        launcher.onProjectileLifeEnd.add((grenade) => {
            const effect = EffectService.playAtPosition(this.grenadeEffect, grenade.worldTransform.position, { scale: this.grenadeEffectScale });

            const bombResult = QueryUtil.sphereOverlap(grenade.worldTransform.position, 300, true);
            grenade.destroy();

            for (const result of bombResult) {
                if (result instanceof Character) {
                    const victim = result.player;
                    // this.net_ApplyDamage(victim, 100);
                }
            }

            TimeUtil.delaySecond(0.5).then(() => {
                EffectService.stop(effect);
            });
        });

        this.grenadeLauncher = launcher;
    }


回复

使用道具 举报

丸子 发表于 2024-10-31 11:28:52 | 显示全部楼层
1. 动画和实际落地不一致,这个可以给一个视频演示看看,是不是参数设置的不太正确
2. isAllClientLaunch并不是说会将客户端的对象同步给其他客户端,而是如果发射器是定义的双端,isAllClientLaunch开启以后,只会客户端执行,服务端就不再执行了
回复

使用道具 举报

手可摘星辰楼主 发表于 2024-10-31 16:49:02 | 显示全部楼层
丸子 发表于 2024-10-31 11:28
1. 动画和实际落地不一致,这个可以给一个视频演示看看,是不是参数设置的不太正确
2. isAllClientLaunch并 ...

谢谢大佬,我现在用服务器广播到所有客户端的办法做了。
下面这个视频是在moduleS定义发射器,
然后在moduleC使用this.sever.net_throwGrenade调用的情况。
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表