上一篇我们简单介绍了AVI的MoviePlayer属性面板,感觉上一篇看不看都没所谓,可能你会觉得这些并没神马卵用,只能说每一个人都有自己看代码的方式和爱好吧,像我一般喜欢从属性面板研究起,不说了扯远了。那么我们继续研究AVI讲一下怎么制作UGUI的播放器,其实我研究了3个播放器的插件都有一个共同的特点,他们都是将视频画面转化成了Texture或者是Texture2D的方式进行播放。那么意味着你只要获取到Texture的参数就可以使用NGUI或者是UGUI进行播放,不需要使用GUI的方式来播放视频,这样就可以利用UI组件来直接空画面大小和摆放位置。
我们需要找到这里面的Texture或Texture2D,这里我们需要看回MoviePlayer脚本,细心的查看后会发现并没有这个参数定义。我们再细心点看看你会发现这个脚本是继承一个叫MoviePlayerBase类,如下图所示:
我们去查看这个MoviePlayerBase类你会发现第一个参数就是Texture2D类型的,然后我们看看作者的注释你会惊奇的发现没错就是我们的需要的参数。注释如下图所示:
那么我们就可以利用NGUI或者UGUI进行画面大小的和位置摆放控制等。接下来我们来用UGUI按钮来控制视频的播放,我们需要Play,Pause,Load。界面布局就简单点这里我们用UGUI的RawImage组件来做显示组件,布局如下图所示:
那么我们来添加代码吧,我们先添加一个MoviePlayer脚本放到Canvas后不就不用管了,接下来就没他的事情了,然后我们在Project窗口创建一个Resources文件夹把官方案例的视频进去,因为接下来我们实现动态加载视频。如图所示:
然后我们来添加自己的代码,把脚本放在RawImage组件上,这里我就详细说了直接丢出代码让你们自己去看了,里面还包括一些事触屏或是鼠标控制快进后退的代码,有兴趣的同学可以去自己研究一下,代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class test : MonoBehaviour
{
public MoviePlayer moviePlayer;
public float movieSpeed = 1.0f;
private RawImage rawImage;
private float movieTime;
private bool isClickLoad = false;
// Use this for initialization
void Start()
{
Init();
}
public void Init()
{
rawImage = this.gameObject.GetComponent<RawImage>();
moviePlayer.play = false;
}
// Update is called once per frame
void Update()
{
UpdateMovie();
}
public void OnClickPlay()
{
moviePlayer.play = true;
}
public void OnClickPause()
{
moviePlayer.play = false;
}
public void OnClickLoad()
{
if (!isClickLoad)
{
Resources.UnloadUnusedAssets();
TextAsset temp = Resources.Load<TextAsset>("Sintel (480p mjpeg, 2ch24khz alaw).avi");
if (temp == null)
{
Debug.Log("Vodie:null!!");
}
moviePlayer.source = temp;
moviePlayer.Reload();
moviePlayer.videoTime = 0.0f;
moviePlayer.videoFrame = 0;
isClickLoad = true;<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
}
}
public void UpdateMovie()
{
rawImage.texture = moviePlayer.framebuffer;
#if UNITY_IPHONE || UNITY_ANDROID
if (EventSystem.current.IsPointerOverGameObject() && EventSystem.current.currentSelectedGameObject == null)
{
if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
{
OnClickPause();
movieTime = moviePlayer.videoTime;
}
if (Input.touchCount > 0 &&
(Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(0).phase == TouchPhase.Stationary))
{
if (Input.GetAxis("Mouse X") != 0)
movieTime = movieTime + Input.GetAxis("Mouse X") * movieSpeed;
if (movieTime < 0)
movieTime = 0;
moviePlayer.videoTime = movieTime;
}
}
#elif UNITY_STANDALONE_WIN
if (EventSystem.current.IsPointerOverGameObject() && EventSystem.current.currentSelectedGameObject == null)
{
if (Input.GetMouseButtonDown(0))
{
OnClickPause();
movieTime = moviePlayer.videoTime;
}
if (Input.GetMouseButton(0))
{
if (Input.GetAxis("Mouse X") != 0)
movieTime = movieTime + Input.GetAxis("Mouse X") * movieSpeed;
if (movieTime < 0)
movieTime = 0;
moviePlayer.videoTime = movieTime;
}
}
#endif
}
}
然后我们分别把OnClickPlay,OnClickPause,OnClickLoad分别设置到刚刚弄好的按钮上,然后运行开看看效果吧!下图为我们的运行效果图:
你可以试试点住鼠标左键然后左右拖动一下,视频可以正常的快进和倒退。你也可以发布到安卓和iOS平台上进行测试一下。明天或者后天我会把最后的一个视频转化格式方法写出来的,如果你天真的以为是用AVI格式的视频再后面添加bytes那就大错特错了,这个插件说真的还真不错,如果没有那个鸡肋的视频转化方式或许会普及使用吧。详细的情况我们在第三篇会讲到得了。
----Begonia