EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

[Unity]Mirror联网插件——基本信息同步(三)

接上一讲:[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的信息,

这个功能叫做“加入好友所在的游戏”,实际上就是加入同一个服务器。

 

 

 

This article was last edited at 2020-04-13 06:52:45

* *