Unity MLAPI中NetworkObject生成瓦片客户端同步缩放异常问题
你遇到的问题核心是MLAPI默认不会同步物体的缩放属性和父子层级关系,Host本地实例化时指定的父级和缩放仅在本地生效,客户端生成的瓦片没有继承对应父物体属性,因此显示异常。
解决步骤
- 步骤1:配置瓦片Prefab的同步组件
给瓦片Prefab添加NetworkTransform组件,勾选组件的「Sync Scale」选项,开启缩放的跨端同步。 - 步骤2:配置父物体的网络属性
给代码中赋值的parent物体添加NetworkObject组件,只有携带该组件的物体才能作为网络对象的父级实现跨端同步。 - 步骤3:修改瓦片生成逻辑,同步父子关系
原有代码中Instantiate时指定的父级仅在Host本地生效,需要调整为Spawn后调用API同步父级,修改后的代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using MLAPI; using MLAPI.Messaging; public class TileMap : NetworkBehaviour { public GameObject preFab; public GameObject parent; private float xMap = -95f; private float zMap = -95f; public override void NetworkStart() { if (!IsHost) { return; } for (int x = 1; x <= 20; x++) { for (int z = 0; z < 20; z++) { // 实例化时先不指定父级,避免本地父级和同步父级冲突 GameObject TileOfMap = Instantiate(preFab, new Vector3(xMap, -0.4f, zMap), Quaternion.Euler(90, 0, 0)); NetworkObject tileNetObj = TileOfMap.GetComponent<NetworkObject>(); // 先生成网络对象 tileNetObj.Spawn(); // 同步设置父级,所有客户端都会自动同步父子关系 tileNetObj.TrySetParent(parent.transform); zMap = zMap + 10; } xMap = xMap + 10; zMap = -95; } base.NetworkStart(); } }
如果瓦片缩放为固定值、不需要运行时修改,也可以直接将Prefab的本地缩放调整为正确值,无需开启「Sync Scale」,只要父子关系同步正确即可正常显示。
内容的提问来源于stack exchange,提问作者Cedworks
相关产品推荐
相关产品推荐

