本次来聊一下如何在Unity中实现360全景视频的播放
Unity5.6版本中添加了一个新的组件--VideoPlayer,可以用这个组件来实现360全景视频.
资源需求:
一部360角度拍摄的视频短片,Unity版本要求5.6及以上
实现步骤:
1 将视频资源导入Unity工程中
2 在场景中创建一个Unity内建Sphere,将其Transfor属性Reset一下;
3 并创建一个新的材质,将材质的shader改成Particles /Alpha Blended,并将该材质赋予Sphere;
4 为Sphere添加VideoPlayer组件,并将导入的视频资源填充至VideoPlayer的VideoClip属性槽中,同时勾选Playe On Awake,默认该属性为已勾选;
5 将场景中摄像机的Transform组件Reset一下,此时摄像机将处于Sphere的中心,为摄像机添加简单的C#脚本,控制摄像机可以随着鼠标的移动而旋转视角,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 控制摄像机跟随鼠标移动而旋转视角
public class MoveCamera : MonoBehaviour
{
float x, y = 0;
// Use this for initialization
void Start()
{
Cursor.lockState = CursorLockMode.Locked;
}
// Update is called once per frame
void Update()
{
x += Input.GetAxis("Mouse X");
y += Input.GetAxis("Mouse Y");
transform.rotation = Quaternion.Euler(-y,x,0);
}
}
完成这一步,点击播放按钮,即可Unity中实现360视频的播放.效果如下
该视频播放的是驾驶一个机器人战斗的场景,细心的朋友会发现一个问题,那就是视频的影像是反的,这一点只需要将Sphere中Scale的x改为负值即可解决
修改后对比文字效果即可知道显示为正常了
更细心的朋友还会发现,当将摄像机的视角旋转至头顶时,会发现头顶的视频接合处很不自然,已产生变形
这是由于Unity内建Sphere的uv分布不均匀的问题,这里我将Mesh更换成了AVPro插件OctahedronSphere中的,有兴趣的朋友可以更深入了解下这两者的区别所在,本文只涉及使用
更换Mesh后的效果
至此,便已实现了360视频在Unity中播放的功能,该功能的演示在Unit2016大会上官方有做过演示,不过不同的是,官方所采用的球的材质是通过使用了另外编写了一个翻转法线的shader来实现的,这里也附上该shader的代码
Shader "Flipping Normals" {
Properties{
_MainTex("Albedo (RGB)", 2D) = "white" {}
}
SubShader{
Tags { "RenderType" = "Opaque" }
Cull off
CGPROGRAM
#pragma surface surf Lambert vertex:vert
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
float4 color:COLOR;
};
void vert(inout appdata_full v) {
v.normal.xyz = v.normal * -1;
}
void surf(Input IN, inout SurfaceOutput o) {
fixed3 result = tex2D(_MainTex,IN.uv_MainTex);
o.Albedo = result.rgb;
o.Alpha = 1;
}
ENDCG
}
FallBack "Diffuse"
}
将球的材质替换为这个shader所创建的材质也可以同样实现360视频播放的功能,Sphere在Scale的x上也需要设置成负数
下一次将为大家分享Unit208大会上官方介绍的使用全景图片来优化游戏场景的方法
(PHP开发、web前端、UI设计、VR开发专业培训机构--V客IT学院版权所有,转载请注明出处,谢谢合作!)