首先,我们需要的是新建一个空物体“SpawnManager”,将GameManager中的SpawnManaer_ZombieSpawner拖到SpawnManager中,并移除GameManager中的NetworkIdentity,SpawnManager中添加NetworkIdentity,并勾选Server Only选项
第二,打开最开始的脚本Player_NetworkSetup,修改其代码(去掉原来的Start函数,将Start函数中的内容复制到OnStartLocalPlayer中)
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_NetworkSetup : NetworkBehaviour {
[SerializeField]
Camera FPSCharacterCam;
[SerializeField]
AudioListener audioListener;
public override void OnStartLocalPlayer()
{
GameObject.Find("Scene Camera").SetActive(false);
//GetComponent<CharacterController>().enabled = true;
GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = true;
FPSCharacterCam.enabled = true;
audioListener.enabled = true;
}
}
public override void PreStartClient()
{
healthScript = GetComponent<Player_Health>();
healthScript.EventDie += DisablePlayer;
}
public override void OnStartClient()
{
crossHairImage = GameObject.Find("crossHairImage").GetComponent<Image>();
}
第四,打开脚本Player_Health,修改其代码(去掉原来的Start函数,将Start函数中的内容复制到OnStartLocalPlayer中)
public override void OnStartLocalPlayer()
{
healthText = GameObject.Find("Health Text").GetComponent<Text>();
SetHealthText();
}
第五,打开脚本Player_Respawn,修改其代码(去掉原来的Start函数,将Start函数中的内容复制到OnStartLocalPlayer和PreStartClient中),将OnDisable函数重新更名为public override void OnNetworkDestroy()
public override void PreStartClient()
{
healthScript = GetComponent<Player_Health>();
healthScript.EventRespawn += EnablePlayer;
}
public override void OnStartLocalPlayer()
{
crossHairImage = GameObject.Find("crossHairImage").GetComponent<Image>();
SetRespawnButton();
}
第六,在预制件Player中,关掉Player_SyncPosition脚本,添加Network Transform,将其SendRate改为11,SyncMode改为Sync Character Controller,Rotation Axis改为None,新建一个Player_Latency脚本,将Player_SyncPosition脚本中关于显示延迟的代码复制到其中(PS;理由是Network Transform的Sync Character Controller模式已经能够十分平滑的移动物体了= =之前的Player_SyncPosition就当是了解其中的机制吧。。。)
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine.UI;
public class Player_Latency : NetworkBehaviour {
private NetworkClient nClient;
private int latency;
private Text latencyText;
public override void OnStartLocalPlayer()
{
nClient = GameObject.Find("NetworkManager").GetComponent<NetworkManager>().client;
latencyText = GameObject.Find("Latency Text").GetComponent<Text>();
}
void Update ()
{
ShowLatency();
}
void ShowLatency()
{
if (isLocalPlayer)
{
latency = nClient.GetRTT();
latencyText.text = latency.ToString();
}
}
}