FlatterZange Geschrieben 15. August 2013 Melden Share Geschrieben 15. August 2013 (bearbeitet) Falls wer einen weg sucht in der Unity Free (Basic) Version Filme über eine GUI darzustellen hab ich ne kleine lösung gebaut. Es ist ein kleines Script was der Camera als Komponente angehängt werden kann und minimale konfiguration benötigt. Das Tool benötigt eine Image Sequence (EinzelBilder) und eine Wav/Mp3 als Ton Spur. Die Bilder müssen im "Resources" ordner "Resources/DeinMovieOrdner..." abgelegt sein um sie @Runtime laden zu können. Der Beispiel Webplayer Unten nuzt einen Kino Trailer mit 3033 Bildern bei 25 Bildern pro Sekunde. Die Einzelbilder der Sequence müssen mit 4 Digits angeben sein. Beispielsweise Frame0000 - Frame3033 damit sie koreckt geladen werden können. Ein Beispiel pfad wäre "DeinMovieOrdner/Frame". Im Pfad selber dürfen die NumDigits nicht mit angegeben sein da diese @Runtime automatisch angehängt werden. Die Maximale PlayTime ist derzeit 5.55 minuten das entspricht 9999 einzelbildern. Optionen im Player sind derzeit, Play, Pause, Stop und ein TimeSlider. Beispiel Webplayer Link: http://www.flatter.s...Version1_0.html Hir ein Bild wie die konfiguration des beispiel videos ausieht: Und hir das Script: // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the TMG To Public License, // Version 1, as published by Team Mongo Games. // See http://www.teammongogames.kilu.de/License for more details. using UnityEngine; using System.Collections; public class TMGMovieGUITexture : MonoBehaviour { public string FramePath; public int numframes; public float FPS; public AudioClip audioClip; private AudioSource audioSource; private float nextFrameTime; private int aktiveFrame; private Texture2D[] AllFrames; private bool FramesLoaded; private bool Play; private GUITexture AktiveFrameGUITexture; private bool IsPlaying; private float PlayLength; private float playTime; private float nextPlayTime; void Awake() { AllFrames = new Texture2D[numframes]; InitializeFrames(); audioSource = gameObject.AddComponent<AudioSource>(); audioSource.clip = audioClip; } private void InitializeFrames(){ int Counter = 0; string framename = ""; for(int i=0;i<numframes;i++) { framename = FramePath + Counter.ToString("0000"); AllFrames[Counter] = (Texture2D)Resources.Load(framename); Counter++; } AktiveFrameGUITexture = new GUITexture(); gameObject.AddComponent(AktiveFrameGUITexture.GetType()); FramesLoaded = true; PlayLength = (1.0f / FPS) * numframes; } void Start () { gameObject.guiTexture.transform.position = new Vector3(0.5f, 0.5f, 0.0f); IsPlaying = false; } void OnGUI () { if(FramesLoaded) { if(GUI.Button(new Rect(10,10,100,30), "Play")) { StartPlayMovie(); } if(GUI.Button(new Rect(10,50,100,30), "Pause")) { PauseMovie(); } if(GUI.Button(new Rect(10,90,100,30), "Stop")) { StopMovie(); } nextPlayTime = GUI.HorizontalSlider(new Rect(Screen.width/2-300, Screen.height - 50, 600, 30), playTime, 0.0F, PlayLength); } } void StartPlayMovie() { if(!Play) { Play = true; if(!IsPlaying) { nextFrameTime = (PlayLength/numframes); IsPlaying = true; } } } void PauseMovie() { if(Play) { Play = false; audioSource.Pause(); } } void StopMovie() { Play = false; audioSource.Stop(); aktiveFrame = 0; gameObject.guiTexture.texture = AllFrames[aktiveFrame]; nextFrameTime = 0.0f; IsPlaying = false; playTime = 0.0f; } void Update () { if(Play) { if(!audioSource.isPlaying) { audioSource.Play(); } PlayMovie(); } } void PlayMovie () { if(playTime != nextPlayTime) { aktiveFrame = (numframes - Mathf.RoundToInt((PlayLength-nextPlayTime) / (1.0f / FPS))); aktiveFrame = Mathf.Clamp(aktiveFrame, 0 , numframes - 1); playTime = nextPlayTime; nextFrameTime = (PlayLength/numframes) * (aktiveFrame + 1); } if(playTime >= nextFrameTime) { gameObject.guiTexture.texture = AllFrames[aktiveFrame]; nextFrameTime = (PlayLength/numframes) * (aktiveFrame + 1); if(aktiveFrame < numframes-1) { aktiveFrame++; } else { StopMovie(); } } playTime += Time.deltaTime; SyncSound(); } void SyncSound() { if(playTime - audioSource.time > 0.02f || playTime - audioSource.time < -0.02f) { audioSource.time = playTime; } } } Die dauer des Compilierens steigt mit der anzahl der Frames allso sollte man bei langen videos gedult haben^^ Vieleicht baue ich später eine Version die Bilder aus einer Zip datei oder direckt aus einem Video Contäner liest, was die Compilier zeit stark reduzieren würde. Grüsse. bearbeitet 15. August 2013 von FlatterZange Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
overdev Geschrieben 15. August 2013 Melden Share Geschrieben 15. August 2013 Nett, aber mich nervt es schon ewig das Intros per videos gemacht werden und nicht per Zwischensequenz in der Engine selbst. Die haben jetzt schon schlechte Qualität und nur eine Auflösung von 1280x720. Zurück in die Zukunft von Telltale haben ALLES per Zwischensequenzen gemacht. Auch die Vorschau auf die nächste Episode. Bzw auch bei Tales of Monkey Island und The Walking Dead afaik. Wird kein OGG oder FLAC unterstützt? Gerade das sind doch die besten Formate Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
FlatterZange Geschrieben 15. August 2013 Autor Melden Share Geschrieben 15. August 2013 Jap früher waren Image Sequencen wohl mehr gang und gebe. Die Qualität und grösse ist bei der Image Sequence ja wählbar, je nachdem wie der user die bilder speichert (Format/Komprimierung usw). Was mir nicht ganz gefällt ist bei längeren Videos das Compilieren und ebend das Laden der einzelbilder @Runtime. Aber 3033 bilder sind net wenig^^ aleine das importieren in Unity hatte ewig gedauert. Später erweiter ich das Script vieleicht auf eine Zip file die gelesen wird was alles massig beschleunigen würde. Mal sehn was mir noch so einfallt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
overdev Geschrieben 15. August 2013 Melden Share Geschrieben 15. August 2013 Das hört sich gut an Vorallem das mit der ZIP. Doofe Frage: Für was außer für Videos bzw vielleicht animierte Texturen, brauche ich das? >.< Früher in den 90er war auch bitratenbasierendes Video-Encoding gang und gebe, aber heute machens wirklich noch um die 90 %, obwohl es sau ineffektiv ist und unnötig Speicherplatz und meist auch Encodierzeit frisst >.> Aber die Underground-Filmszene hats zumindest kappiert ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
FlatterZange Geschrieben 15. August 2013 Autor Melden Share Geschrieben 15. August 2013 Hauptsächlich ist für kurze Intro sequencen in film vorm, die kann man schnell in einem 3d prg rendern und ne soundspur dazu basteln. Ein wenig umgebaut könnte man es als animierte texture nehmen jap wie son fernsehr in der scene ihrwo der ne kurze anim loopt. Gebaut habe ich es auf anfrage im Chat aber selber auch nutzen drin gesehn ^^ Derzeit gammelt das nur in meinem lager aber vieleicht gibt es hir ihrwen der es gebrauchen kann deswegen dieser Thread. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.