Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011
Sign in to follow this  
motionact

Mit der Tastatur Video und Soundfile starten

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();

}

}

}

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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é

Share this post


Link to post
Share on other sites
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.

 

Share this post


Link to post
Share on other sites

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();
        }
     }
}

 

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
vor 2 Minuten schrieb Zer0Cool:

Ja, das ist korrekt. Welche Unityversion verwendest du? Der Videoplayer hängt schon am Objekt oder?

Richtig am Objekt, ich benutze Unity2017.3.0f3 Personal.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Achso, das wird hier jetzt nicht auf einer Plane abgespielt, sondern auf der Skybox. Meine Assets sind also das Videofile, Render Texture und Skybox Material. Es handelt sich hier um ein 360° Video was auf die Skybox projiziert wird. 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 ...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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();
            }
        }
    }
}

 

Share this post


Link to post
Share on other sites

Nach dem zweiten Tastendruck friert das Bild nur ein, lässt sich das auch sofort zurücksetzen? Aber das Neustarten des Videos funktioniert so wie es soll.

Share this post


Link to post
Share on other sites

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();
            }
        }
    }
}

 

Share this post


Link to post
Share on other sites

Da scheint irgendwo ein Fehler zu sein. Sobald ich das Game starten will, wird es automatisch wieder gestoppt. Ich komme quasi gar nicht rein in das Game.

Share this post


Link to post
Share on other sites

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!!

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×