接上一讲:[Unity]Mirror联网插件——基本信息同步(二)
显然,你并不想所有的客户端都去响应服务器的同一个指令,
就比如上一讲的变换颜色同步,
这样的颜色变化,会在所有的客户端执行。
如果你需要特定的Client的进行响应,那么就需要使用[TargetRpc]。
还是老样子,这个方法命名强制以Target开头,其他随便怎么写。
增加代码(绿色部分):
using System.Collections;
using UnityEngine;
using Mirror;public class RemoteCallsDemo : NetworkBehaviour
{
public override void OnStartLocalPlayer()
{
base.OnStartLocalPlayer();
StartCoroutine(__RandomizeColor());
}private void SetColor(Color32 color)
{
SpriteRenderer renderer = GetComponent<SpriteRenderer>();
renderer.color = color;
}private IEnumerator __RandomizeColor()
{
WaitForSeconds wait = new WaitForSeconds(1f);while (true)
{
CmdChangeColor();
yield return wait;
}
}[Command]
private void CmdChangeColor()
{
Debug.Log("CmdChangeColor called");Color color = Random.ColorHSV(0f,1f,1f,1f,0f,1f,1f,1f);
SetColor(color);
NetworkIdentity identity = GetComponent<NetworkIdentity>();
TargetChangeColor(identity.connectionToClient,color);
}[ClientRpc]
private void RpcChangeColor(Color32 color)
{
Debug.Log("RpcChangeColor called.");
SetColor(color);
}[TargetRpc]
private void TargetChangeColor(NetworkConnection conn,Color32 color)
{
Debug.Log("TargetChangeColor called.");
SetColor(color);
}
}
最终效果:
是的,你会发现和上一讲效果完全一样。
但是,这个效果是只返回给发起命令的客户端的。
应用场景:
以斗地主为例,向服务器请求发牌,服务器需要给特定目标发牌。
我们不需要给客户端额外的信息,所以我们使用[TargetRpc]特性。
另外一种是互动,比如你client 戳了一下 另外一个client,对面要做出被戳的动画,
那么,消息序列必然是 client_A→Server→client_B→Server→client_A 。
Tips:
identity.connectionToServer的应用场景,
一般是你的client想从别的client的身上套到它连接的Server的信息,
这个功能叫做“加入好友所在的游戏”,实际上就是加入同一个服务器。