我对曼联还很陌生,对于我所看到的行为,我找不到任何合乎逻辑的答案.

我写了一个基本的脚本,如下所示:


public class PlayerPosition : NetworkBehaviour
{

    private Dictionary<string, int> testDict = new();

    [ServerRpc(RequireOwnership = false)]
    private void HitServerRpc(string key, int value)
    {
        RefreshClientRpc(key, value);
    }

    [ClientRpc]
    private void RefreshClientRpc(string key, int value)
    {
        testDict[key] = value;
        foreach (var item in testDict)
            {
                Debug.Log($"Item in current dict {item}");
            }
    }

   // Other logical code that calls only HitServerRpc().

}

I am using this script on my player Prefab in a client / host situation.
I have one client and one host (server + client) for the test and the question.

我的问题是:为什么testDict只有一个键和一个值,而至少有两个不同的键和值是通过两个不同的RPC调用添加的,每个客户端一个?

即使在两个不同的客户端上调用了HitServerRpc(),日志(log)Item in current dict也只显示一次:

  • HitServerRpc("user1", 3)
  • HitServerRpc("user2", 4)

所有客户端的testDict都应等于:{{"user1", 3}, {"user2", 4}}

PS:最奇怪的是,我try 在静态类中移动testDict并在内部更新它,而不是在处理RPC调用的类中进行更新,它现在在主机上有正确的值,但在客户机上仍然没有.

推荐答案

所有客户端的testDict都应等于:{{"user1", 3}, {"user2", 4}}

我明白你为什么这么想,但不是的!这些呼叫中的每一个都来自不同的客户端--因此来自/指向您的PlayerPosition的不同实例.

假设在您的描述中,您有两个玩家user1user2.

这些中的每一个都在PlayerPositiontheir相应的本地权威机构实例上调用HitServerRpc.然后作为ClientRPC中继到其他连接的客户端,但仍然只到their个相应的实例.

试图将这一切形象化

user 1 Device              Server       user 2 Device

user 1 (local auth) ---->  user 1 ----> user1
user 2              <----  user 2 <---- user 2 (local auth)

结果将是各个词典确实是同步的,然而,属于用户1的PlayPosition将仅知道密钥user1,并且因此另一实例仅具有密钥user2.

因此,我认为在您的用例中,实际上使用static会更有意义.不过,没有必要把它归入一个不同的类别.你可以使用

private static readonly Dictionary<string, int> testDict = new();

因此,PlayerPosition的所有本地实例都使用相同的字典实例.

Csharp相关问答推荐

如何将两个查询结果组合在C#ASP.NET MHC控制器中

如何在Visual Studio中为C# spread操作符设置格式规则?

使用LayoutKind在C#中嵌套 struct .显式

如何从HttpContext获取请求正文

如果属性名为xyz,我需要使用System.Text.Json修改字符串类型的值""<>

ITypeLib2.GetLibStatistics()在C#中总是抛出AccessViolationException

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

Blazor Foreach仅渲染最后一种 colored颜色

C#XmlSerializer-输出控制新行的多个XML片段

Appsettings.json未加载.Net 8 Blaazor Web程序集

在允许溢出的情况下将小数转换为长

获取具有AutoFaces的所有IOptions对象的集合

C#阻塞调用或await calling inside calling方法

try 在.Net核心身份注册页面中使用AJAX,但没有成功..NET Core 5.0 Razor页面应用程序

如何在GRPC代码First服务的返回类型上使用多态性?

EF Core 7-忽略模型绑定中的虚拟属性

为什么我的自定义Json.net转换器不工作?

并发表更新.EF核心交易

C#定时器回调对象上下文?

如何处理ASP.NET Core中包含两个构造函数的控制器?