Jump to content
Unity Insider Forum

Mit der Tastatur Video und Soundfile starten


motionact

Recommended Posts

Hallo zusammen,

ich möchte mit einer Taste (Bsp.: Leertaste) gleichzeitig eine Video- und eine Tonspur starten.

Mit Hilfe dieses Tutorials konnte ich schon mal die Tonspur starten. Leider lässt sich das nicht auf Videofiles übertragen. Hat jemand eine Idee, was ich machen muss?

Habe leider keine Scripting Kenntnisse. Das Script aus dem Video habe ich direkt unter diesem Videolink aufgeführt. Freue mich über hilfreiche Antworten. Danke!

 

Das ist das Script zum Auslösen der Tonspur:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class PlayTheShow : MonoBehaviour {

public AudioSource someSound;

// Use this for initialization

void Start () {

 

}

 

// Update is called once per frame

void Update () {

if (Input.GetKeyDown(KeyCode.Space)){

someSound.Play();

}

}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja geh es doch so an, das du dabei auch etwas lernst. 

Das heißt:
1. www.google.de > "unity video abspielen" eingeben

2. Ergebnis suchen......

 

siehe da: https://docs.unity3d.com/ScriptReference/Video.VideoPlayer.html

Dort wird erklärt wie du generell mal ein Video zum abspielen bewegst.

Danach packst du das ganze in eine Funktion und rufst diese in deinem Update() auf.
Ob das am Ende zielführend und so ist, wie du das willst wirst du dann sehen.

 

lg

 

Michael

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das weiß ich doch schon. Leider habe ich dort nur die Möglichkeit festzulegen, ob nach dem Spielstart das Video sofort gestartet werden soll oder nicht.

Ich möchte aber das Spiel starten und erst bei Betätigung der entsprechenden Taste das Video und Audiofile abspielen lassen. Mit dem Ton hat es ja schon funktioniert, siehe erster Eintrag. Das selbe will ich nun auch mit dem Video machen, leider komme ich da nicht weiter.

 

lg André

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb motionact:

Leider habe ich dort nur die Möglichkeit festzulegen, ob nach dem Spielstart das Video sofort gestartet werden soll oder nicht.

Wie kommst du darauf?

@Elharter hat's dir doch schon gesagt:

vor 46 Minuten schrieb Elharter:

Danach packst du das ganze in eine Funktion und rufst diese in deinem Update() auf.
Ob das am Ende zielführend und so ist, wie du das willst wirst du dann sehen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier mal schnell zusammengestrickt:
 

// Examples of VideoPlayer function

using UnityEngine;

public class Example : MonoBehaviour
{
    
    private UnityEngine.Video.VideoPlayer videoPlayer;

    void Start()
    {
        // Will attach a VideoPlayer to the main camera.
        GameObject camera = Camera.main.gameObject;

        // VideoPlayer automatically targets the camera backplane when it is added
        // to a camera object, no need to change videoPlayer.targetCamera.
        videoPlayer = camera.AddComponent<UnityEngine.Video.VideoPlayer>();

        // Play on awake defaults to true. Set it to false to avoid the url set
        // below to auto-start playback since we're in Start().
        videoPlayer.playOnAwake = false;

        // By default, VideoPlayers added to a camera will use the far plane.
        // Let's target the near plane instead.
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.CameraNearPlane;

        // This will cause our scene to be visible through the video being played.
        // videoPlayer.targetCameraAlpha = 0.5F;

        // Set the video to play. URL supports local absolute or relative paths.
        // Here, using absolute.
        videoPlayer.url = "/Users/graham/movie.mov";
    }

     // Update is called once per frame
     void Update () {
        if (Input.GetKeyDown(KeyCode.Space))
        {
          videoPlayer.Play();
        }
     }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, leider bekomme ich Errors angezeigt. Anbei habe ich mal ein Screenshot vom Inspector mitgeliefert, damit ihr sehen könnt wie es bei mir ausschaut. Wenn ich also eine "Funktion" erstellen möchte, ist damit gemeint, dass ich ein C# Script erstelle und dieses am Ende dem Objekt hinzufüge, wo sich auch der  VideoPlayer und Audio Source Component befindet, richtig?

Ich benutze kein Url als Video, sondern ein Videofile direkt von der Festplatte. Wie binde ich das in das Script mit ein?

 

Nochmal zur Info: Ich habe keine Scripting Erfahrung und arbeite auch erst seit kurzem mit Unity.

inspector.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Habe es gerade mal getestet, ist leider nicht so einfach wie gedacht.
Wenn man den Videoplayer auf die "NearPlane" einstellt wird überhaupt nichts angezeigt, daher habe ich nun das Skript auf UI umgestellt.

Ich habe nun ein Skript erstellt, welches funktioniert. Das Video wird in eine Rendertextur gelegt und diese wird über die UI angezeigt.
Die UI habe ich so eingestellt, daß das Video mittig zentriert in der Größe der Rendertextur angezeigt wird.

Du musst allerdings folgende Sachen zusätzlich anlegen:

  • eine Rendertextur anlegen:
    im Projektfolder rechte Maustaste -> Create -> Rendertexture
    Größe der Rendertexture einstellen, möglichst auf die Größe des Videos anpassen, z.b. 1024x1024
  • ein UI-Element anlegen:
    GameObject ->  UI -> RawImage

Das Skript auf deinen VideoPlayer ziehen und folgendes zuweisen

- beim VideoPlayer "PlayOnAwake" ausstellen
- die Rendertexture
- die UI-RawImage


using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayTheShow : MonoBehaviour
{
    public RawImage uiRawImage;
    public RenderTexture image;
    public AudioSource someSound;
    private UnityEngine.Video.VideoPlayer videoPlayer;


    void Awake()
    {
        // Player zuweisen
        videoPlayer = GetComponent<UnityEngine.Video.VideoPlayer>();

        // Play on awake defaults to true. Set it to false to avoid the url set
        // below to auto-start playback since we're in Start().
        videoPlayer.playOnAwake = false;

        // UI ausblenden
        uiRawImage.gameObject.SetActive(false);
    }

    void Start()
    {
        // Rendertexture zuweisen
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.RenderTexture;
        videoPlayer.targetTexture = image;

        // Kamera zuweisen
        videoPlayer.targetCamera = Camera.main;

        // UI Einstellen
        uiRawImage.rectTransform.anchoredPosition = new Vector2(0, 0);        
        uiRawImage.rectTransform.sizeDelta = new Vector2(image.width, image.height);
        uiRawImage.texture = image;

        // This will cause our scene to be visible through the video being played.
        // videoPlayer.targetCameraAlpha = 0.5F;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //someSound.Play();
            uiRawImage.gameObject.SetActive(true);
            videoPlayer.Play();
        }
    }
}

2bkCWi1.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wäre mal eine wichtige Info am Anfang gewesen :blink:

Das ist mit "Boardmitteln" von Unity auch eher komplex. Hier ein Projekt wo so etwas gemacht wird:
https://blogs.unity3d.com/2017/07/27/how-to-integrate-360-video-with-unity/

Hier wird auch mit einer Rendertextur gearbeitet und diese Textur wird dann einer Skybox mit ensprechendem Shader zugewiesen. Aber wie gesagt, das sprengt hier den Umfang. Lad dir am besten das Projekt aus dem Link herunter und wenn das läuft tausch halt dein Videofile aus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber im Endeffekt sollte es so gehen:
Du musst ein Skyboxmaterial erstellen und dem Skript zuweisen. Das Skyboxmaterial muss auf den Shader "Skybox/Panoramic" eingestellt sein.
Das Material musst du dann noch als Skybox der Szene setzen:
Window->Lightning -> Szene -> Skyboxmaterial


using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayTheShow : MonoBehaviour
{
    //public RawImage uiRawImage;
    public Material skyBoxMaterial;
    public RenderTexture image;
    public AudioSource someSound;
    private UnityEngine.Video.VideoPlayer videoPlayer;


    void Awake()
    {
        // Player zuweisen
        videoPlayer = GetComponent<UnityEngine.Video.VideoPlayer>();

        // Play on awake defaults to true. Set it to false to avoid the url set
        // below to auto-start playback since we're in Start().
        videoPlayer.playOnAwake = false;

        // UI ausblenden
        //uiRawImage.gameObject.SetActive(false);
    }

    void Start()
    {
        // Rendertexture zuweisen
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.RenderTexture;
        videoPlayer.targetTexture = image;

        // Kamera zuweisen
        videoPlayer.targetCamera = Camera.main;

        // Skybox einstellen
        skyBoxMaterial.SetTexture("_MainTex", image);

        // UI Einstellen
        //uiRawImage.rectTransform.anchoredPosition = new Vector2(0, 0);        
        //uiRawImage.rectTransform.sizeDelta = new Vector2(image.width, image.height);
        //uiRawImage.texture = image;

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //someSound.Play();
            //uiRawImage.gameObject.SetActive(true);
            videoPlayer.Play();
        }
    }
}

Ob dein Video aber den Erwartungen des Skyboxshaders entspricht bleibt fraglich ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man kann doch sicher auch das Video wieder zurücksetzen auf Anfang ohne dass es erneut startet?

Also gemeint ist:

1. Leertaste drücken > Video startet

2. erneut Leertaste drücken > Video stoppt und wird auf Null gesetzt

3. erneut Leertaste drücken > Video startet wieder

 und so weiter ...

 

Hatte mich mal selber daran versucht und das bisherige Script ergänzt mit Hilfe von Google und Youtube(siehe Bild im Anhang). Leider reagiert Unity auf die neuen Eingaben nicht. 

Hat jemand eine Idee was ich ins Script schreiben muss?

script_videoplayer.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

War nur eine Zeile ... Ich hab mal die Awake-Methode entfernt, hatte sie verwendet, da "Play on Awake" nicht reagiert (also wenn man es im Inspektor setzt und im Skript deaktiviert wird es ignoriert), aber hat auch in der Awake-Methode nicht geklappt, daher entfernt.

 

using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayTheShow : MonoBehaviour
{
    //public RawImage uiRawImage;
    public Material skyBoxMaterial;
    public RenderTexture image;
    public AudioSource someSound;
    private UnityEngine.Video.VideoPlayer videoPlayer;

    void Start()
    {
        // Player zuweisen
        videoPlayer = GetComponent<UnityEngine.Video.VideoPlayer>();

        // Play on awake defaults to true. Set it to false to avoid the url set
        // below to auto-start playback since we're in Start().
        videoPlayer.playOnAwake = false;

        // UI ausblenden
        //uiRawImage.gameObject.SetActive(false);

        // Rendertexture zuweisen
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.RenderTexture;
        videoPlayer.targetTexture = image;

        // Kamera zuweisen
        videoPlayer.targetCamera = Camera.main;

        // Skybox einstellen
        skyBoxMaterial.SetTexture("_MainTex", image);

        // UI Einstellen
        //uiRawImage.rectTransform.anchoredPosition = new Vector2(0, 0);        
        //uiRawImage.rectTransform.sizeDelta = new Vector2(image.width, image.height);
        //uiRawImage.texture = image;

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (videoPlayer.isPlaying)
            {
                videoPlayer.Stop();
            } else
            {
                //someSound.Play();
                //uiRawImage.gameObject.SetActive(true);
                videoPlayer.Play();
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

War etwas tricky, aber so sollte es gehen:
 


using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayTheShow : MonoBehaviour
{
    //public RawImage uiRawImage;
    public Material skyBoxMaterial;
    public RenderTexture image;
    public AudioSource someSound;
    private UnityEngine.Video.VideoPlayer videoPlayer;
    private bool stopNextCycle = false;

    void Start()
    {
        // Player zuweisen
        videoPlayer = GetComponent<UnityEngine.Video.VideoPlayer>();

        // Play on awake defaults to true. Set it to false to avoid the url set
        // below to auto-start playback since we're in Start().
        videoPlayer.playOnAwake = false;

        // UI ausblenden
        //uiRawImage.gameObject.SetActive(false);

        // Rendertexture zuweisen
        videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.RenderTexture;
        videoPlayer.targetTexture = image;

        // Kamera zuweisen
        videoPlayer.targetCamera = Camera.main;

        // Skybox einstellen
        skyBoxMaterial.SetTexture("_MainTex", image);

        // UI Einstellen
        //uiRawImage.rectTransform.anchoredPosition = new Vector2(0, 0);        
        //uiRawImage.rectTransform.sizeDelta = new Vector2(image.width, image.height);
        //uiRawImage.texture = image;

    }

    // Update is called once per frame
    void Update()
    {
        if (stopNextCycle && videoPlayer.frame == 1)
        {
            videoPlayer.Stop();
            stopNextCycle = false;
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (videoPlayer.isPlaying)
            {
                videoPlayer.frame = 0;
                stopNextCycle = true;
            }
            else
            {
                //someSound.Play();
                //uiRawImage.gameObject.SetActive(true);
                videoPlayer.Play();
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Jetzt möchte ich eine in Unity animierte Lichtquelle und eine importierte FBX Animation mit der Leertaste auslösen. Zwei Scripte habe ich erstellt, die auch soweit funktionieren bis ich am Ende der Animation nochmal auf die Leertaste drücke, machen beide Animationen verschiedenes. Hier komme ich gerade nicht weiter.

 

Das Script zu der in Unity animierten Lichtquelle.

Was passiert: Nach Drücken der Leertaste startet die Animation und läuft im Loop Modus. Nach erneutem Drücken der Taste gibt es keine Reaktion.

Was soll passieren: Nach Drücken der Leertaste startet die Animation und soll bis zum Ende durchlaufen. Nach erneutem Drücken der Taste soll die Animation wieder gestartet werden. Wenn ich während der laufenden Animation auf die Leertaste drücke, soll die Animation gestoppt und bei einem weiteren Drücken erneut ausgelöst werden.  

__________________________________

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class animController : MonoBehaviour {

public Animator anim;

// Use this for initialization

void Start () {

anim = GetComponent<Animator>();

 

}

 

// Update is called once per frame

void Update () {

if (Input.GetKeyDown (KeyCode.Space))

{

anim.Play("Light");

}

 

}

}

________________________________________________________

 

Das Script zu der importierten FBX Animation.

Was passiert: Nach Drücken der Leertaste startet die Animation und läuft bis zum Ende durch. Nach erneutem Drücken der Taste gibt es keine Reaktion.

Was soll passieren: Nach Drücken der Leertaste startet die Animation und soll bis zum Ende durchlaufen. Nach erneutem Drücken der Taste soll die Animation wieder gestartet werden. Wenn ich während der laufenden Animation auf die Leertaste drücke, soll die Animation gestoppt und bei einem weiteren Drücken erneut ausgelöst werden.  

_______________________________________________________________

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Man_AnimController : MonoBehaviour {

public Animator manAnim;

// Use this for initialization

void Start () {

manAnim = GetComponent<Animator>();

 

}

 

// Update is called once per frame

void Update () {

if (Input.GetKeyDown("space"))

{

manAnim.Play("Mann Bewegung");

}

 

}

}

________________________________________________________

Ich hoffe ihr könnt mir da nochmal helfen. Vielen Dank!!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...