【问题标题】:Photon Bolt: Inconsistent Network IDs across NetworkPhoton Bolt:跨网络的网络 ID 不一致
【发布时间】:2020-06-12 18:37:25
【问题描述】:

我有两个客户端,AB,都实现了Bolt.EntityEventListener

当我打印出 AB 的网络 ID 时,A 是所有者,我看到以下映射:

A => network_id [1]

B => network_id [2]

但是:

当我通过 B 的视图打印出网络时,网络 id 被交换:

A => network_id [2]

B => network_id [1]

我的印象是网络 ID 在整个网络中一致唯一。好像不是这样的。

如何在整个网络中唯一标识给定实体?

【问题讨论】:

  • 您可以在一侧分配您自己的网络 ID(如 A),然后该客户端将告诉其余的 ID 他们应该具有的顺序?

标签: c# unity3d networking photon


【解决方案1】:

1:您不需要唯一的 ID,如果您这样做,最好通过带有 Id 字段的 ScriptableObjects 使用您自己的系统。

2:通过识别您可能意味着您想要识别它,以便您可以针对同一复制的游戏对象对其他客户端的对象进行操作,您可以通过将实体类型作为参数传递到事件中来做到这一点。当您发送事件时,您只需将该参数设置为游戏对象上的GetComponent<BoltEntity>(),然后 Bolt 将处理该参数,因此接收事件的任何人都将拥有指向与复制对象对应的同一实体参数/您从其他客户端发送的实体。

3:总结:在 Bolt Assets 窗口中,在您的 Event 类型的 Entity 中添加一个参数。因此例如 int DamageAmount 和 Entity TargetCharacter 在代码中,在发送 Event 时使用 A.GetComponent()。 MyDamageEvent.Post(10, A.GetComponent());如果你的事件有两个参数,一个整数伤害量和一个实体参数。 在您的 BoltEntityEventListener 子类中被覆盖的 OnEvent() 中,您将自动在那里拥有 BoltEntity。所以你可以做 ev.TargetCharacter.gameObject 并做任何你需要的事情。

【讨论】:

    【解决方案2】:

    您还可以为 Bolt State 资产添加一个名为 Parent 的 Entity 类型的属性。

    将游戏对象实例化为服务器:

     GameObject newCamp = BoltNetwork.Instantiate(campPrefab, campPos.position, Quaternion.identity);
                newCamp.GetComponent<CampController>().state.Parent = campPos.GetComponent<BoltEntity>();
    

    这是游戏对象本身的代码

     public override void Attached()
    {
        state.SetTransforms(state.BoltTransform, transform);
        state.AddCallback("Parent", ParentCallback);
    }
    
    private void ParentCallback()
    {
        transform.SetParent(state.Parent.transform);
    }
    

    此代码是从我的项目中复制粘贴的,因此它可以 100% 运行。

    希望能帮到你

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      相关资源
      最近更新 更多