Unity Assetbundle更新视频文件教程

承接之前讲过的Assetbundle的内容。这次要讲解更新游戏中的CG的视频案例。

开发内容:点击按钮加载视频数据,按鼠标右键播放加载完成的视频。

第一步,新建一个unity的场景。

场景非常简单,只有一个RawImage来播放视频。

Unity之使用Assetbundle更新视频文件_bundle

RawImage播放视频的方法,在Textrue的位置需要一个rendertexture,所以新建一个放到这里。

Unity之使用Assetbundle更新视频文件_ide_02

第二步:在项目新建一个文件夹名叫Resourceshaha。多么接地气的名字~~就要哈哈哈。然后里面放了一些相关脚本和要被播放的视频。

Unity之使用Assetbundle更新视频文件_bundle_03

然后给这个整个文件夹做成assetbundle,命名为reso.assetbundle。如何打包assetbundle之前的文章讲过此处不再赘述。

Unity之使用Assetbundle更新视频文件_ide_04

接下来分析一下思路和代码。上述文件夹里只有两个脚本,一个是加载视频文件的脚本,另一个是播放视频文件的脚本。

首先讲loadmoviesassets脚本,该脚本负责加载reso.assetbundle这个东西。只要加载到这个东西就可以找到里面的视频文件了。如下:

登录后复制

using UnityEngine;using System.Collections;using System.Collections.Generic;public class loadmoviesassets : MonoBehaviour {        public List<Object> goes=new List<Object>();    private string url;    string PathA;    // Use this for initialization    private void Awake()    {        PathA = System.Environment.CurrentDirectory;        //因为测试是使用的本地路径,本地路径的斜杠是“\”所以需要用“/”来代替        if (PathA.Contains("\\"))        {            PathA = PathA.Replace("\\", "/");        }        url = "file://" + PathA + "/AllAssets/reso.assetbundle";        Debug.Log(url);    }    private void OnGUI()    {        Rect rect = new Rect(100f, 100f, 200f, 200f);        if (GUI.Button(rect, "Load"))        {            StartCoroutine(LoadAssetsFun());        }    }    IEnumerator LoadAssetsFun()    {        using (WWW www = new WWW(url))        {            yield return www;            if (www.error != null)            {                print("wrong");            }            else            {                AssetBundle bundle = www.assetBundle;                string[] aa = bundle.GetAllAssetNames();                foreach (string allname in aa)                {                    Debug.Log("物体名字:" + allname);                }                               Object[] obj = bundle.LoadAllAssets();                foreach (Object ass in obj)                {                    Debug.Log(ass.name);                    Object kk = Instantiate(ass)as Object;//                    goes.Add(kk);//把加载过后生成到的物体添加到数组里                }                AssetBundle manifesAB = AssetBundle.LoadFromFile("AllAssets/AllAssets");                AssetBundleManifest manifest = manifesAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");                //GetAllDependencies 获得所有依赖对象                string[] strs = manifest.GetAllDependencies("reso.assetbundle");                //将所有依赖对象加载出来                foreach (var name in strs)                {                    AssetBundle anim = AssetBundle.LoadFromFile("AllAssets/" + name);                    Debug.Log(name.ToString());                    anim.Unload(false);                }                bundle.Unload(false);                manifesAB.Unload(false);            }        }    }    // Update is called once per frame    void Update () {        }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.

注意:上述代码中的路径设置的和unity的asset的目录是同一级。所以制作好的assetbundle位置要放到这个位置。如图;

Unity之使用Assetbundle更新视频文件_ide_05

之后看播放代码playvideo。如下:

登录后复制

using UnityEngine;using System.Collections;using System.IO;using UnityEngine.UI;using System.Collections.Generic;public class playvideo : MonoBehaviour{    private AudioSource audio;    private MovieTexture movieTexture;       void Start()    {    }    /// <summary>    /// 播放    /// </summary>    public void OnPlayerVideo()    {        //从加载到的数组里查找名字叫做HeroVideo(Clone)的物体,这个物体就是视频        foreach (Object go in this.GetComponent<loadmoviesassets>().goes)        {            if (go.name == "HeroVideo(Clone)")            {                movieTexture = go as MovieTexture;                Debug.Log("播放啦啦啦");                //播放视频                if (!movieTexture.isPlaying)                {                    this.GetComponent<RawImage>().texture = movieTexture;                    movieTexture.Play();                }            }            else            {                Debug.Log("没有视频");            }        }        //加载视频的声音并播放        audio = this.GetComponent<AudioSource>();        audio.clip = movieTexture.audioClip;        audio.Play();    }    // Update is called once per frame    void Update()    {        //点击右键播放        if (Input.GetMouseButtonDown(1))        {            OnPlayerVideo();        }    }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.

上述代码中是使用视频的名字来作为条件进行判断是否为视频文件的。这个视频的名字是自己定义的以后就不会改变了,即使视频内容改变了,视频文件的名字也必须叫做HeroVideo(Clone)这个名字。因为加载出来的物体都有(Clone)。

最后我们运行测试:

当运行的时候首先会有一个GUI制作的按钮,点击该按钮进行加载东西,如图:

Unity之使用Assetbundle更新视频文件_bundle_06

这时候会看到rawimage上的loadmoviesassets的脚本里加载到了reso.assetbundle里的所有文件,所有的后面都加了一个(Clone)。

Unity之使用Assetbundle更新视频文件_bundle_07

最后点击鼠标右键进行播放,如图:

Unity之使用Assetbundle更新视频文件_ide_08




免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空