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 = ; i < roads.Length; i++)
- {
- roads[i].GetComponent<Renderer>().material.mainTexture = Resources.Load("grassB") as Texture2D;
- }
这里只使用了一个素材,最后渲染出来的效果是这样的:

这样我们就做到了动态加载贴图。
我之前提到过,这是一个音乐游戏。我通过自己的节奏算法,将节奏以list形式存储。
那么我只需要再写一个转换算法,将对应的砖块换成特别的砖块,这样就可以很方便地加载各种各样的音乐。
P.S. Debug.Log()真的很好用,在Unity中,这个功能基本替代了断点功能和变量监视。
Unity使用脚本进行批量动态加载贴图的更多相关文章
- (转)Unity 导出XML配置文件,动态加载场景
参考:http://www.xuanyusong.com/archives/1919 http://www.omuying.com/article/48.aspx 主要功能: 1.导出场景的配置文 ...
- Unity动态加载和内存管理(三合一)
原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...
- Unity3D动态加载外部资源
最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...
- unity3d动态加载dll的API以及限制
Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...
- Unity3D的坑系列:动态加载dll
我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码 ...
- 动态加载js和css
开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...
- Echarts使用及动态加载图表数据 折线图X轴数据动态加载
Echarts简介 echarts,缩写来自Enterprise Charts,商业级数据图表,一个纯JavaScript的图表库,来自百度...我想应该够简洁了 使用Echarts 目前,就官网的文 ...
- Unity学习笔记(5):动态加载Prefab
第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...
- unity动态加载(翻译) .
AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...
随机推荐
- 严格次小生成树(Bzoj1977:[Beijing2010组队]次小生成树)
非严格次小生成树 很简单,先做最小生成树 然后枚举没加入的边加入,替换掉这个环内最大的边 最后取\(min\) 严格次小生成树 还是一样的 可以考虑维护一个严格次大值 最大值和枚举的边相同就替换次大值 ...
- shell 脚本下执行Mongodb命令
最近项目中搭建了两台mongodb的服务器,由于服务器只有两台的情况下,目前只是搭建了主从模式架构(官方目前并不推荐主从模式),缺点就是故障转移不变等等原因,而是推荐副本集模式(这里就不多说了)... ...
- Go实现短url项目
首先说一下这种业务的应用场景: 把一个长url转换为一个短url网址 主要用于微博,二维码,等有字数限制的场景 主要实现的功能分析: 把长url的地址转换为短url地址 通过短url获取对应的原始长u ...
- Django---视图
全过程:用户填写相关数据,提交相关请求,链接到对应的视图上,在此视图上(有用户传过来的数据[就是视图要处理的数据],在视图里面对数据进行业务处理,在数据库中crub数据,然后把对应的界面和界面显示需要 ...
- 基于etcd的Rabbitmq队列订阅负载均衡
go-qb Load balancer for rabbitmq queue subscribing Feature Rabbitmq queue subscription load balancin ...
- if语句2017-03-17
1.If语句: if(判断条件){ 判断为true的时候执行的语句 } else{ 判断为false的时候执行的语句 } 2.If else语句: if(判断条件){ 判断为true的时 ...
- 用three.js创建一个简易的天空盒
本文创建的天空盒是用六张图片来创建的.笔者会论述两种方法来创建,都是最简单基本的方法,不涉及着色器的使用.一种是创建一个盒子,然后将图片作为盒子6个面的纹理贴上来创建.另一种则是简单的将纹理作为场景的 ...
- 笔记:Jersey REST API 设计
REST 统一接口 REST 使用 HTTP 协议的通用方法作为统一接口的标准词汇,REST 服务所提供的方法信息都在 HTTP 方法里,每一种HTTP请求方法都可以从安全性和幂等性两方面考虑,这对正 ...
- new Image的API
- 研华ADAM 4000系列型号枚举值
public enum Adam4000Type { Non = 0, Adam4011 = 4011, Adam4012 = 4012, ...