坦克案例
位移
通常来说,我们的玩家,在该案例中也就是坦克,至少有3个组件,NetWork Identity、NetWorkTransform、Network Transform Child,其中 Network Transform Child 用于同步子物体的位置等信息。
因为Network Transform 和Network Transform Child会帮我们处理位置等信息,所以我们只需要在Update里面像处理单机游戏时一样去处理我们的主角的位移就好了,但是需要注意的是,我们需要判断是否是本地的Player,因为如果没有这条判断,则在我们的客户端上,我们执行位移代码,则其他的客户端也会被执行位移等。
试想一下,我们的客户端上存在多个坦克的物体(本机和其他玩家所产生的物体),因为如果没有做是否是本地的判断的话,则玩家的输入势必会影响所有的坦克物体(但只有本机的客户端物体的位置信息会被同步出去)
动画
如图,如果我们没有任何处理的去设置动画参数,那么它不会被同步到其他的客户端,即使你像处理位移的去处理这个动画(位移能同步是因为有Network Transform组件)
我们可以通过 [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);
}
}