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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

1回答

1062閲覧

Unity UI 複数のvideoclipからランダムに1つ選んで再生

ZaqHaruna

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2019/05/06 13:33

編集2019/05/07 09:44

前提・実現したいこと

Mac 10.13.6 / Unity 2018.3.4f1 / c#
unityもプログラミングも初心者です。

UI上のObjectが、スクロールで指定のエリアに入ったら、複数のvideoclipからランダムに1つ選んで再生させたいです。
Tagで別のObjectからVideoPlayerを取得>衝突判定を用いて、再生まではできました。

発生している問題・エラーメッセージ

Tagのものがすべて再生されてしまいます。どれか一つだけにしたいです。
以下のスクリプトをどのように編集すると良いでしょうか。

宜しくお願い致します。

該当のソースコード

using System.Collections;
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;

public class MoviePlayerRandom : MonoBehaviour
{
private VideoPlayer mPlayerRandom;
public RawImage rImage;
public bool check = false;
private GameObject[] videoObjects;

    void Start ()
{

// タグでVideoSourceを持つゲームオブジェクト(複数)を見つける videoObjects = GameObject.FindGameObjectsWithTag ( "VideoRandom" ); // ”VideoRandom”タグがついたゲームオブジェクトからVideoPlayerを取得 mPlayerRandom = videoObjects[0].GetComponent <VideoPlayer> (); mPlayerRandom = videoObjects[1].GetComponent <VideoPlayer> ();

    }

    void Update ()
{
// 内部に保存しているテクスチャを設定
if (mPlayerRandom.texture != null && !check)
{
Debug.Log ("Set");
// ランダムにオブジェクトを選択
var VideoRandom = videoObjects[Random.Range(0, videoObjects.Length)];
rImage.texture = mPlayerRandom.texture;
check = true;
}

}

void OnTriggerEnter(Collider other)
{
Debug.Log (other.name + "Enter");

    }

    // 重なり中の判定
void OnTriggerStay(Collider other)
{
{
Debug.Log (other.name + "Stay");
}
//gameObjectがMoviePlayAreaと衝突している場合
if (other.gameObject.name == "MoviePlayArea")
{
mPlayerRandom.GetComponent<VideoPlayer>().Play();
}

    }

    // 重なり離脱の判定
void OnTriggerExit(Collider other)
{
{
Debug.Log (other.name + "Exit");
}

if(other.gameObject.name == "MoviePlayArea")

        {
mPlayerRandom.GetComponent<VideoPlayer>().Pause();

}

    }

}

試したこと

Tagで別のObjectからVideoPlayerを取得>衝突判定を用いて、再生までのヒエラルキー
イメージ説明
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

videoObjects = GameObject.FindGameObjectsWithTag ( "VideoRandom" )
この行の最後に;が無いです。エラーの原因はこれです。
(エラーが出た際はまずエラーコードでググってみてください。今回なら「unity Unexpected symbol」で調べればすぐ分かります)

質問1:ざっくりソースコードを見る限りでは、ランダムについてはこれで動くのではないかと思います。
(正しくタグとコンポーネント指定が出来ているのであれば)
ただしビデオクリップの指定をしていないので見た目上は何も起こらないと思います。(詳細後述)

質問2:このソースコードで何をやっているか再確認します。
videoObjects = GameObject.FindGameObjectsWithTag ( "VideoRandom" );
→シーン上にある「VideoRandom」というタグの付いたGameObjectを全て取得し、配列としてvideoObjects変数に入れる。(ここを理解していれば「Hierarchyはどのような構造になり、どこにスクリプトを貼り付けるか」は分かると思います。分からないなら「GameObjectとそこに付与されたスクリプト取得方法」を再確認した方がいいです)
var VideoRandom = videoObjects[Random.Range(0, videoObjects.Length)];
→videoObjectsの中からランダムに1つ選び、VideoRandom変数に入れる。
var videoSourceId = VideoRandom.GetComponent<VideoSourceID>().VideoSourceID;
→VideoRandom(GameObject)に付いているVideoSourceIDコンポーネントのVideoSourceIDの値をvideoSourceId変数に入れる。)

その後videoSourceIdはどこにも使われていませんので、ランダムに取得した意味がありません。
また、取得したvideoSourceIdはただのint値なので、ビデオクリップが指定されていません。

「何かしらの方法でビデオクリップを指定」
「指定したビデオクリップをmPlayerRandomに反映」
の2工程が足りていません。

投稿2019/05/07 00:40

sakura_hana

総合スコア11427

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

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

ZaqHaruna

2019/05/07 01:03

早速ご回答ありがとうございます。今からご指摘いただいた点を確認させていただきます! 取り急ぎお礼まで。
ZaqHaruna

2019/05/07 09:51

お陰様で、エラーとヒエラルキーの問題は解決しました! 新たな問題として、Tagのものがすべて再生されてしまいます。 もし可能であれば、有効な方法をアドバイスいただけますでしょうか。質問のソースコードを修正させていただきました。 恐らくこれが原因だと思うのですが、解決策が思いつかず... mPlayerRandom = videoObjects[0].GetComponent <VideoPlayer> (); mPlayerRandom = videoObjects[1].GetComponent <VideoPlayer> ();
sakura_hana

2019/05/08 00:30

各VideoPlayerコンポーネントの「Play On Awake」がオンだと自動再生されるので、全部再生されるのはそれが原因ではないかと思います。確認してみてください。 それはそれとして、現状のコードだと、 「Startのタイミングで、同Tagの配列1番(つまりvideoObjects[1])のVideoPlayerをmPlayerRandomに入れる」 (mPlayerRandom = videoObjects[0].GetComponent <VideoPlayer> ();の行は無視されるに等しい) 「再生されるのはmPlayerRandom(つまり常に同Tagの配列1番が再生される)」 という動きになるので、ランダム要素が無くなります。 それぞれソースコードの意味を再確認してみてください。
ZaqHaruna

2019/05/08 12:08

Play on awake はoff なようです。 代入が取り消されていますね… 片方消して、[0]にランダムに乱数取得の式を入れたら無事に動きました。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問