如何用3D游戏体播放视频(VideoPlayer)?

如何用3D游戏体播放视频?

开发者在用Unity3D做工艺仿真、AR或者游戏时,经常要在各种形状的3D游戏体上插播视频充当广告或者教学,那到底怎样实现呢?这就要用到Unity内置的视频播放组件 —— VideoPlayer

Unity官方网址:https://docs.unity3d.com/Manual/class-VideoPlayer.html

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("视野内");
        }

注意事项

  1. 可选视频类型:.mp4、mov、.mpg、.mpeg、.avi和.asf
  2. 亲测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

猜你喜欢

转载自blog.csdn.net/qq_43505432/article/details/108663950