我正在尝试实现一个命令模式,通过 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);
但不知道如何发送参数的对象[](假设所有参数都是可序列化的)
编辑以消除任何混乱:
我该怎么做?我尝试过的方法都没有效果。
经过大量的尝试和错误(大部分是错误),这就是我想出的。
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 来完成它的操作,无论子类型如何并且具有所有正确的参数。