草庐IT

Unity视频播放以及控制按钮的交互

南城老炮 2023-04-13 原文

素材的导入:

需要的模型(主要是电视机或者电脑的模型来充当一个屏幕效果)可以从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拖入视频资源。

操作结果如下图:

制作UI:

首先我们要明确需要什么组件,我实现的是可以通过代码实现控制视频播放、暂停、关闭、还有一个滑动条来拖动视频,还需要一个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游戏》

 

有关Unity视频播放以及控制按钮的交互的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  5. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  6. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  9. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  10. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

随机推荐