Не могу переместить префаб моего порожденного игрока до некоторых изменений - PullRequest
0 голосов
/ 14 апреля 2019

Эта проблема возникает при работе в сети.

До этой проблемы я использовал 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 голосов
/ 15 апреля 2019

Полагаю, проблема в том, что 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...