Unity使用脚本进行批量动态加载贴图

先描述一下我正在做的这个项目,是跑酷类音游。

那么跑酷类音游在绘制跑道上的时候,就要考虑不同的砖块显示问题。假设我有了一个节奏列表,那么我们怎么将不同的贴图贴到不同的砖块上去呢?

我花了好几个小时才搞清楚里面的门路,且听我慢慢道来。

首先我们建立一个地图,在上面新建一个Empty Object,将所有的Road砖块全部划分到这个分组里。

效果图如下:

我们得到了一些预制块,接下来我们要将其染上色。

首先的问题是,我们怎么遍历这些砖块呢?很简单,用Tag。我们将所有的砖块打上一个特别的tag,“road”。

接下来我们寻找一个GameObject,在它的Start函数里添加我们需要的东西。满足需求的Object可以是环境光,也可以是任意一个空项目。

我新建了一个Texture Render的C#脚本,接下来我们使用这个函数,获取所有的砖块:

var roads = GameObject.FindGameObjectsWithTag("road");

接下来这个roads变量就是一个list,其成员便是所有的Tag为road的GameObject。而且更巧的是,它是按照顺序寻找的,这样我们就可以方便地从头到尾按顺序遍历所有砖块。

有关Find各种变种函数的问题,可以移步Document进行查看。

下一步是找出Texture到底是在哪个属性里。我一开始也不明白到底贴图应该是赋什么值好,最后得出结论,应该是赋给这个属性:

roads[i].GetComponent<Renderer>().material.mainTexture

老版本的Unity,可能直接使用

renderer.material.mainTexture

但是这个用法已经过时了。

第三步,我们怎么正确将贴图加载进来。

我翻阅了很多资料,最后发现Resource.Load函数可以胜任这个工作。

首先我们将需要的资源文件放到根目录的Assets/Resources文件夹里。如果没有的话需要创建新文件夹。为什么呢?因为Load()函数的Path是相对地址,而它是从Resource目录找起的。请务必记住这个坑。

现在我在里面放了一些素材,之后我们这么调用。

Resources.Load("rockA") as Texture2D;

as起到了类型转换的作用。我们也可以这么写。

(Texture2D)Resources.Load("rockA");

接下来将加载的资源赋给Object的属性。

roads[i].GetComponent<Renderer>().material.mainTexture = Resources.Load("rockA") as Texture2D;

接下来,我们写一个遍历就可以了。

var roads = GameObject.FindGameObjectsWithTag("road");
        for (int i = 0; i < roads.Length; i++)
        {
            roads[i].GetComponent<Renderer>().material.mainTexture = Resources.Load("grassB") as Texture2D;
        }

这里只使用了一个素材,最后渲染出来的效果是这样的:

这样我们就做到了动态加载贴图。

我之前提到过,这是一个音乐游戏。我通过自己的节奏算法,将节奏以list形式存储。

那么我只需要再写一个转换算法,将对应的砖块换成特别的砖块,这样就可以很方便地加载各种各样的音乐。

P.S. Debug.Log()真的很好用,在Unity中,这个功能基本替代了断点功能和变量监视。

原文地址:https://www.cnblogs.com/ldzhangyx/p/8642695.html

时间: 2024-08-06 07:29:36

Unity使用脚本进行批量动态加载贴图的相关文章

Unity学习笔记13——代码动态加载Prefab预设体

在进行一些功能开发的时候,我们常常将一些能够复用的对象制作成.prefab的预设物体,然后将预设体存放到Resources目录之下,使用时再动态加载到场景中并进行实例化.例如:子弹.特效甚至音频等,都能制作成预设体. 一.预设动态加载到场景: 一个预设体要能够通过代码控制在场景中进行显示,需要三个步骤,这里我们以动态加载怪物血条为例子分析一个常见的误区: 1.预设体资源加载: //加载预设体资源 GameObject hp_bar = (GameObject)Resources.Load("Pr

(转)Unity 导出XML配置文件,动态加载场景

参考:http://www.xuanyusong.com/archives/1919 http://www.omuying.com/article/48.aspx 主要功能: 1.导出场景的配置文件 2.导出当前场景中资源的AssetBundle 3.客户端从服务器获取配置文件 4.解析配置文件,并根据配置文件下载AssetBundle 5.实例化并还原场景 1.场景设置:将需要导出的场景资源设置为预设 2.将场景配置导出为XML文件 [code]csharpcode: using UnityE

[转]动态加载JS脚本

动态加载JS脚本 要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javascript"> document.write("<script src='test.js'><\/script>"); </script> 2.动态改变已有script的src属性 <script src='' id="s1"></script&

Unity3D动态加载外部资源

最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了. 详细说一下细节概念:AssetBundle运行时加载:来自

unity3d动态加载dll的API以及限制

Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码更新,不过实际上,在unity里要用上动态加载dll是有很多限制的(不了解的话就是坑). 限制1:在Android手机里动态加载dll不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte

Unity3D的坑系列:动态加载dll

Unity3D的坑系列:动态加载dll 我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码更新,不过实际上,在unity里要用上动态加载dll是有很多限制的(不了解的话就是坑). 限制1:在Android手机里动态加载dll不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte[] raw

unity 3D里有两种动态加载机制

unity 3D里有两种动态加载机制: 一是Resources.Load: 一是通过AssetBundle: 其实两者本质上没有什么区别.Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的.其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了. 1.    AssetBundles是什么? 在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等

动态加载脚本和样式

当网站需求变大,脚本的加载就很关键了. 动态加载能减少不必要的脚本加载,提高js执行速度. 首先,动态加载JS脚本文件demo.js.代码如下: window.unload=function(){ var flag=true; if(flag){ var script=ducument.createElement('script'); script.type='text/javascrpt'; script.src='demo.js'; docement.getElementsByTagName

使用jQuery动态加载js脚本文件的方法

动态加载Javascript是一项非常强大且有用的技术.这方面的主题在网上已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js 它们很强大,但有时候也会得不偿失.如果你使用的是jQuery,它里面有一个内置的方法可以用来加载单个js文件.当你需要延迟加载一些js插件或其它类型的文件时,可以使用这个方法.下面就介绍一下如何使用它! 一.jQuery getScript()方法加载JavaScript jQuery内置了一个方法可以加载单一的js文件:当加载完成后你可以