Unity Mirror联机 案例以及总结(一)

坦克案例

位移

通常来说,我们的玩家,在该案例中也就是坦克,至少有3个组件,NetWork Identity、NetWorkTransform、Network Transform Child,其中 Network Transform Child 用于同步子物体的位置等信息。
image.png

因为Network Transform 和Network Transform Child会帮我们处理位置等信息,所以我们只需要在Update里面像处理单机游戏时一样去处理我们的主角的位移就好了,但是需要注意的是,我们需要判断是否是本地的Player,因为如果没有这条判断,则在我们的客户端上,我们执行位移代码,则其他的客户端也会被执行位移等。
image.png
试想一下,我们的客户端上存在多个坦克的物体(本机和其他玩家所产生的物体),因为如果没有做是否是本地的判断的话,则玩家的输入势必会影响所有的坦克物体(但只有本机的客户端物体的位置信息会被同步出去)
image.png

动画

如图,如果我们没有任何处理的去设置动画参数,那么它不会被同步到其他的客户端,即使你像处理位移的去处理这个动画(位移能同步是因为有Network Transform组件)
image.png
我们可以通过 [Command]特性来使我们的动画参数进行同步,如(调用的地方在上面图中可以看到):



// this is called on the server
[Command]
void CmdFire()
{
    GameObject projectile = Instantiate(projectilePrefab, projectileMount.position, projectileMount.rotation);
    NetworkServer.Spawn(projectile);
    RpcOnFire();
}

// this is called on the tank that fired for all observers
[ClientRpc]
void RpcOnFire()
{
    animator.SetTrigger("Shoot");
}

[Command]特性可以让函数的执行被客户端发送到服务器端,服务器去处理;其中NetworkServer.Spawn,可以让所有的客户端都生成该物体。
RpcOnFire这个函数被标记为[ClientRpc],RPC是远程调用的意思,服务器使用远程过程调用(RPC)在客户端上运行此函数。

碰撞检测

碰撞检测的代码被[ServerCallback]标记,表明该方法会被防止客户端执行;表明碰撞检测是在服务器上进行的,NetworkServer.Destory是指:销毁此对象以及所有客户端上的对应对象。

[ServerCallback]
void OnTriggerEnter(Collider other)
{
    if (other.GetComponent<Projectile>() != null)
    {
        --health;
        if (health == 0)
            NetworkServer.Destroy(gameObject);
    }
}
posted @   LemonInCup  阅读(1075)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示