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

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

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

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

Q&A

解決済

1回答

8775閲覧

Unityのvideoclip切り替え

shincra

総合スコア14

Unity

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

0グッド

1クリップ

投稿2018/06/15 16:23

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

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

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

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

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

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

shincra

2018/06/16 23:40

回答ありがとうございます!その方法で動画は切り替わったのですが、切り替わる瞬間にどうしても背景が映り込んでしまいます。これは仕方ないのでしょうか。
fiveHundred

2018/06/17 03:48

回答に追記しましたので、確認してください。なお、この欄は質問の修正や追記を依頼する欄なので、回答への質問はその回答のコメント欄に書き込んでください。
guest

回答1

0

ベストアンサー

以下のように、VideoPlayer.clipを変更すればよいです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Video; 5 6public class VideoChangeScript : MonoBehaviour 7{ 8 // インスペクター上で変更後の動画を指定 9 public VideoClip NewClip; 10 // インスペクター上でVideoPlayerを指定 11 public VideoPlayer VideoPlayerComponent; 12 13 void Update() 14 { 15 if (Input.GetKeyDown(KeyCode.Space)) 16 { 17 VideoPlayerComponent.clip = NewClip; 18 } 19 } 20}

追記:
「再生が開始されるまでは、変更前の動画のままにする」という考えの元、以下のソースを試してみたのですがどうでしょう?
(※VideoPlayer1とVideoPlayer2は別々のゲームオブジェクトに配置してください)

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 12 Renderer videoPlayer1Renderer; 13 Renderer videoPlayer2Renderer; 14 15 void Start() 16 { 17 videoPlayer1Renderer = VideoPlayer1.GetComponent<Renderer>(); 18 videoPlayer2Renderer = VideoPlayer2.GetComponent<Renderer>(); 19 20 videoPlayer1Renderer.enabled = true; 21 videoPlayer2Renderer.enabled = false; 22 23 VideoPlayer1.Play(); 24 VideoPlayer2.Stop(); 25 } 26 27 void Update() 28 { 29 if (Input.GetKeyDown(KeyCode.Space)) 30 { 31 StartCoroutine(changeCoroutine()); 32 } 33 } 34 35 IEnumerator changeCoroutine() 36 { 37 // ロード開始 38 VideoPlayer2.Prepare(); 39 40 // ロード完了まで待機 41 while (!VideoPlayer2.isPrepared) 42 { 43 yield return null; 44 } 45 46 VideoPlayer2.Play(); 47 48 // 再生するまで待機 49 while (!VideoPlayer2.isPlaying) 50 { 51 yield return null; 52 } 53 yield return null; 54 55 videoPlayer2Renderer.enabled = true; 56 57 videoPlayer1Renderer.enabled = false; 58 VideoPlayer1.Stop(); 59 } 60}

投稿2018/06/16 01:27

編集2018/06/17 03:45
fiveHundred

総合スコア9803

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

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

shincra

2018/06/23 16:34

追記; 度々すみません。以下のようなスクリプトを書いたのですがうまくいきません。内容は、VideoPlayer1から2か3に矢印キーを押すと分岐し、右矢印を押したときは新たなクラスを呼び出して今と同じことがまた別のVideoPlayer4,5,6で繰り返されるといったものです。クラスを呼び出すとこからがよくわからなく、教えていただきたいです。 C# 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(); } }
fiveHundred

2018/06/24 02:11

1. VideoPlayer4,5,6のクラスに呼び出し用のpublic関数(あるいはコルーチン)を作成する 2. VideoPlayer4,5,6のクラスのインスタンスを取得する(インスペクター上で事前に指定するでもよい) 3. 2.のインスタンスにある、1.の関数を実行する という具合になると思いますが、この中に分からないところはありますでしょうか?
shincra

2018/06/24 17:13

クラスを呼び出すことが上手く行かないのですが、呼び出し用のpublic関数とはどのようにしたら良いでしょうか。一応、VideoPlayer2の再生が終わり次第、クラスを呼び出すつもりです。
fiveHundred

2018/06/25 03:30

「クラスを呼び出すこと」というのは以下のどれでしょうか? - クラスのインスタンスが生成できない - 生成済みのインスタンスを取得する方法が分からない - クラス内に定義している関数が呼び出せない - etc.. また、「呼び出し用のpublic関数」については、他クラスから呼び出したい関数にpublicを付ければ(あるいはそのような関数を新規に作れば)よいです。
shincra

2018/06/26 10:42

インスタンスの取得の仕方が分からないです。
fiveHundred

2018/06/26 11:45

publicな変数を用意して、そこにインスペクターorスクリプト上で格納するのが簡単だと思います。 あるいは「GameObject.Find()」や「GameObject.GetComponent<>()」などの関数を使う方法もあります。
shincra

2018/06/26 16:18

GameObject.Find()で出来ました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問