Typically, RPC(remote procedure call) may have return values. Especially when caller needs to get result or just whether calling is successful. RPCs with return values can also grantee that calculation is always made on authoritatives and prevent having to share data with NetworkVariable and calculate locally.
Currently NGO does not seem to support RPC with return type. Declaring a non-void method with [RPC] would get err
error - RPC method must return `void`!
So currently my solution is always wrap a [RPC] void CommandxxxRpc()
[RPC] void CallbackRpc()
and TaskCompletionSource
for every where I need a return value to achieve this like
private TaskCompletionSource<bool> _callWithReturnValueTaskCompletionSource;
public async Task<bool> CallWithReturnValue()
{
_callWithReturnValueTaskCompletionSource = new TaskCompletionSource<bool>();
CommandCallRpc();
return await _callWithReturnValueTaskCompletionSource.Task;
}
[Rpc(SendTo.Server)]
private void CommandCallRpc(RpcParams rpcParams = default)
{
// do something
var success = true;
ReportCommandResultRpc(success, RpcTarget.Single(rpcParams.Receive.SenderClientId, RpcTargetUse.Temp));
}
[Rpc(SendTo.SpecifiedInParams)]
private void ReportCommandResultRpc(bool success, RpcParams rpcParams = default)
{
_callWithReturnValueTaskCompletionSource.TrySetResult(success);
}
Is this a good idea? How do you solve this? What’s NGO’s recommended solution?