网络出现此问题。
在出现此问题之前,我使用了Auto Create
Player
。
MainCamera
显示了所有地图,当玩家连接时-脚本关闭了MainCamera
,并且打开了PlayerCamera
。而且我也可以控制我的播放器。
现在,我想按按钮生成播放器。我禁用了自动创建播放器。然后使用此脚本生成我的播放器:
using UnityEngine;
using UnityEngine.Networking;
public class MenuChoose : NetworkBehaviour
{
public Transform spawn1;
public GameObject tank3;
public bool tank3spawned = false;
public bool color3;
void FixedUpdate()
{
if (!tank3spawned)
{
if ((Input.GetKey(KeyCode.Alpha3)) || color3)
{
var tank3go = Instantiate(tank3, spawn1.position, spawn1.rotation);
NetworkServer.Spawn(tank3go);
tank3spawned = true;
}
}
}
}
但是我的MainCamera
没有关闭。而且,我不能移动我的坦克。顺便说一句,这是我的脚本,在更改前已禁用MainCamera
:
using UnityEngine;
using UnityEngine.Networking;
public class PlayerSetup : NetworkBehaviour
{
private Camera sceneCamera;
[SerializeField]
Behaviour[] componentsToDisable; // disable some scripts for multiplayer
void Start()
{
if (!isLocalPlayer)
for (int i = 0; i < componentsToDisable.Length; i++)
componentsToDisable[i].enabled = false;
else
{
sceneCamera = Camera.main;
if (sceneCamera != null)
sceneCamera.gameObject.SetActive(false);
}
}
private void OnDisable()
{
if (sceneCamera != null)
sceneCamera.gameObject.SetActive(true);
}
}
答案 0 :(得分:0)
我想问题是Camera.main
可能不会返回您想要到达的实际MainCamera
,而是可能会返回您的Player相机
此属性在内部使用
FindGameObjectsWithTag
因此,如果您也将Player对象(预制)上的Camera标记为MainCamera
,则可能只是找到了错误的对象。
您可以尝试使用一个全局MainCameraProvider
来从一开始就使用Singleton-Pattern存储参考权限
[RequireComponent(typeof(Camera))]
public class MainCameraProvider : MonoBehaviour
{
public static Camera MainCamera;
private void Awake()
{
// check if already set by another instance
if(MainCamera)
{
Debug.LogWarning("MainCamera is already set!");
Destroy(gameObject);
}
MainCamera = GetComponent<Camera>();
}
}
将此组件附加到MainCamera
对象上,您可以可靠地在连接到tank3
预制的播放器脚本中禁用它:
public class PlayerSetup : NetworkBehaviour
{
[SerializeField]
Behaviour[] componentsToDisable; // disable some scripts for multiplayer
void Start()
{
if (!isLocalPlayer)
{
foreach(var component in componentsToDisable)
{
component.enabled = false;
}
}
else
{
MainCameraProvider.MainCamera.gameObject.SetActive(false);
}
}
private void OnDisable()
{
MainCameraProvider.MainCamera.gameObject.SetActive(true);
}
}