Unity3d ошибка с переключением камер?

340
13 августа 2017, 04:27
public Camera camera1;
public Camera camera2;
// Use this for initialization
void Start () {
    camera1 = (Camera)(object)GameObject.FindGameObjectWithTag("MainCamera");
    camera2 = GetComponent<Camera>();
    camera1.enabled = true;
    camera2.enabled = false;
void Update () {
    if (Input.GetKey(KeyCode.W))
    {
       camera2.enabled = !camera2.enabled;
        camera1.enabled = !camera1.enabled;
        transform.Translate(Vector3.forward * Time.deltaTime * speed);
    };

При запуске unity выдает такую ошибку -

InvalidCastException: Cannot cast from source type to destination type. CubeScript.Start () (at Assets/scripts/CubeScript.cs:12) -Т.е оно ругается на строку

camera1 = (Camera)(object)GameObject.FindGameObjectWithTag("MainCamera");

- из - за привидения типов, но по-другому преобразовать из GameObject в Camera у меня не выходит - т.к мне из двух камер на сцене в это поле нужно присвоить одну конкртную, а это же как я понимаю единственный способ получит ссылку на внешний объект?

И далее при нажатии соответствующей клавиши W возникает ошибка:

nassignedReferenceException: The variable camera2 of CubeScript has not been assigned. You probably need to assign the camera2 variable of the CubeScript script in the inspector. CubeScript.Update () (at Assets/scripts/CubeScript.cs:23) -почему unity говорит что значение для переменной camera2 не назначено? Ведь вот здесь -

camera2 = GetComponent<Camera>();

я присваивая ей значение - объект получает камеру которую я "повесил" на объект, а

camera1 = (Camera)(object)GameObject.FindGameObjectWithTag("MainCamera");

студия получает "главную камеру" - т.е у меня в сцене - две камеры

Answer 1

Вся ваша проблема заключается в строке, где вы ищете объект MainCamera:

camera1 = (Camera)(object)GameObject.FindGameObjectWithTag("MainCamera");

Во-первых, GameObject.FindGameObjectWithTag возвращает тип GameObject[], то есть массив, который у вас никогда не получится преобразовать к Camera, об этом можно почитать в документации. Вы можете исправить это если полученный результат (массив) проверите на количество элементов, то есть в вашем случае там должен быть 1 элемент и обратитесь именно к нему, то есть примерно так:

var goArray = GameObject.FindGameObjectWithTag("MainCamera");
var cameraGO = goArray[0];

и потом получите саму камеру на этом объекте, не по средствам приведения типов, а через GetComponent<Camera>()

Во-вторых, можете использовать метод GameObject.FindWithTag, что будет намного проще в вашем случае, так как он вернет 1 активный GameObject с указанным тэгом. Но у него все-равно надо будет вызывать GetComponent<Camera>(). Никакого преобразования типов не нужно.

Также если

camera2 = GetComponent<Camera>();

выдает ошибку, то это может быть только в случае, если на GameObject, к которому прикреплен ваш скрипт, нет компонента Camera.

READ ALSO
Получить иерархичный объект из SQL

Получить иерархичный объект из SQL

Как получить объект из SQL вида:

238
Изменение стилей в Xamarin

Изменение стилей в Xamarin

Здравствуйте, хотелось бы узнать, как можно в Camarin, не Shared проекте изменить xaml стиль отдельно для Android, чтобы эти изменения не отображались...

210
Ежедневный запуск программы

Ежедневный запуск программы

Есть приложение написанное на c# в visual studioКаждый день я его запускаю в ручную в определенное время

232
Библиотека для работы с shockwave flash (.swf) файлами - C#, WPF

Библиотека для работы с shockwave flash (.swf) файлами - C#, WPF

Добрый день! Пришлось работать сswf файлами

243