我正在使用Unity网络,我正在编写一种通过网络调用另一个网络的方法。目前我有一堆看起来像
的方法void Call<A>(Action<A> method, A arg) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg);
}
void Call<A,B>(Action<A,B> method, A arg1, B arg2) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg1, arg2);
}
... 等等
还有一些变体可以在特定播放器和系统上调用它以使其与Photon Cloud一起使用。因此,有很多这些方法,而且它变得非常混乱。
现在,我想知道是否有可能拥有任何数量参数的Action。所以我可以做类似的事情:
void Call(Action method, params object[] args) {
_networkView.RPC(method.Method.Name, RPCMode.Others, args);
}
这可能吗?
谢谢!
答案 0 :(得分:2)
有可能:
public delegate void ParamArrayAction<V>(params V[] variableArgs);
public delegate void ParamArrayAction<F, V>(F fixedArg, params V[] variableArgs);
public delegate void ParamArrayAction<F1, F2, V>(F1 fixedArg1, F2 fixedArg2, params V[] variableArgs);
public delegate void ParamArrayAction<F1, F2, F3, V>(F1 fixedArg1, F2 fixedArg2, F3 fixedArg3, params V[] variableArgs);
但它不是你要求的。实际上,您要求任何方法可分配的魔术委托类型。据我所知,这是不可能的。
这很奇怪(或者,也许,我不明白某些事情)。据我所知,你有很多像这样的方法
void Call<A>(Action<A> method, A arg) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg);
}
void Call<A, B>(Action<A, B> method, A arg1, B arg2) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg1, arg2);
}
.....
void Call<A, B, C, D>(Action<A, B, C, D> method, A arg1, B arg2, C arg3, D arg4) {
_networkView.RPC(method.Method.Name, RPCMode.Others, arg1, arg2, arg3, arg4);
}
.....
然后你像这样使用它们:
[RPC]
void DoSomething(string someText, int someValue)
{
// Bla-bla-bla
}
.....
void SomeRPCCallingMethod()
{
// Bla-bla-bla
Call(DoSomething, "Hello, World!", 42);
// Bla-bla-bla
}
我有点喜欢它。它增加了方法参数的编译时间检查。这很好。我不明白的是:
有很多这些方法
为什么呢?我不熟悉Unity的RPC。但无论如何,你可以:
NetworkView
和Call<>
方法。RPCMode
作为参数添加到Call<>
方法。如果您仍想这样做,请按照以下步骤操作:
void Call(string methodName, params object[] args) {
_networkView.RPC(methodName, RPCMode.Others, args);
}
Usage:
[RPC]
void DoSomething(string someText, int someValue)
{
// Bla-bla-bla
}
.....
void SomeRPCCallingMethod()
{
// Bla-bla-bla
Call("DoSomething", "Hello, World!", 42);
// Bla-bla-bla
}