Unity中使用HTCVIVE播放全景视频(AVProVideo插件)
1、前言
刚入职第一周做了一项目小demo,接下来给大家分享一下我的感悟吧!
1.1、Unity中播放全景视频有很多种方法,但都是大同小异,播放视频都需要有一个载体,我们看电视时,是屏幕,看电影时,是影院的画布,SO,Unity中播放视频可以是UI 也可以是Cube等,全景视频的每一帧就是一张全景图片,所以我们用一个球来当做载体。
1.2、你可以使用MoveTexture,或者PlayerVideo来做,原理都是一样的,获取球的材质球,把视频作为纹理贴上去,然后把摄像机放到球的中心,然后有API控制播放。但是要注意球的内部是看不到的所以要自己写一个Shader来让球的内部可以看到
Shader代码如下:
Shader "Unlit/UnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Cull Front //剔除正面,用于看到球体的内
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float u_x=1-i.uv.x; //因为球的内部是像镜子一样反着的
float u_y=i.uv.y; //所以要改变其uv坐标
i.uv=float2(u_x,u_y); //只改变x,就行了,
fixed4 col = tex2D(_MainTex, i.uv);
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
这种方法网上都有,我就不详细介绍了。
1.3、我一开始使用以上两种方法,但是后来都因为各种原因报错,很无奈,于是就是找到了这个AV插件。哈哈哈,插件AVProVideo可以从Github上下载,地址如下:AVProVideo下载地址,这里面有很多例子,多参考一下。
2、功能制作
2.1首先新建工程将下载的工程导入到工程中,我们可以看到它自带有很多的案例,案例中的视频都是读取的StreamingAssets下的,如果我们想要读取网络上的视频时,我们需要打开Media Player组件将连接复制到上面就行:
在案例8中就是一个全景视频的小Demo可以参考,将视频导入到StreamAssets文件夹下,将球的预制体拖入到场景中,这是插件封装好的,只需要将视频拖上就可以了。
2.2将Htc的位置放到球的中间,运行就行了,此外你也可以加入按钮,或者进度条等下面会具体介绍进度条。
2.3主要还是研究一下Media Player组件的每项功能,我还没研究完就不说了,说一下进度条吧,新建Slider ,Text等
话不多说,直接上代码。
public class VCR : MonoBehaviour
{
public MediaPlayer _mediaPlayer;
public Slider _videoSeekSlider;
private float _setVideoSeekSliderValue;
private bool _wasPlayingOnScrub;
public void OnVideoSeekSlider()
{
if (PlayingPlayer && _videoSeekSlider && _videoSeekSlider.value != _setVideoSeekSliderValue)
{
PlayingPlayer.Control.Seek(_videoSeekSlider.value * PlayingPlayer.Info.GetDurationMs());
}
}
public void OnVideoSliderDown()
{
if(PlayingPlayer)
{
_wasPlayingOnScrub = PlayingPlayer.Control.IsPlaying();
if( _wasPlayingOnScrub )
{
PlayingPlayer.Control.Pause();
// SetButtonEnabled( "PauseButton", false );
// SetButtonEnabled( "PlayButton", true );
}
OnVideoSeekSlider();
}
}
public void OnVideoSliderUp()
{
if(PlayingPlayer && _wasPlayingOnScrub )
{
PlayingPlayer.Control.Play();
_wasPlayingOnScrub = false;
// SetButtonEnabled( "PlayButton", false );
// SetButtonEnabled( "PauseButton", true );
}
}
}
j脚本挂的如下:
3、结语
播放视频很简单,主要还是看使用HTC交互的功能,在以后的文章中,我将逐渐描述HTCVIVI的各种用法,由于刚开始写博客,可能描述不是很清楚,大家可以加QQ群一块商讨:QQ群319506028;拒绝闲聊,学技术请进。