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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1523閲覧

VideoPlayer切り替え

OKOMEDJ

総合スコア9

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/06/21 15:20

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

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Video; 5 6public class VideoChangeScript : MonoBehaviour 7{ 8 // インスペクター上でVideoPlayerを指定 9 public VideoPlayer VideoPlayer1; 10 public VideoPlayer VideoPlayer2; 11 public VideoPlayer VideoPlayer3; 12 13 Renderer videoPlayer1Renderer; 14 Renderer videoPlayer2Renderer; 15 Renderer videoPlayer3Renderer; 16 17 void Start() 18 { 19 videoPlayer1Renderer = VideoPlayer1.GetComponent<Renderer>(); 20 videoPlayer2Renderer = VideoPlayer2.GetComponent<Renderer>(); 21 videoPlayer3Renderer = VideoPlayer3.GetComponent<Renderer>(); 22 23 videoPlayer1Renderer.enabled = true; 24 videoPlayer2Renderer.enabled = false; 25 videoPlayer3Renderer.enabled = false; 26 27 VideoPlayer1.Play(); 28 VideoPlayer2.Stop(); 29 VideoPlayer3.Stop(); 30 } 31 32 void Update() 33 { 34 if (Input.GetKeyDown (KeyCode.RightArrow)) { 35 StartCoroutine (changeCoroutine ()); 36 } else if (Input.GetKeyDown (KeyCode.LeftArrow)) { 37 StartCoroutine (changeCoroutine1 ()); 38 } 39 } 40 41 IEnumerator changeCoroutine() 42 { 43 // ロード開始 44 VideoPlayer2.Prepare(); 45 46 // ロード完了まで待機 47 while (!VideoPlayer2.isPrepared) 48 { 49 yield return null; 50 } 51 52 VideoPlayer2.Play(); 53 54 // 再生するまで待機 55 while (!VideoPlayer2.isPlaying) 56 { 57 yield return null; 58 } 59 yield return null; 60 61 videoPlayer2Renderer.enabled = true; 62 63 videoPlayer1Renderer.enabled = false; 64 VideoPlayer1.Stop(); 65 } 66 IEnumerator changeCoroutine1() 67 { 68 // ロード開始 69 VideoPlayer3.Prepare(); 70 71 // ロード完了まで待機 72 while (!VideoPlayer3.isPrepared) 73 { 74 yield return null; 75 } 76 77 VideoPlayer3.Play(); 78 79 // 再生するまで待機 80 while (!VideoPlayer3.isPlaying) 81 { 82 yield return null; 83 } 84 yield return null; 85 86 videoPlayer3Renderer.enabled = true; 87 88 videoPlayer1Renderer.enabled = false; 89 VideoPlayer1.Stop(); 90 } 91}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2018/06/22 05:56

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

2018/06/22 09:09

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

回答1

0

ベストアンサー

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Video; 5 6public class VideoChangeScript : MonoBehaviour { 7 //出題用と結果発表用の2つのVideoPlayerを作成してインスペクターから設定 8 //出題用には1問目出題用のVideoClipをセットしておき、PlayOnAwakeはオンにすること 9 //結果発表用の方が上に重なるようにすること 10 public VideoPlayer videoPlayerQuiz; //出題用 11 public VideoPlayer videoPlayerAnswer; //結果発表用 12 13 //使用するVideoClipを「1問目出題→1問目正解→1問目不正解→2問目出題…」という順番になるようにインスペクターから設定 14 public VideoClip[] videoClips; 15 16 //今何問目?(1問目=0、2問目=1…) 17 private int nowQuizCount = 0; 18 19 // Use this for initialization 20 void Start () { 21 videoPlayerAnswer.Stop (); 22 videoPlayerAnswer.enabled = false; 23 } 24 25 // Update is called once per frame 26 void Update () { 27 if (Input.GetKeyDown (KeyCode.RightArrow)) { 28 StartCoroutine (AnswerQuizCoroutine (1)); //とりあえず「正解」固定 29 } else if (Input.GetKeyDown (KeyCode.LeftArrow)) { 30 StartCoroutine (AnswerQuizCoroutine (2)); //とりあえず「不正解」固定 31 } else if (Input.GetKeyDown (KeyCode.DownArrow)) { 32 StartCoroutine (NextQuizeCoroutine ()); //とりあえず次の問題へ 33 } 34 } 35 36 //次の問題に進む 37 IEnumerator NextQuizeCoroutine() { 38 nowQuizCount++; 39 40 //ロードする 41 videoPlayerQuiz.clip = videoClips [nowQuizCount*3]; 42 videoPlayerQuiz.Prepare(); 43 44 while (!videoPlayerQuiz.isPrepared) 45 { 46 yield return null; 47 } 48 49 videoPlayerQuiz.Play(); 50 51 // 再生するまで待機 52 while (!videoPlayerQuiz.isPlaying) 53 { 54 yield return null; 55 } 56 57 //結果発表側オフ 58 videoPlayerAnswer.Stop (); 59 videoPlayerAnswer.enabled = false; 60 } 61 62 //正解・不正解の表示 63 //answer = 1なら正解、2なら不正解 64 IEnumerator AnswerQuizCoroutine(int answer) { 65 //ロードする 66 videoPlayerAnswer.enabled = true; 67 videoPlayerAnswer.clip = videoClips [nowQuizCount*3 + answer]; 68 videoPlayerAnswer.Prepare(); 69 70 while (!videoPlayerAnswer.isPrepared) 71 { 72 yield return null; 73 } 74 75 //結果発表側オン 76 videoPlayerAnswer.Play(); 77 78 // 再生するまで待機 79 while (!videoPlayerAnswer.isPlaying) 80 { 81 yield return null; 82 } 83 84 //次の問題へ進める 85 } 86} 87

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

投稿2018/06/26 12:28

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OKOMEDJ

2018/06/27 22:25

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

2018/06/28 00:44

>結果発表用にはVideoClipをつけないで良いのですか? 付けないでいいです。スクリプト内で勝手に設定されます。 出題用に付けるのはシーン開始のロードに巻き込みたい為……ですが実際にそうなっているかはちょっと自信無いので気休めです。 >結果発表用が上に重なるとは、どのようなことでしょうか。 文字通り、出題用の上に被さるように結果用が表示されるようにしてください、という意味です。 RenderModeで何を使っているか分からないので方法はお任せします(私の実験時は出題用をCamera Far Plane、結果用をCamera Near Planeにして同じカメラを使ってました)。 ネプリーグっぽくとのことだったので、「出題用と結果用の動画が完全に切り替わる(かつ背景が見えないように)=結果用が出題用を覆い隠す」ということでこうしていますが、「出題用と結果用を並べて表示したい」ということなら配置とスクリプトを調整してください。
OKOMEDJ

2018/06/28 17:08

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問