Unityで、動画1から動画2へとキーを押したら切り替わるようなコードを書きたいです。Videoplayerで再生する動画をどのようにしたら次の動画へと切り替えられるのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答ありがとうございます!その方法で動画は切り替わったのですが、切り替わる瞬間にどうしても背景が映り込んでしまいます。これは仕方ないのでしょうか。
2018/06/17 03:48
回答に追記しましたので、確認してください。なお、この欄は質問の修正や追記を依頼する欄なので、回答への質問はその回答のコメント欄に書き込んでください。
回答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総合スコア9803
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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();
}
}
2018/06/24 02:11
1. VideoPlayer4,5,6のクラスに呼び出し用のpublic関数(あるいはコルーチン)を作成する
2. VideoPlayer4,5,6のクラスのインスタンスを取得する(インスペクター上で事前に指定するでもよい)
3. 2.のインスタンスにある、1.の関数を実行する
という具合になると思いますが、この中に分からないところはありますでしょうか?
2018/06/24 17:13
クラスを呼び出すことが上手く行かないのですが、呼び出し用のpublic関数とはどのようにしたら良いでしょうか。一応、VideoPlayer2の再生が終わり次第、クラスを呼び出すつもりです。
2018/06/25 03:30
「クラスを呼び出すこと」というのは以下のどれでしょうか?
- クラスのインスタンスが生成できない
- 生成済みのインスタンスを取得する方法が分からない
- クラス内に定義している関数が呼び出せない
- etc..
また、「呼び出し用のpublic関数」については、他クラスから呼び出したい関数にpublicを付ければ(あるいはそのような関数を新規に作れば)よいです。
2018/06/26 10:42
インスタンスの取得の仕方が分からないです。
2018/06/26 11:45
publicな変数を用意して、そこにインスペクターorスクリプト上で格納するのが簡単だと思います。
あるいは「GameObject.Find()」や「GameObject.GetComponent<>()」などの関数を使う方法もあります。
2018/06/26 16:21 編集
。
2018/06/26 16:18
GameObject.Find()で出来ました!ありがとうございます。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。