[开发者心得] 如何制作个一个简单的宠物跟随效果

[复制链接]
1425 |3
属于你的雨天 发表于 2023-6-5 16:05:13 | 显示全部楼层 |阅读模式
本帖最后由 属于你的雨天 于 2023-11-1 15:02 编辑

功能介绍
  • 实现一个游戏中常见的宠物跟随效果

一分钟快速上手
核心实现逻辑是在update中,时刻检测,跟随主体与跟随对象的距离,然后动态修改跟随对象的位置来实现的

this._timestamp = Date.now();
            if (this._curCharacter && this._petTarget && Vector.squaredDistance(this._curCharacter.worldTransform.position, this._petTarget.worldTransform.position) > 40000) {
                if (!this._moveAnima.isPlaying) {
                    this._moveAnima.loop = 0;
                    this._moveAnima.play();
                }
                let dis = Vector.squaredDistance(this._curCharacter.worldTransform.position, this._petTarget.worldTransform.position)

                // 使用moveto
                // Navigation.navigateTo(this._petTarget, this._curCharacter.worldTransform.position, 50, () => {
                //     this._moveAnima.loop = 1;
                //     this._moveAnima.stop();
                // });

                Navigation.follow(this._petTarget, this._curCharacter, 50, () => {
                    this._moveAnima.loop = 1;
                    this._moveAnima.stop();
                });

                // 自己计算
                // let dir = this._curCharacter.worldTransform.position.subtract(this._petTarget.worldTransform.position);
                // this._petTarget.movementAxisDirection = dir;
                // this._petTarget.movementDirection = mw.MovementDirection.AxisDirection;
                // this._petTarget.addMovement(dir);
                // if (dis <= 2500) {
                //     this._moveAnima.loop = 1;
                //     this._moveAnima.stop();
                // }
            } else {
                if (this._moveAnima) {
                    this._moveAnima.loop = 1;
                    this._moveAnima.stop();
                }
            }



// 追加 027的更新 其中核心是 宠物的创建方式的修改



/**创建宠物 */
    public async createPet(): Promise<void> {
        await checkAssetCanUes("NPC");
        // 创建Pet
        let petTarget: mw.Character = await SpawnManager.spawn<mw.Character>({ guid: "NPC", replicates: false })
        petTarget.collisionWithOtherCharacterEnabled = false;
        // petTarget.animationMode = mw.AnimationMode.Custom;
        // petTarget.characterType = mw.AppearanceType.FourFootStandard;

        // 修改头顶UI位置
        let headUI = petTarget.overheadUI;
        let newLoc = headUI.worldTransform.position.clone();
        newLoc.z -= 70;
        headUI.worldTransform.position = newLoc;

        // 初始化形象
        // let fourFootStandard: mw.FourFootStandard = petTarget.setDescription(mw.FourFootStandard);
        await checkAssetCanUes("159609");
        petTarget.description.base.wholeBody = "159609";
        // 加载移动动画
        await checkAssetCanUes("150782");
        this._moveAnima = PlayerManagerExtesion.loadAnimationExtesion(petTarget, "150782", false)

        // 设置默认位置
        let _curCharacterLoc = Player.localPlayer.character.worldTransform.position;
        _curCharacterLoc.x += 300;
        petTarget.worldTransform.position = _curCharacterLoc;

        this._petTarget = petTarget;
    }




其中 有 两套实现方案 ;
1. 若是追求简单 直接使用 框架中的 Navigation.follow , 但是 必须在游戏场景中 添加寻路区域
image.png
2. 使用 游戏对象的 addMoveInput

补充:
由于框架完善这方面的需求 添加一个更加方便的AIP 可以直接使用跟随 且不用 在update中循环调用 但必须添加寻路区域 如下图:


#########################################

进阶方向
  • 宠物 可以绑定触发器  实现与宠物的交互逻辑
  • 宠物 的多端同步
  • 宠物推荐单端创建 同步多端 这这样可以减少性能消耗 petDemo.7z (59.17 KB, 下载次数: 82)
  • 在update中 其实 使用Navigation.follow 不用每帧监听 这也可以 优化性能 如图所示:



以下附上完整demo案例 与演示效果








回复

使用道具 举报

kk 发表于 2023-6-6 10:54:58 | 显示全部楼层
6
回复

使用道具 举报

吃到苦就是得到了甜 发表于 2023-6-7 16:43:01 | 显示全部楼层
学习了
回复

使用道具 举报

超级小飞侠 发表于 2023-11-5 23:14:19 | 显示全部楼层
非常有用,感谢
回复

使用道具 举报

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