首先创建玩家的Prefab:
添加Network Identity组件进行身份标识,这里勾选第二个表示只对本地玩家有效。第一个是仅在服务器上有效果。下面添加移动代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;//引入命名空间
public class PlayerHandler : NetworkBehaviour {
public override void OnStartClient()
{
//服务器开启修改玩家的颜色便于区分
transform.GetComponent<MeshRenderer>().material.color = Color.red;
}
private void FixedUpdate()
{
if (!isLocalPlayer) return;//如果不是本地玩家直接return,如果不作判断会导致操作一个时其他的会跟着发生改变
PlayerMove();
}
public void PlayerMove()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h, 0, v);
if (dir != Vector3.zero)
{
transform.rotation = Quaternion.LookRotation(dir);
transform.Translate(Vector3.forward * 2.5f * Time.deltaTime);
}
}
}
然后对在NetworkManager里对玩家进行设置:
必须将玩家添加到这,表示开启自动生成玩家。现在将项目发布看看效果,记得先删除hierarchy里面的Player:
我把Unity当做服务器和客户端,发布的作为客户端加入,分别移动他们的位置
服务器端玩家位置已经移动:
客户端显示:
两个玩家依然是重叠状态,就是说服务器玩家移动后客户端里面的位置没有进行同步,同步很简单,只需要为玩家添加一个同步组件Network Transform:
下面再看效果:
仅仅移动了服务器端,在客户端的位置也同样发生了改变,到这里玩家的同步就做好了,下一篇我们做子弹的发射和同步。
欢迎加群:4364930讨论。