【问题标题】:How to destroy child object of other player in UNET?如何在 UNET 中销毁其他玩家的子对象?
【发布时间】:2017-09-12 17:57:05
【问题描述】:

现在,我有一个多人游戏,玩家向其他有一定数量气泡的玩家发射射弹。一旦玩家失去了所有的泡泡,他们就输了。

我之前遇到的问题是,在一个屏幕上,第一个玩家可以射出第二个玩家的气泡,但并非第二个玩家屏幕上的所有气泡都会弹出,所以我正在尝试通过网络同步它不知何故。

我看到的问题是 NetworkServer.Destroy 需要通过其 NetworkIdentity 找到您打算销毁的 GameObject,但仅允许根 Player GameObject 具有 NetworkIdentity 组件。我可以同步销毁玩家的子对象的最佳方式是什么?

【问题讨论】:

  • 我对网络不太熟悉,但这里有一个可能的解决方案的建议。 docs.unity3d.com/Manual/UNetActions.html 您可以给每个子对象一个唯一的非网络 ID 并进行远程操作调用(请参阅链接),然后它会告诉每个客户端/服务器销毁该对象,有点像制作您自己的 NetworkServer.Destroy 调用一种方式。

标签: c# unity3d networking multiplayer unity-networking


【解决方案1】:

https://unity3d.com/fr/learn/tutorials/topics/multiplayer-networking/ 课程与您描述的游戏非常相似。它在发射的子弹上附加了一个子弹脚本。如果子弹碰到了某物,它会检查它是否是玩家,并对它施加伤害(玩家预制件附有Health 脚本)。

using UnityEngine;
using System.Collections;

public class Bullet : MonoBehaviour {

    void OnCollisionEnter(Collision collision)
    {
        var hit = collision.gameObject;

        /* Code below is from the original example
        var health = hit.GetComponent<Health>();
        if (health  != null)
        {
            health.TakeDamage(10);
        }*/

        var bubble = hit.GetComponent<BubbleBehavior>();
        if (bubble != null)
        {
            bubble.Popped(); // Implement a Popped function doing the magic
        }

        Destroy(gameObject);
    }
}

在您的情况下,您也可以这样做,但不要检查被触摸的对象是否是玩家,而只需检查它是否是气泡,然后从被触摸的气泡中做任何您想做的事情。

在原始示例中,它们同步健康状况(它是“SyncVar”),在您的情况下,您可以同步剩余的气泡数。

【讨论】:

  • 那么在这一个中,您会在气泡中添加网络行为吗?不是所有的网络行为都需要单独产生吗?
  • 气泡是玩家 GameObject 的子对象,它已经具有网络行为,所以我想说一个“简单”的 MonoBehavior 应该没问题,然后因为气泡弹出需要同步,所以触摸的气泡可以调用其父网络行为的命令。我认为这会奏效。如果你还没有读过,我真的建议你看看我链接的教程,特别是第 10、11、12 和 13 部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2016-02-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
相关资源
最近更新 更多