进行某些更改之前无法移动我的衍生播放器预制件

时间:2019-04-14 11:00:41

标签: c# unity3d

网络出现此问题。

在出现此问题之前,我使用了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);
    }
}

1 个答案:

答案 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);
    }
}