Unity Netcode for GameObjects 命令模式与 RPC

问题描述 投票:0回答:1

我正在尝试实现一个命令模式,通过 rpc 发送命令来使用,但不知道如何正确发送它。

命令是这样设置的

abstract class Command
{
   public virtual void Execute() { }
}

class ConcreteCommand:Command
{
//some fields (all of which need to be serializable)
//some constructor
//override Execute()
}

我希望能够通过 rpc 发送任何命令,但无法弄清楚如何发送它。

我尝试让 Command 继承 INetworkSerialized 并让每个子类覆盖 NetworkSerialize,但收到错误消息“MissingMethodException:未找到 Command 类型的默认构造函数”

我尝试过使用反射

typename = ConcreteCommand.GetType().FullName;
parameters = ?????
//send via rpc
Activator.CreateInstance(Type.GetType(typeName), parameters);

但不知道如何发送参数的对象[](假设所有参数都是可序列化的)

编辑以消除任何混乱:

  • 我有一个生成具体命令的类。
  • 我有一个接受抽象命令的函数。
  • 该函数需要通过rpc将Abstract命令发送到服务器,并且服务器需要重新创建相同的Abstract Command(具有相同参数的相同子类),以便它可以调用Execute()。

我该怎么做?我尝试过的方法都没有效果。

c# unity-game-engine networking multiplayer abstract-data-type
1个回答
0
投票

经过大量的尝试和错误(大部分是错误),这就是我想出的。

public abstract class Command: INetworkSerializable
{
    public virtual void Execute() { }
    public abstract void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter;
    public abstract void Send(NetworkObjectReference netObj);
    protected void Recieve(Command command, NetworkObjectReference netObj) { /*Do stuff here*/ }
}

public class ConcreteCommand: Command
{
    public string field = "Default value";
    public ConcreteCommand(string field) { this.field = field; }
    public override void Execute() { /*Do stuff here*/ }
    public override void NetworkSerialize<T>(BufferSerializer<T> serializer)
    {
        serializer.SerializeValue(ref field);
    }
    public override void Send(NetworkObjectReference netObj) { CommandServerRpc(this, netObj); }
    [ServerRpc] public void CommandServerRpc(ConcreteCommand command, NetworkObjectReference netObj) { Recieve(command, netObj); }
}

客户端代码只需要调用 Command.Send,服务器就可以使用 Command 来完成它的操作,无论子类型如何并且具有所有正确的参数。

© www.soinside.com 2019 - 2024. All rights reserved.