2016-12-01 4 views
0

У меня есть несколько видео в Unity Pro, которые я могу воспроизвести через объект и MovieTexture. Через инспектора я вручную установил MovieTexture в качестве одного из видео .ogg, которое у меня есть, и оно успешно воспроизводится.Как изменить текстуры фильмов во время выполнения в Unity Pro?

Что я хочу сделать, это изменить Текстуру фильма во время выполнения, через код, когда выполняются определенные условия (для простоты, что-то вроде, когда вы нажимаете пробел, воспроизводимое в данный момент видео изменяется на другое видео) ,

Что в настоящее время работает для меня, но с помощью инспектора это:

MovieTexture movTex; 
AudioSource movAudio; 

void Start() 
{ 
    // I have set the movie manually through the inspector by drag and drop 
    // onto the texture component 
    movTex = (MovieTexture)GetComponent<Renderer>().material.mainTexture; 
    movAudio = GetComponent<AudioSource>(); 
    movAudio.clip = movTex.audioClip; 
    movTex.Play(); // Autoplay on start 
    movAudio.Play(); 
    movTex.loop = true; // Loop forever 
    ... 
} 

И я уже попробовал код, который я нашел на this post, положив конечно мое желаемое видео в папке ресурсов, но не работает. Я получаю обычную белую текстуру без звука.

Это код я пытаюсь сделать, чтобы работать, но я не могу:

MovieTexture movTex; 
AudioSource movAudio; 

void Start() 
{ 
    movTex = (MovieTexture) Resources.Load("V00001" , typeof(MovieTexture)); 
    transform.renderer.material.mainTexture = movie; 
    transform.audio.clip = movie.audioClip; 
    movAudio = GetComponent<AudioSource>(); 
    movAudio.clip = movTex.audioClip; 
    movTex.Play(); // Autoplay on start 
    movAudio.Play(); 
    movTex.loop = true; // Loop forever 
    ... 
} 

void Update() 
{ 
    if("Spacebar is pressed"){ 
     movTex = (MovieTexture) Resources.Load("V00001" , typeof(MovieTexture)); 
     movAudio = GetComponent<AudioSource>(); 
     movAudio.clip = movTex.audioClip; 
     movTex.Play(); // Autoplay on start 
     movAudio.Play(); 
     movTex.loop = true; // Loop forever 
    } 
    ... 
} 

Что я делаю неправильно?

+0

Итак, в чем проблема? В вашем вопросе не упоминается никаких проблем. Во-первых, вы сказали, что это работает, тогда это не так. – Programmer

ответ

1

movieTexture - это, по существу, текстура, как и другие, и они могут применяться как любая другая текстура. Тем не менее, вам нужно иметь в виду, что для загрузки чего-то, что не находится в вашей сцене, обычно вам нужно взять его из папки «Ресурсы».

Давайте предположим, что у вас есть видео файл в папке ресурсов, где-то в вашей папке активов, вы должны загрузить только идентификатор, написав

MovieTexture movie = (MovieTexture) Resources.Load("fileName" , typeof(MovieTexture)); 

После этого, вы можете применить его на материал вашего объекта текстуры, написав

if(yourConditions){ 
    myGameObject.GetComponent<MeshRenderer>().material.mainTexture = movie; 
}  

}

полная функция может выглядеть следующим образом:

void Start() 
{ 
    MovieTexture movie = (MovieTexture) Resources.Load("fileName" , typeof(MovieTexture)); 
    if(movie != null){ 
     this.GetComponent<MeshRenderer>().material.mainTexture = movie; 
     // making sure there is an audio source attached 
     if(this.GetComponent<AudioSource>() == null){ 
      this.AddComponent<AudioSource>(); 
     } 
     AudioSource aud = GetComponent<AudioSource>(); 
     aud.clip = movie.audioClip; 
     movie.Play(); // Autoplay on start 
     aud.Play();  
    } 

} 
+0

Единственное различие между тем, что я пытаюсь и ваш код, является ссылкой 'this' в' this.GetComponent RabidOrange

+0

Исправлено. Я не уверен, что это был элемент 'this' или папка« Ресурсы », потому что я изменил свое место внутри проекта, и теперь он работает. Однако мне пришлось удалить 'if (this.GetComponent () == null) {this.AddComponent ();}' потому что MonoDevelop поднял ошибку в 'AddComponent ()' часть, я не знаю, почему , До тех пор, пока этот элемент имеет источник звука, это решение работает. Кстати, моя версия Unity - 5.3.5. – RabidOrange

+0

Вчера у меня не было единства со мной, и я не мог попробовать. Возможно, это связано с тем, что это в контексте Компонента относится к самому компоненту, а не к самому GameObject. Попробуйте использовать «this.gameObject» вместо «this», он должен работать. В противном случае, если это не проблема для вашего скрипта (это может быть связано с большим количеством обстоятельств), вы можете добавить атрибут [RequireComponent] (https://docs.unity3d.com/ScriptReference/RequireComponent.html) на в верхней части вашего класса, чтобы ваш игровой объект всегда имел AudioSource. PS: пожалуйста, в следующий раз приложите единицу ошибки, которая дает вам – FreeFly