【UNET自学日志】Part18 修复一些错误

时间:2022-01-14 03:53:52

首先,我们需要的是新建一个空物体“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;
}

}



第三,打开脚本Player_Death,修改其代码(去掉原来的Start函数,将Start函数中的内容复制到OnStartLocalPlayer和PreStartClient中),将OnDisable函数重新更名为public override void OnNetworkDestroy()
 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();
}
}

}