Unity3D Unet(Network)如何将生成的物体变为子物体
相信搜索这个问题的你已经发现了,在服务器上将生成的物体变为子物体是很简单的,就和平时的做法一样,但是在客户端上却无法正常转换。
这是因为在服务器上Spawn出物体到客户端后,客户端的层级关系和服务器是不同的,所以我们需要通过同步 netId 来获取其父物体。
- 首先,你需要在物体生成时指定其父物体的 netId: (这里我将代码写在了玩家身上)
[Command]
void CmdCreatWeapon()
{
GameObject myWeapon = Instantiate(weapon, hand.position, hand.rotation) as GameObject;//生成武器
myWeapon.GetComponent<Weapon>().parentId = netId;//同步武器的父集Id(parentId)为玩家(当前物体)的netId
NetworkServer.SpawnWithClientAuthority(myWeapon, connectionToClient);//派生出当前武器(这一步是因为我要给武器授权,你做的时候直接Spawn出来就行)
}
- 然后通过生成时得到的 netId 来获取自身父物体:(此代码写在生成的物体上)
[SyncVar] [HideInInspector] public NetworkInstanceId parentId;//父集Id(要用[SyncVar]同步)
private void Start()
{
GameObject parentObject = ClientScene.FindLocalObject(parentId);//通过父集Id查找父物体
transform.SetParent(parentObject.transform);//变为父物体的子物体
}
这样就完成了。