質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.60%

  • Unity

    3814questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

VideoPlayer切り替え

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 175

OKOMEDJ

score 1

Unityで、下のようなスクリプトを書きました。
内容は左右の矢印キーを押すと、対応した動画が流れるといったものです(一応他の処理もあり)。ネプリーグのトロッコアドベンチャーのようなものなのですが、ここに付け足して、右の矢印キーを押したら正解の道で、2問目、3問目とまた同じように以降別の動画で、この処理を繰り返すようにしたいです。説明不十分ですが、ご不明な点がありましたら自分もできる限り細かく説明するので、どのようにすれば良いかを教えていただきたいです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class VideoChangeScript : MonoBehaviour
{
    // インスペクター上でVideoPlayerを指定
    public VideoPlayer VideoPlayer1;
    public VideoPlayer VideoPlayer2;
    public VideoPlayer VideoPlayer3;

    Renderer videoPlayer1Renderer;
    Renderer videoPlayer2Renderer;
    Renderer videoPlayer3Renderer;

    void Start()
    {
        videoPlayer1Renderer = VideoPlayer1.GetComponent<Renderer>();
        videoPlayer2Renderer = VideoPlayer2.GetComponent<Renderer>();
        videoPlayer3Renderer = VideoPlayer3.GetComponent<Renderer>();

        videoPlayer1Renderer.enabled = true;
        videoPlayer2Renderer.enabled = false;
        videoPlayer3Renderer.enabled = false;

        VideoPlayer1.Play();
        VideoPlayer2.Stop();
        VideoPlayer3.Stop();
    }

    void Update()
    {
        if (Input.GetKeyDown (KeyCode.RightArrow)) {
            StartCoroutine (changeCoroutine ());
        } else if (Input.GetKeyDown (KeyCode.LeftArrow)) {
            StartCoroutine (changeCoroutine1 ());
        }
    }

    IEnumerator changeCoroutine()
    {
        // ロード開始
        VideoPlayer2.Prepare();

        // ロード完了まで待機
        while (!VideoPlayer2.isPrepared)
        {
            yield return null;
        }

        VideoPlayer2.Play();

        // 再生するまで待機
        while (!VideoPlayer2.isPlaying)
        {
            yield return null;
        }
        yield return null;

        videoPlayer2Renderer.enabled = true;

        videoPlayer1Renderer.enabled = false;
        VideoPlayer1.Stop();
    }
    IEnumerator changeCoroutine1()
    {
        // ロード開始
        VideoPlayer3.Prepare();

        // ロード完了まで待機
        while (!VideoPlayer3.isPrepared)
        {
            yield return null;
        }

        VideoPlayer3.Play();

        // 再生するまで待機
        while (!VideoPlayer3.isPlaying)
        {
            yield return null;
        }
        yield return null;

        videoPlayer3Renderer.enabled = true;

        videoPlayer1Renderer.enabled = false;
        VideoPlayer1.Stop();
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2018/06/22 14:56

    2問目以降で流れる動画は1問目時と同じものですか? また、VideoPlayer1,2,3とコンポーネントを分けていますが、分けている理由は何かありますか?(流す動画を変えたいだけならVideoClipまたはURLを差し替えるだけで済みますが)

    キャンセル

  • OKOMEDJ

    2018/06/22 18:09

    2問目以降ははそれぞれ別の動画が流れます。動画を切り替える際、ロード中に背景が写ってしまうため、ロードをし終えてから動画が切り替わるようにしています。コンポーネントを分ける理由はないかもですね、、どうすれば動画を差し替えられるでしょうか。

    キャンセル

回答 1

checkベストアンサー

0

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;

public class VideoChangeScript : MonoBehaviour {
    //出題用と結果発表用の2つのVideoPlayerを作成してインスペクターから設定
    //出題用には1問目出題用のVideoClipをセットしておき、PlayOnAwakeはオンにすること
    //結果発表用の方が上に重なるようにすること
    public VideoPlayer videoPlayerQuiz;        //出題用
    public VideoPlayer videoPlayerAnswer;    //結果発表用

    //使用するVideoClipを「1問目出題→1問目正解→1問目不正解→2問目出題…」という順番になるようにインスペクターから設定
    public VideoClip[] videoClips;

    //今何問目?(1問目=0、2問目=1…)
    private int nowQuizCount = 0;

    // Use this for initialization
    void Start () {
        videoPlayerAnswer.Stop ();
        videoPlayerAnswer.enabled = false;
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown (KeyCode.RightArrow)) {
            StartCoroutine (AnswerQuizCoroutine (1));    //とりあえず「正解」固定
        } else if (Input.GetKeyDown (KeyCode.LeftArrow)) {
            StartCoroutine (AnswerQuizCoroutine (2));    //とりあえず「不正解」固定
        } else if (Input.GetKeyDown (KeyCode.DownArrow)) {
            StartCoroutine (NextQuizeCoroutine ());    //とりあえず次の問題へ
        }
    }

    //次の問題に進む
    IEnumerator NextQuizeCoroutine() {
        nowQuizCount++;

        //ロードする
        videoPlayerQuiz.clip = videoClips [nowQuizCount*3];
        videoPlayerQuiz.Prepare();

        while (!videoPlayerQuiz.isPrepared)
        {
            yield return null;
        }

        videoPlayerQuiz.Play();

        // 再生するまで待機
        while (!videoPlayerQuiz.isPlaying)
        {
            yield return null;
        }

        //結果発表側オフ
        videoPlayerAnswer.Stop ();
        videoPlayerAnswer.enabled = false;
    }

    //正解・不正解の表示
    //answer = 1なら正解、2なら不正解
    IEnumerator AnswerQuizCoroutine(int answer) {
        //ロードする
        videoPlayerAnswer.enabled = true;
        videoPlayerAnswer.clip = videoClips [nowQuizCount*3 + answer];
        videoPlayerAnswer.Prepare();

        while (!videoPlayerAnswer.isPrepared)
        {
            yield return null;
        }

        //結果発表側オン
        videoPlayerAnswer.Play();

        // 再生するまで待機
        while (!videoPlayerAnswer.isPlaying)
        {
            yield return null;
        }

        //次の問題へ進める
    }
}


多分大丈夫だと思いますが、こんな感じでどうでしょうか。
(コルーチンの呼び出し元は適宜変更してください)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/28 07:25

    結果発表用にはVideoClipをつけないで良いのですか?それと、結果発表用が上に重なるとは、どのようなことでしょうか。

    キャンセル

  • 2018/06/28 09:44

    >結果発表用にはVideoClipをつけないで良いのですか?
    付けないでいいです。スクリプト内で勝手に設定されます。
    出題用に付けるのはシーン開始のロードに巻き込みたい為……ですが実際にそうなっているかはちょっと自信無いので気休めです。

    >結果発表用が上に重なるとは、どのようなことでしょうか。
    文字通り、出題用の上に被さるように結果用が表示されるようにしてください、という意味です。
    RenderModeで何を使っているか分からないので方法はお任せします(私の実験時は出題用をCamera Far Plane、結果用をCamera Near Planeにして同じカメラを使ってました)。

    ネプリーグっぽくとのことだったので、「出題用と結果用の動画が完全に切り替わる(かつ背景が見えないように)=結果用が出題用を覆い隠す」ということでこうしていますが、「出題用と結果用を並べて表示したい」ということなら配置とスクリプトを調整してください。

    キャンセル

  • 2018/06/29 02:08

    なるほどできました!すごくわかりやすく説明してくださりありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Unityでベルトコンベア作りたい

    前提・実現したいこと Unityでベルトコンベア上を走り障害物を躱してゴールを目指すゲーム 発生している問題・エラーメッセージ ベルトコンベア上の物体(障害物・Playe

  • 解決済

    unity sprite 点滅

    unityで、スプライトを点滅させたいのですがうまくいきません。 点滅用の関数?を作ったのですが、点滅してくれません。 function Flash (){ for

  • 解決済

    パーティクルを一瞬だけ表示させたい。

    前提・実現したいこと キー入力とUpdateとLateUpdateを利用して、パーティクルを一瞬だけ表示したいと考えています。 仕様: Fキーを押した瞬間だけ、指定した再

  • 受付中

    [Unity5.6]スプライトをOnTriggerでフェードイン・フェードアウトしたい

    前提・実現したいこと Unity・C#初心者です。 あるスプライトにプレイヤーが接触したらそのスプライトの透明度が変わるコードを書いています。 下記のようなコードで、OnTri

  • 解決済

    Unityのvideoclip切り替え

    Unityで、動画1から動画2へとキーを押したら切り替わるようなコードを書きたいです。Videoplayerで再生する動画をどのようにしたら次の動画へと切り替えられるのでしょうか。

  • 解決済

    ゲームが終了した時GameOverにならない

    【Unity5】uGUIでタイトルとゲームオーバー画面を実装!Canvas, Text, Button【フラッピーバード風5】 ↑ こちらのサイトを参考にIsTriggerがOFに

  • 受付中

    ランダムに選ばれたオブジェクトを移動させたい

    前提・実現したいこと ランダムに選ばれたオブジェクト(Prefabになっている)を右から左に移動させたい。 スクリプトは空のオブジェクトにアタッチしているのでこの状態では空のオブジ

  • 解決済

    Unityでオブジェクトの点滅をさせたい

     Unityでオブジェクトの点滅をさせたい チカチカと点滅する雷を作ろうと思いspotlightにとりあえずこれをアタッチしたところ最後の方のenabledがでエラーが出ます。調べ

同じタグがついた質問を見る

  • Unity

    3814questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。