如何动态加载sprite图片到sprite

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
在目录的资源文件下中,怎么加载一个2D的图片sprite 。我创建的是2D工程,图片载入后自动变成了sprite,请问怎么在脚本中加载它,并且在视图中显示出来
视图显示直接拖进去就行的样子,在scene编辑界面
程序控制的找了个例子
using UnityE
using UnityE
public Material defaultM //prefab material set already
IEnumerator Start()
string path = "file://C:\Users\i5\Documents\My2DProject\Assets\oranges.png";
WWW www = new WWW(path);
SpriteRenderer renderer = gameObject.GetComponent();
Sprite sprite = new Sprite();
sprite = Sprite.Create(, new Rect(0, 0, 170, 170),new Vector2(0, 0),100.0f);
renderer.sprite =
renderer.material =
看的话就直接拖进scene界面吧
using UnityE
using UnityE
public Material defaultM //prefab material set already
IEnumerator Start()
string path = "file://C:\Users\i5\Documents\My2DProject\Assets\oranges.png";
WWW www = new WWW(path);
SpriteRenderer renderer = gameObject.GetComponent();
Sprite sprite = new Sprite();
sprite = Sprite.Create(, new Rect(0, 0, 170, 170),new Vector2(0, 0),100.0f);
renderer.sprite =
renderer.material =
using UnityE
using UnityE
public Material defaultM //prefab material set already
IEnumerator Start()
string path = "file://C:\Users\i5\Documents\My2DProject\Assets\oranges.png";
WWW www = new WWW(path);
SpriteRenderer renderer = gameObject.GetComponent();
Sprite sprite = new Sprite();
sprite = Sprite.Create(, new Rect(0, 0, 170, 170),new Vector2(0, 0),100.0f);
renderer.sprite =
renderer.material =
呃 没看懂{:100:}
要回复问题请先或
[url=http://onesmoke.net/]buy duty free cigarettes Marlboro[/url]
浏览: 1362
关注: 0 人u3D中怎么用代码取得图集里的Sprite?_百度知道
u3D中怎么用代码取得图集里的Sprite?
就是建立一个图集,用C#脚本取得图集里的Sprite,然后控制
我有更好的答案
兄弟,其实你的意思应该是从图片集中获取某一张图片吧,再将这个图片添加给Sprite是吧,这个是可以的UISprite sprite = gameObject.GetComponent&UISprite&();sprite.spriteName = &XXX&;这样就可以动态控制sprite的背景了
采纳率:76%
为您推荐:
其他类似问题
您可能关注的内容
sprite的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。3467人阅读
unity editor(16)
原文链接:
  这几天做项目时,意识到要用到大量的UI素材,图片资源导入Unity时,其Texture Type属性默认为Texture,而UGUI系统需要的图片素材是Sprite类型,显然当有新的图片资源导入工程时要不断地修改类型再点个Apply按钮,相对来说还是比较麻烦的,怎样才能导入图片后直接设置图片类型为Sprite类型呢?
  Edit-&Project Settings-&Editor,将Default Behavior Mode设置成2D模式,这样拖入工程的图片会自动变换为Sprite类型。
  方案一是不是跑题了哈哈哈哈。这的确是个可行的办法,尤其是只需要用到UGUI系统或者做2D产品的时候,直接将工程设置2D模式是最简单的办法。but。。。那么多类型呢,怎么可能只用到Sprite类型呢?显然上述的设置方法不够通用,甚至在做非纯2D项目时,来回切换编辑器模式显然很烦。那咋整?是时候写个编辑器脚本了!
  查了下相关API,发现了AssetPostprocessor类,官方API给出的解释由于亦泽英文太渣也没能太好的翻译,不过从大致意思和实际使用来看,这个类用于在资源导入之前与导入之后处理资源,(这里理解的可能不到位,也是第一次使用该类,如果偏差过大请留言或私信批评指正)该类有很多Message方法,关于图片资源处理里有如下两个方法:
AssetPostprocessor.OnPostprocessTexture(Texture2D)
AssetPostprocessor.OnPreprocessTexture()1212
  针对于本案例来说,不管用哪个方法都能实现同样的效果,但为了区分两个方法,亦泽还是尝试去理解API给出的说明和案例。大致区分是这样的:
  OnPostprocessTexture方法有Texture参数,其用来获取导入图片资源,可对图片属性进行处理,例如像素,色彩之类的处理,它执行在导入过程中(如果没理解错的话哈哈哈);
  OnPreprocessTexture方法没有参数,它用来处理图片在Unity被管理的属性,比如图片要在Unity当中要应用的Texture类型、Sprite类型,改变这样的类型其实没对图片本身属性做任何修改,只是底层用一些我们看不到的代码对资源进行了包装和处理,使其在Unity中显示为正确的样式(png图片只有改成Sprite类型才能正确的应用透明通道)它执行在资源导入之前,即它没法获取到资源,只是先把资源属性设置好,等图片来了直接给图片套上就好。
实现代码如下:
using UnityE
using UnityE
using UnityEngine.UI;
using System.C
public class TranserToSprite : AssetPostprocessor {
void OnPreprocessTexture()
if (assetImporter.assetPath.Contains("@sprite"))
TextureImporter texImpoter = assetImporter as TextureI
texImpoter.textureType = TextureImporterType.S
}123456789101112131415161718192021123456789101112131415161718192021
  对没找到名称属性和可以直接应用路径属性做如下猜想:
  1、没找到图片属性正好契合了对OnPreprocessTexture方法执行在导入资源之前的解读;
  2、那是如何获取资源路径的呢?猜想是当有资源要导入时,根据用户拖拽和资源名称,预先生成一个唯一路径,如果存在相同路径编辑器会为资源更改名称(这个倒是真的),这应该是导入资源时最先触发的事件,然后是OnPreprocessTexture方法,然后是OnPostprocessTexture方法。
  都是猜想,也不知道对不对,等之后有时间会好好研究一下。
【参考资料】
最后说一点:
对于本人的项目,由于没有统一的命名规则,所有要把“@sprite”修改为“.png”。
这样在导入的时候,就会自动的把图片修改为unity的sprite了
17年4月28日更改,增加两行代码,用来设置sprite的属性:
texImporter.textureFormat = TextureImporterFormat.AutomaticT
texImporter.maxTextureSize = 256;怎样从资源里加载一个图集中的一个sprite_百度知道
怎样从资源里加载一个图集中的一个sprite
我有更好的答案
Cocos Creator 有一套统一的资源管理机制 ,在本篇教程,我们将介绍资源的分类如何在 属性检查器 里设置资源动态加载 Asset动态加载 Raw Asset资源的分类目前的资源分成两种,一种叫做 Asset,一种叫做 Raw Asset。AssetCreator 提供了名为 &Asset& 的资源类型,cc.SpriteFrame, cc.AnimationClip, cc.Prefab 等资源都属于 Asset。Asset 的加载是统一并且自动化的,相互依赖的 Asset 能够被自动预加载。例如,当引擎在加载场景时,会先自动加载场景关联到的资源,这些资源如果再关联其它资源,其它也会被先被加载,等加载全部完成后,场景加载才会结束。因此只要你拿到了一个 Asset 对象,这个对象一定是已经加载结束的,可以直接通过对象上的属性访问到资源的所有数据。当你要在引擎中使用这些资源,引擎的 API 接收的都必须是一个加载好的 Asset 对象。脚本中可以这样定义一个 Asset 属性:// NewScript.jscc.Class({extends: cc.Component,properties: {spriteFrame: {default: null,type: cc.SpriteFrame},}});Raw Asset为了兼容 Cocos2d 的一些既有 API,我们把保留原始资源文件扩展名资源叫做 &Raw Asset&。图片(cc.Texture2D),声音(cc.AudioClip),粒子(cc.ParticleAsset)等资源都是 Raw Asset。Raw Asset 在脚本里由一个 url 字符串来表示,当你要在引擎中使用 Raw Asset,只要把 url 传给引擎的 API,引擎内部会自动加载这个 url 对应的资源。当你在脚本里声明一个类型是 cc.Texture2D 的 Raw Asset,一开始可能会想这样定义:cc.Class({extends: cc.Component,properties: {textureURL: {default: null,type: cc.Texture2D}}});这样写的问题在于,在代码中 textureURL 实际上是一个字符串,而不是 cc.Texture2D 的实例。为了不混淆 type 的语义,在 CCClass 中声明 Raw Asset 的属性时,要用 url: cc.Texture2D 而不是 type: cc.Texture2D。cc.Class({extends: cc.Component,properties: {textureURL: {default: &&,url: cc.Texture2D}}});如何在属性检查器里设置资源不论是 Asset 还是 Raw Asset,只要在脚本中定义好类型,就能直接在 属性检查器 很方便地设置资源。假设我们有这样一个组件:// NewScript.jscc.Class({extends: cc.Component,properties: {textureURL: {default: &&,url: cc.Texture2D},spriteFrame: {default: null,type: cc.SpriteFrame},}});将它添加到场景后,属性检查器 里是这样的:asset-in-properties-null接下来我们从 资源管理器 里面分别将一张贴图和一个 SpriteFrame 拖到 属性检查器 的对应属性中:asset-in-properties-dnd结果如下:asset-in-properties-dnd这样就能在脚本里直接拿到设置好的资源:onLoad: function () {var spriteFrame = this.spriteFvar textureURL = this.textureURL;spriteFrame.setTexture(textureURL);}在 属性检查器 里设置资源虽然很直观,但资源只能在场景里预先设好,没办法动态切换。如果需要动态切换,你需要看看下面的内容。动态加载所有需要通过脚本动态加载的资源,都必须放置在 resources 文件夹或它的子文件夹下。resources 需要在 assets 文件夹中手工创建,并且必须位于 assets 的根目录,就像这样:asset-in-properties-null这里的 image/image, prefab, anim, font 都是常见的 Asset,而 image, audio 则是常见的 Raw Asset。resources 文件夹里面的资源,可以关联依赖到文件夹外部的其它资源,同样也可以被外部场景或资源引用到。项目构建时,除了已在 构建发布 面板勾选的场景外,resources 文件夹里面的所有资源,连同它们关联依赖的 resources 文件夹外部的资源,都会被导出。所以如果一份资源不需要由脚本直接动态加载,那么不用放在 resources 文件夹里。动态加载 AssetCreator 提供了 cc.loader.loadRes 这个 API 来专门加载那些位于 resources 目录下的 Asset。和 cc.loader.load 不同的是,loadRes 一次只能加载单个 Asset。调用时,你只要传入相对 resources 的路径即可,并且路径的结尾处不能包含文件扩展名。// 加载 Prefabcc.loader.loadRes(&test assets/prefab&, function (err, prefab) {var newNode = cc.instantiate(prefab);cc.director.getScene().addChild(newNode);});// 加载 AnimationClipcc.loader.loadRes(&test assets/anim&, function (err, clip) {myNode.getComponent(cc.Animation).addClip(clip, &anim&);});// 加载 SpriteAtlas(图集),并且获取其中的一个 SpriteFrame// 注意 atlas 资源文件(plist)通常会和一个同名的图片文件(png)放在一个目录下, 所以需要在第二个参数指定资源类型cc.loader.loadRes(&test assets/sheep&, cc.SpriteAtlas, function (err, atlas) {var frame = atlas.getSpriteFrame('sheep_down_0');sprite.spriteFrame =});加载独立的 SpriteFrame图片设置为 Sprite 后,将会在资源管理器中生成一个对应的 SpriteFrame。但如果直接加载 test assets/image,得到的类型将会是 cc.Texture2D。你必须指定第二个参数为资源的类型,才能加载到图片生成的 cc.SpriteFrame:// 加载 SpriteFramecc.loader.loadRes(&test assets/image&, cc.SpriteFrame, function (err, spriteFrame) {myNode.getComponent(cc.Sprite).spriteFrame = spriteF});如果指定了类型参数,就会在路径下查找指定类型的资源。当你在同一个路径下同时包含了多个重名资源(例如同时包含 player.clip 和 player.psd),或者需要获取“子资源”(例如获取 Texture2D 生成的 SpriteFrame),就需要声明类型。资源释放loadRes 加载进来的单个资源如果需要释放,可以调用 cc.loader.releaseRes,releaseRes 只能传入一个和 loadRes 相同的路径,不支持类型参数。cc.loader.releaseRes(&test assets/anim&);此外,你也可以使用 cc.loader.releaseAsset 来释放一个具体的 Asset 实例。cc.loader.releaseAsset(spriteFrame);动态加载 Raw AssetRaw Asset 可以直接使用 url 从远程服务器上加载,也可以从项目中动态加载。对远程加载而言,原先 Cocos2d 的加载方式不变,使用 cc.loader.load 即可。对项目里的 Raw Asset,加载方式和 Asset 一样:// 加载 Texture,不需要后缀名cc.loader.loadRes(&test assets/image&, function (err, texture) {...});cc.url.rawRaw Asset 加载成功后,如果需要传给一些 url 形式的 API,还是需要给出完整路径才行。你需要用 cc.url.raw 进行一次 url 的转换:// 原 url 会报错!文件找不到var texture = cc.textureCache.addImage(&resources/test assets/image.png&);// 用 cc.url.raw,此时需要声明 resources 目录和文件后缀名var realUrl = cc.url.raw(&resources/test assets/image.png&);var texture = cc.textureCache.addImage(realUrl);资源批量加载cc.loader.loadResAll 可以加载相同路径下的多个资源:// 加载 test assets 目录下所有资源cc.loader.loadResAll(&test assets&, function (err, assets) {// ...});// 加载 sheep.plist 图集中的所有 SpriteFramecc.loader.loadResAll(&test assets/sheep&, cc.SpriteFrame, function (err, assets) {// assets 是一个 SpriteFrame 数组,已经包含了图集中的所有 SpriteFrame。// 而 loadRes('test assets/sheep', cc.SpriteAtlas, function (err, atlas) {...}) 获得的则是整个 SpriteAtlas 对象。});
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 动态加载sprite 的文章

 

随机推荐