回答編集履歴

8

追記

2022/05/16 12:19

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,3 +1,5 @@
1
+ # ※末尾に追記しました
2
+
1
3
  下記で対応できると思います。
2
4
  テストはしていないので問題ありましたら連絡ください。
3
5
 
@@ -146,8 +148,6 @@
146
148
  VideoMetaData.csという名前で保存
147
149
 
148
150
  ```c#
149
-
150
-
151
151
  using System.Collections.Generic;
152
152
  using UnityEngine;
153
153
 
@@ -207,4 +207,194 @@
207
207
  }
208
208
  ```
209
209
 
210
-
210
+ # 追記
211
+
212
+ 改めて改良した各クラス追記します。
213
+ 上記の動画の管理に加えてボタンの連携も実装しました。
214
+
215
+ ### ボタンの管理
216
+
217
+ ##### スクリプト名
218
+ ChangVButtonController.cs
219
+
220
+ ##### 設置方法
221
+ 1. ChangVButtonController.csとういうスクリプトを作成しAssets配下に設置
222
+ 2. ボタンの親を作ってそこにアタッチする
223
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/f650b7bb-61ed-474b-8ead-de100d9ace57.png)
224
+
225
+ ##### スクリプト
226
+ ```c#
227
+ using UnityEngine;
228
+ using UnityEngine.Assertions;
229
+ using UnityEngine.Video;
230
+
231
+ /// <summary>
232
+ /// ボタンの管理
233
+ /// すべてのボタンをこのスクリプトがアタッチされた子に配置
234
+ /// </summary>
235
+ public class ChangVButtonController : MonoBehaviour
236
+ {
237
+ [SerializeField] ChangV changV;
238
+
239
+ /// <summary>
240
+ /// Videoが再生中か?
241
+ /// </summary>
242
+ public bool IsPlaying => changV.Vp.isPlaying;
243
+
244
+ ChangVButton[] buttons;
245
+
246
+ void Awake()
247
+ {
248
+ buttons = GetComponentsInChildren<ChangVButton>(true);
249
+ Assert.IsTrue(buttons.Length > 0, "ボタンが0です。すべてのボタンをこのスクリプトがアタッチされた子に配置してください。");
250
+ }
251
+
252
+ void Start()
253
+ {
254
+ foreach (var button in buttons)
255
+ {
256
+ button.SetController(this);
257
+ }
258
+ changV.Vp.loopPointReached += OnLoopPointReached;
259
+ }
260
+
261
+ public void ChangeVideo(VideoID videoID)
262
+ {
263
+ Assert.IsTrue(!IsPlaying, "再生中に再生が呼ばれました");
264
+ changV.ChangeVideo(videoID);
265
+
266
+ foreach (var button in buttons)
267
+ {
268
+ button.gameObject.SetActive(false);
269
+ }
270
+ }
271
+
272
+ void OnLoopPointReached(VideoPlayer source)
273
+ {
274
+ foreach (var button in buttons)
275
+ {
276
+ button.gameObject.SetActive(true);
277
+ }
278
+ }
279
+
280
+ void Reset()
281
+ {
282
+ changV = FindObjectOfType<ChangV>();
283
+ }
284
+ }
285
+ ```
286
+
287
+ ### 動画の再生
288
+
289
+ ##### スクリプト名
290
+ ChangV.cs
291
+
292
+ ##### 設置方法
293
+ 既に設置済みだと思うので割愛
294
+
295
+ ##### スクリプト
296
+
297
+ ```c#
298
+ using UnityEngine;
299
+ using UnityEngine.Video;
300
+
301
+ public class ChangV : MonoBehaviour
302
+ {
303
+ public VideoPlayer Vp { get; private set; }
304
+
305
+ void Start()
306
+ {
307
+ Vp = GetComponent<VideoPlayer>();
308
+ //↓VideoPlayerの再生準備ができたとき、OnVideoPlayerPreparedが呼ばれる
309
+ Vp.prepareCompleted += OnVideoPlayerPrepared;
310
+ }
311
+
312
+ void OnVideoPlayerPrepared (VideoPlayer vp)
313
+ {
314
+ vp.Play();
315
+ }
316
+
317
+ public void ChangeVideo (VideoID id)
318
+ {
319
+ //既にVideoPlayerに動画が読み込まれている場合
320
+ if (Vp.clip != null)
321
+ {
322
+ Vp.Stop();
323
+ //↓その動画をメモリから解放する
324
+ Resources.UnloadAsset(Vp.clip);
325
+ }
326
+
327
+ var meta = id.GetMeta();
328
+ // var title = meta.Title;
329
+
330
+ //動画をメモリに読み込む
331
+ Vp.clip = Resources.Load<VideoClip>(meta.Path);
332
+ //↓VideoPlayerに再生準備をさせる
333
+ Vp.Prepare();
334
+ }
335
+ }
336
+ ```
337
+
338
+ ### 動画の再生
339
+
340
+ ##### スクリプト名
341
+ ChangVButton.cs
342
+
343
+ ##### 設置方法
344
+ 既に設置済みだと思うので割愛 ボタンにアタッチする
345
+
346
+ ##### スクリプト
347
+
348
+ ```c#
349
+
350
+ using UnityEngine;
351
+ using UnityEngine.UI;
352
+
353
+ [RequireComponent(typeof(Button))]
354
+ public class ChangVButton : MonoBehaviour
355
+ {
356
+ [SerializeField] Button playButton;
357
+ [SerializeField] VideoID playTarget;
358
+
359
+ ChangVButtonController controller;
360
+
361
+ void Start()
362
+ {
363
+ playButton.onClick.AddListener(ClickPlayButton);
364
+ }
365
+
366
+ public void SetController(ChangVButtonController controller)
367
+ {
368
+ this.controller = controller;
369
+ }
370
+
371
+ /// <summary>
372
+ /// プレイボタンのクリック
373
+ /// </summary>
374
+ void ClickPlayButton()
375
+ {
376
+ if (!controller.IsPlaying)
377
+ {
378
+ controller.ChangeVideo(playTarget);
379
+ }
380
+ }
381
+
382
+ void Reset()
383
+ {
384
+ playButton = GetComponent<Button>();
385
+ }
386
+ }
387
+ ```
388
+
389
+ ### 動画の管理スクリプト
390
+
391
+ ##### スクリプト名
392
+ VideoMetaData.cs
393
+
394
+ ##### 設置方法
395
+ VideoMetaData.csとういうスクリプトを作成しAssets配下に設置
396
+
397
+ #### スクリプト
398
+ 動画の管理で書いたものと同じもので割愛
399
+
400
+

7

修正

2022/05/16 06:15

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -143,7 +143,7 @@
143
143
 
144
144
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/1f215e18-2c35-4579-8b1b-8024d7de96a8.png)
145
145
 
146
- VideoExtensions.csという名前で保存
146
+ VideoMetaData.csという名前で保存
147
147
 
148
148
  ```c#
149
149
 

6

修正

2022/05/16 06:12

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -189,7 +189,7 @@
189
189
 
190
190
  /// <summary>
191
191
  /// ビデオのID
192
- /// ※ 順番変更禁止
192
+ /// ※ 最初に設定する順番変更禁止。増やす場合は後に追加
193
193
  /// </summary>
194
194
  public enum VideoID
195
195
  {

5

修正

2022/05/16 06:11

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -146,16 +146,28 @@
146
146
  VideoExtensions.csという名前で保存
147
147
 
148
148
  ```c#
149
+
150
+
149
151
  using System.Collections.Generic;
150
152
  using UnityEngine;
151
153
 
152
154
  public static class VideoExtensions
153
155
  {
154
- static IEnumerable<VideoMeta> metas = new VideoMeta[]
156
+ static readonly IEnumerable<VideoMeta> Metas = new VideoMeta[]
155
- {
157
+ {
158
+ new VideoMeta
159
+ {
160
+ ID = VideoID.London,
161
+ Title = "ロンドン",
156
- new VideoMeta { ID = VideoID.London, Title = "ロンドン", Path = "Video/London" },
162
+ Path = "Video/London"
163
+ },
164
+ new VideoMeta
165
+ {
166
+ ID = VideoID.Paris,
167
+ Title = "パリ",
157
- new VideoMeta { ID = VideoID.Paris, Title = "パリ", Path = "Video/Paris" },
168
+ Path = "Video/Paris"
169
+ },
158
- // 他動画をここに追加していく
170
+ // 他動画の情報をここに追加していく
159
171
  };
160
172
 
161
173
  /// <summary>
@@ -163,7 +175,7 @@
163
175
  /// </summary>
164
176
  public static VideoMeta GetMeta(this VideoID id)
165
177
  {
166
- foreach (var meta in metas)
178
+ foreach (var meta in Metas)
167
179
  {
168
180
  if (meta.ID == id)
169
181
  {
@@ -173,15 +185,6 @@
173
185
  Debug.LogError($"存在しないVideo {id}");
174
186
  return default;
175
187
  }
176
-
177
- }
178
-
179
- public class VideoMeta
180
- {
181
- public VideoID ID;
182
- public string Title;
183
- public string Path;
184
- // 入れたい情報を書き足していく
185
188
  }
186
189
 
187
190
  /// <summary>
@@ -192,8 +195,16 @@
192
195
  {
193
196
  London = 0,
194
197
  Paris
195
- // 他動画をここに追加していく
198
+ // 他動画のIDをここに追加していく
196
- }
199
+ }
200
+
201
+ public class VideoMeta
202
+ {
203
+ public VideoID ID;
204
+ public string Title;
205
+ public string Path;
206
+ // 入れたい情報を書き足していく
207
+ }
197
- ```
208
+ ```
198
-
199
-
209
+
210
+

4

動画の管理について

2022/05/16 06:07

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -98,3 +98,102 @@
98
98
  }
99
99
  }
100
100
  ```
101
+
102
+ ## 動画の管理について
103
+
104
+ 今回の質問とは逸れますが、動画量が少ないなら下記のような感じで動画の詳細管理を簡易的に実装しておくのも良いかもしれません。
105
+ 利点は下記です。
106
+
107
+ - 動画のパスを間違って事故ったりしない
108
+ - タイトルなどの情報も管理できる
109
+ - 動画の詳細を実装から分離できる
110
+
111
+ 以上です。よければ参考にしてみてください。
112
+
113
+ ChangV.csの`ChangeVideo`を書き換える
114
+ ```C#
115
+ public void ChangeVideo (VideoID id)
116
+ {
117
+ //既にVideoPlayerに動画が読み込まれている場合
118
+ if (Vp.clip != null)
119
+ {
120
+ Vp.Stop();
121
+ //↓その動画をメモリから解放する
122
+ Resources.UnloadAsset(Vp.clip);
123
+ }
124
+
125
+ var meta = id.GetMeta();
126
+ // var title = meta.Title; タイトルを取得できる
127
+
128
+ //動画をメモリに読み込む
129
+ Vp.clip = Resources.Load<VideoClip>(meta.Path);
130
+ //↓VideoPlayerに再生準備をさせる
131
+ Vp.Prepare();
132
+ }
133
+ ```
134
+
135
+ ChangVButton.csの`playTarget`を書き換える
136
+ ```c#
137
+ [SerializeField] string playTarget = "London";
138
+ // ↓
139
+ [SerializeField] VideoID playTarget;
140
+ ```
141
+
142
+ そうするとボタン側はこんな感じでドロップダウンから選択できるようになり安全です。
143
+
144
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/1f215e18-2c35-4579-8b1b-8024d7de96a8.png)
145
+
146
+ VideoExtensions.csという名前で保存
147
+
148
+ ```c#
149
+ using System.Collections.Generic;
150
+ using UnityEngine;
151
+
152
+ public static class VideoExtensions
153
+ {
154
+ static IEnumerable<VideoMeta> metas = new VideoMeta[]
155
+ {
156
+ new VideoMeta { ID = VideoID.London, Title = "ロンドン", Path = "Video/London" },
157
+ new VideoMeta { ID = VideoID.Paris, Title = "パリ", Path = "Video/Paris" },
158
+ // 他動画をここに追加していく
159
+ };
160
+
161
+ /// <summary>
162
+ /// Videoの情報を取得
163
+ /// </summary>
164
+ public static VideoMeta GetMeta(this VideoID id)
165
+ {
166
+ foreach (var meta in metas)
167
+ {
168
+ if (meta.ID == id)
169
+ {
170
+ return meta;
171
+ }
172
+ }
173
+ Debug.LogError($"存在しないVideo {id}");
174
+ return default;
175
+ }
176
+
177
+ }
178
+
179
+ public class VideoMeta
180
+ {
181
+ public VideoID ID;
182
+ public string Title;
183
+ public string Path;
184
+ // 入れたい情報を書き足していく
185
+ }
186
+
187
+ /// <summary>
188
+ /// ビデオのID
189
+ /// ※ 順番変更禁止
190
+ /// </summary>
191
+ public enum VideoID
192
+ {
193
+ London = 0,
194
+ Paris
195
+ // 他動画をここに追加していく
196
+ }
197
+ ```
198
+
199
+

3

修正

2022/05/16 05:41

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -45,6 +45,9 @@
45
45
  ```
46
46
 
47
47
  ### ボタンにChangVButton.csをアタッチ
48
+
49
+ ※ボタンA,Bがあるとの事なので両方とも下記の対応をお願いします。
50
+ ※`PlayTarget`(説明は後述)にボタンAで表示したい動画名を。ボタンBで表示したい動画名を設定してください。
48
51
 
49
52
  四角で囲った部分を「-」ボタンで削除してください。
50
53
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/ea0a99e5-60a1-43ba-ac8e-30e32a49e1de.png)

2

修正

2022/05/16 05:37

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -49,7 +49,7 @@
49
49
  四角で囲った部分を「-」ボタンで削除してください。
50
50
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/ea0a99e5-60a1-43ba-ac8e-30e32a49e1de.png)
51
51
 
52
- 下記スクリプトを`ChangVButton'という名前で保存し、ボタンにアタッチしてください。
52
+ 下記スクリプトを`ChangVButton`という名前で保存し、ボタンにアタッチしてください。
53
53
 
54
54
  `PlayTarget`を変更する事で違う動画を再生できます。
55
55
  個人的には、直書きしない方が良いと思いますがテストなので今回はこの形にしました。

1

修正

2022/05/16 05:35

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -49,11 +49,13 @@
49
49
  四角で囲った部分を「-」ボタンで削除してください。
50
50
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/ea0a99e5-60a1-43ba-ac8e-30e32a49e1de.png)
51
51
 
52
- 下記スクリプトをChangVButtontという名前で保存し、ボタンにアタッチしてください。
52
+ 下記スクリプトを`ChangVButton'という名前で保存し、ボタンにアタッチしてください。
53
53
 
54
- PlayTargetを変更する事で違う動画を再生できます。
54
+ `PlayTarget`を変更する事で違う動画を再生できます。
55
55
  個人的には、直書きしない方が良いと思いますがテストなので今回はこの形にしました。
56
56
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-05-16/2eaf1acd-c600-4de7-9d3f-3cc01ebef2d0.png)
57
+ アタッチ後、`ChangV`をドラッグ&ドロップで設定してください。
58
+ `PlayButton`は自動で設定されるはずですが、されなければ同じくドラッグ&ドロップで設定してください。
57
59
 
58
60
  ```c#
59
61
  using UnityEngine;