如何用3D游戏体播放视频?
开发者在用Unity3D做工艺仿真、AR或者游戏时,经常要在各种形状的3D游戏体上插播视频充当广告或者教学,那到底怎样实现呢?这就要用到Unity内置的视频播放组件 —— VideoPlayer。
Unity官方网址:https://docs.unity3d.com/Manual/class-VideoPlayer.html
主题
- Demo效果展示
- 如何在3D物体表面播放视频
- 如何代码控制VideoPlayer
-
- 1.代码控制视频播放、暂停,监听播放结束等
- 2.如何监测3D游戏体是否在视野内?
- 注意事项
- 如何在2D Canvas上播放视频
Demo效果展示
先上视频看看效果(从左至右,依次是平面、球体、曲面、圆柱):
如何在3D物体表面播放视频?
如何在3D物体表面播放视频
首先创建GameObject ,在GameObject 上添加VideoPlayer 组件:
然后可以看到,Source 中两个选项,我目前用的是VideoClip。
1.VideoClip :可以直接拖入Project视图中的视频
2.URL : 可以放入视频的存储路径
然后下面还有一个选项值得一提,RenderMode(渲染模式)。播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类。所以这里我们是想在3D物体上播放视频,所以选择MaterialOverride。
勾选play on awake,运行,就可以看到视频在模型上播放了。
如何代码控制VideoPlayer
1.代码控制视频播放、暂停,监听播放结束等
上面已经完成了视频播放功能,接下来我们通过代码控制视频:
下面展示一些 视频播放、暂停,监听播放结束等方法
。
private VideoPlayer Vp;
void Awake()
{
Vp = GetComponent<VideoPlayer>();
}
void Start()
{
Vp.loopPointReached += VideoEnd;
Vp.Play();//播放视频
Vp.Pause();//暂停视频
Vp.Stop();//停止视频
Vp.playbackSpeed = 1;//播放速度
}
/// <summary>
/// 监听视频是否播放结束,结束时调用
/// </summary>
/// <param name="vp"></param>
void VideoEnd(VideoPlayer vp)
{
Debug.Log("视频播放结束");
Vp.Play();//重新播放视频
}
2.如何监测3D游戏体是否在视野内?
视频一般是有声音的,在做AR项目时,通常会在3D游戏体出界后,关闭该游戏体身上的视频和音效,那么如何监测3D游戏体是否出界呢?
Unity有一个内置方法,使用的唯一条件是该游戏体身上必须带有Mseh组件,因为它是通过是否渲染该游戏体来判断的。
下面展示 3D游戏体是否在视野内的监测方法
。
//当游戏体第一次出界时调用,该游戏体身上必须带有Mseh组件
private void OnBecameInvisible()
{
StopVideo();
Debug.Log("出界");
}
//当游戏体第一次进入视野时调用,该游戏体身上必须带有Mseh组件
private void OnBecameVisible()
{
OpenVideo();
Debug.Log("视野内");
}
注意事项
- 可选视频类型:.mp4、mov、.mpg、.mpeg、.avi和.asf
- 亲测3D模型使用情况:
1、视频会在模型的每一个面都播放,比如视频会在正方体6个面分别播放。此外,模型和视频比例不一样的话会有拉伸情况。因此,需要按自己需求让美术做配套的模型和视频。
2、如果发现视频的中心并不在3D模型的中间,是模型UV的问题,需要美术调整UV,把视频放在模型指定面的中间。
如何在2D Canvas上播放视频
在2D界面播放视频和在3D游戏体上播放,原理及代码是一样的,区别是要把Mesh组件换成RawImage,然后VideoPlayer的RenderMode选项选择RenderTexture或者其他选项。
详情就不说了,网上有很多,可以参考以下网址:
https://blog.csdn.net/weixin_43367805/article/details/93178830
https://www.cnblogs.com/0kk470/p/10637034.html