赞
踩
需要的模型(主要是电视机或者电脑的模型来充当一个屏幕效果)可以从Unity自带的Asset Store中下载免费的模型,视频资源自己导入。
目前Unity2017.X版本有两种方式播放视频:第一种是视频贴图的方式,第二种方式是Unity5.6以上的版本开始支持的Video Player组件方式。第一种需要插件比较麻烦,我选择的是第二种方法。
Video Player组件方式:
第一步:新建场景,将素材和资源导入场景,新建Plane,这个Plane用来放置视频,在Plane视图中添加Video Player组件,Video Player组件的Video Clip属性选择添加视频剪辑。Unity支持的视频格式有.mov、.mpg、.mpeg、.mp4、.avi、.asf等。
第二步:Video Player组件的“Renderer Model”属性选择“Material Override”选项,确认“Renderer”属性已经默认选择了“Plane”对象。
第三步:此时需要在Plane属性框中增加“Audio Source”组件,并且赋值给Video Player的“Audio Source”属性,这样视频就可以播放同步音频了。
第四步:在Video Player中的Video Clip拖入视频资源。
操作结果如下图:
首先我们要明确需要什么组件,我实现的是可以通过代码实现控制视频播放、暂停、关闭、还有一个滑动条来拖动视频,还需要一个Text来显示电影名字,一个Text显示时间和时间比,所以需要创建三个Button两个Text一个Slider,调整这几个组件的位置。
将场景中不需要移动的物体进行静态烘焙,将不需要移动的物体设置为Static状态,打开Windows——Rendering——Lighting,新建一个New Lighting Settings取消勾选Realtime Lighting——Realtime Global IIIur,接着勾选Backed Global,最后点击左下角Clear Backed Data,然后Generate Lighting。这样烘焙就完成了,这样可以大大减少电脑的运行内存,图示如下:
UI组件和时间显示以及时间转化的代码:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEngine.Video;
-
- public class VideoTimeController : MonoBehaviour
- {
- public Text videoTimeText; //视频的时间Text
- public Text videoNameText; //视频的名字Text
- public Slider videoTimeSlider; //视频的时间Slider
-
- //定义参数获取VideoPlayer和AudioSource组件
- internal VideoPlayer videoPlayer;
- internal AudioSource audioSource;
-
- //当前视频的总时间值和当前播放时间值的参数
- private int currentHour;
- private int currentMinute;
- private int currentSecond;
- private int clipHour;
- private int clipMinute;
- private int clipSecond;
-
- // Start is called before the first frame update
- void Start()
- {
- //获取场景中对应的组件
- videoPlayer = this.GetComponent<VideoPlayer>();
- audioSource = this.GetComponent<AudioSource>();
- videoNameText.text = videoPlayer.clip.name;
- }
-
- // Update is called once per frame
- void Update()
- {
- ShowVideoTime();
- }
-
- private void ShowVideoTime()
- {
- //当前视频总时间
- clipHour = (int)videoPlayer.clip.length / 3600;
- clipMinute = (int)(videoPlayer.clip.length - clipHour * 3600) / 60;
- clipSecond = (int)(videoPlayer.clip.length - clipHour * 3600 - clipMinute * 60);
-
- // 当前的视频播放时间
- currentHour = (int)videoPlayer.time / 3600;
- currentMinute = (int)(videoPlayer.time - currentHour * 3600) / 60;
- currentSecond = (int)(videoPlayer.time - currentHour * 3600 - currentMinute * 60);
-
- // 把当前视频播放的时间显示在 Text 上
- videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2} / {3:D2}:{4:D2}:{5:D2}",
- currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond);
-
- // 把当前视频播放的时间比例赋值到 Slider 上
- videoTimeSlider.value = (float)(videoPlayer.time / videoPlayer.clip.length);
- }
-
- /// <summary>
- /// 当前的 Slider 比例值转换为当前的视频播放时间
- /// </summary>
- private void SetVideoTimeValueChange()
- {
- videoPlayer.time = videoTimeSlider.value * videoPlayer.clip.length;
- audioSource.time = videoTimeSlider.value * audioSource.clip.length;
- }
- }
滑动条滑动代码:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.EventSystems;
-
- /// <summary>
- /// 继承 拖拽接口
- /// </summary>
- public class SliderEvent : MonoBehaviour, IDragHandler
- {
- [SerializeField]
- private VideoTimeController videotimecontroller; // 视频播放的脚本
-
-
- public void OnDrag(PointerEventData eventData)
- {
- SetVideoTimeValueChange();
- }
-
- /// <summary>
- /// 当前的 Slider 比例值转换为当前的视频播放时间
- /// </summary>
- private void SetVideoTimeValueChange()
- {
- //当拖拽进度条时视频和音频都需要跟随着变化
- videotimecontroller.videoPlayer.time = videotimecontroller.videoTimeSlider.value * videotimecontroller.videoPlayer.clip.length;
- videotimecontroller.audioSource.time = videotimecontroller.videoTimeSlider.value * videotimecontroller.audioSource.clip.length;
- }
- }
-
按钮交互事件:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- using UnityEngine.Video;
-
- public class control : MonoBehaviour
- {
- private VideoPlayer videoPlayer;
- private AudioSource audioSource;
- private Plane plane;
-
- void Start()
- {
- //获取VideoPlayer和AudioSource组件
- videoPlayer = this.GetComponent<VideoPlayer>();
- audioSource = this.GetComponent<AudioSource>();
-
-
- }
- void PlayorPause()
- {
- if (videoPlayer.isPlaying==true)
- {
- videoPlayer.Pause();
- audioSource.Pause();
- }
- }
- void PlayorBegin()
- {
- if (videoPlayer.isPlaying==false)
- {
- videoPlayer.Play();
- audioSource.Play();
- }
- }
- void PlayorClose()
- {
- this.gameObject.SetActive(false);
- }
- }
注:以上部分内容引用刘国柱老师《游戏研发系列Unity3D 2D游戏》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。