Полагаю, проблема в том, что Camera.main
может не возвращать фактическое MainCamera
, которое вы хотите получить, но вместо этого может вернуть камеру вашего игрока
Это свойство использует FindGameObjectsWithTag
внутренне
, поэтому, если вы пометили Камеру на объекте Player (prefab) также как 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);
}
}