gpt4 book ai didi

unity-game-engine - Unity 5.1 网络 - 为主机和所有客户端生成一个对象作为子对象

转载 作者:行者123 更新时间:2023-12-02 13:39:13 26 4
gpt4 key购买 nike

我有一个可以装备多种武器的玩家对象。当装备武器时,其变形的父级将设置为其手。我已经对此搞乱了一段时间,但无法让它同时适用于主机和客户端。现在我正在尝试在服务器上装备武器,并告诉所有客户端设置他们的 parent 变换。

public NetworkInstanceId weaponNetId; 

[Command]
void Cmd_EquipWeapon()
{
var weaponObject = Instantiate (Resources.Load ("Gun"),
hand.position,
Quaternion.Euler (0f, 0f, 0f)) as GameObject;

weaponObject.transform.parent = hand;

NetworkServer.Spawn (weaponObject);

//set equipped weapon
var weapon = weaponObject.GetComponent<Weapon> () as Weapon;

weaponNetId = weaponObject.GetComponent<NetworkIdentity> ().netId;
Rpc_SetParentGameobject (weaponNetId);
}

[ClientRpc]
public void Rpc_SetParentGameobject(NetworkInstanceId netID)
{
weaponNetId = netId;
}

在更新中我正在更新武器变换

    void Update () {

// set child weapon tranform on clients
if (!isServer) {
if (weaponNetId.Value != 0 && !armed) {
GameObject child = NetworkServer.FindLocalObject (weaponNetId);


if (child != null) {
child.transform.parent = hand;
}
}
}

我知道这不是最优化的方法..但现在我只是想让它以任何可能的方式工作,然后努力调整它。看起来这应该是一个简单的任务。

最佳答案

我们在多人游戏中做了类似的事情。您需要做一些事情才能使其正常工作。一、概念:

正如您所发现的,在服务器上设置武器的父级很简单。只需像在 Unity 中通常那样设置变换的父级即可。但是,在使用 NetworkServer.Spawn 在服务器上生成此对象后,它将在场景根部的客户端上生成(生成的预制件外部的层次结构不同步)。

因此,为了调整客户端的层次结构,我建议您:

  • 使用 SyncVar 在服务器和客户端之间同步父对象的 netID。
  • 当对象在客户端上生成时,使用同步的 netID 查找父对象并将其设置为转换的父对象。
<小时/>

因此,我会调整您的代码,使其看起来像这样。首先,在生成武器之前设置武器的父网络 ID。这将确保当它在客户端上生成时,将设置 netId。

[Command]
void Cmd_EquipWeapon()
{
var weaponObject = Instantiate (Resources.Load ("Gun"),
hand.position,
Quaternion.Euler (0f, 0f, 0f)) as GameObject;
weaponObject.parentNetId = hand.netId; // Set the parent network ID
weaponObject.transform.parent = hand; // Set the parent transform on the server

NetworkServer.Spawn (weaponObject); // Spawn the object
}
<小时/>

然后在你的武器类别中:

  • 添加parentNetId 属性。
  • 将其标记为[SyncVar],以便在服务器和客户端副本之间同步。
  • 在客户端上生成时,使用 netId 查找父对象并将其设置为转换的父对象。

也许是这样的:

[SyncVar]
public NetworkInstanceId parentNetId;

public override void OnStartClient()
{
// When we are spawned on the client,
// find the parent object using its ID,
// and set it to be our transform's parent.
GameObject parentObject = ClientScene.FindLocalObject(parentNetId);
transform.SetParent(parentObject.transform);
}

关于unity-game-engine - Unity 5.1 网络 - 为主机和所有客户端生成一个对象作为子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31359668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com