unity UGUI实现类似NGUI切换Sprite的方式
很多都是使用NGUI的习惯,因为在NGUI中所有图片都打包在一个图集中,通过更改SpriteName就可以更改图片,so,为了方便调用UGUI的sprite,我们也同样需要为其创建一个asset文件。
其实这个功能相当软肋,既然想到写,还是写出来吧,偶尔用于切换图片或者动态加载之类的还是有点意思
首先准备一张图片
为我们准备创建的asset文件写一个脚本,他需要继承ScriptableObject,同时我们需要存储一些其他信息,所以需要一个信息脚本,这里需要将信息转为一个资源文件,所以需要使用[Serializable],大概目的就是序列化使其成为两者都能识别的信息,网上查了一个序列化的解释:[Serializable]在C#中的作用-NET
中的对象序列化
SpriteAsset脚本:
using UnityEngine;
using System.Collections.Generic; public class UGUISpriteAsset : ScriptableObject
{
/// <summary>
/// 图片资源
/// </summary>
public Texture texSource;
/// <summary>
/// 所有sprite信息 SpriteAssetInfor类为具体的信息类
/// </summary>
public List<SpriteAssetInfor> listSpriteAssetInfor;
}
sprite信息脚本:
using UnityEngine;
using System; [Serializable]
public class SpriteAssetInfor
{
/// <summary>
/// ID
/// </summary>
public int ID;
/// <summary>
/// 名称
/// </summary>
public string name;
/// <summary>
/// 中心点
/// </summary>
public Vector2 pivot;
/// <summary>
///坐标&宽高
/// </summary>
public Rect rect;
/// <summary>
/// 精灵
/// </summary>
public Sprite sprite; }
3.写一个编辑类,用来创建asset文件,在文件夹中,选中第一步的资源图片,右键然后点击"Create/UGUI Sprite Asset",即可以创建一个同图片同名的.asset文件,UGUICreateSpriteAsset此编辑类需要放在Editor文件夹中
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;
using System.Collections.Generic; public static class UGUICreateSpriteAsset
{
[MenuItem("Assets/Create/UGUI Sprite Asset", false, 10)]
static void main()
{
Object target = Selection.activeObject;
if (target == null || target.GetType() != typeof(Texture2D))
return; Texture2D sourceTex = target as Texture2D;
//整体路径
string filePathWithName = AssetDatabase.GetAssetPath(sourceTex);
//带后缀的文件名
string fileNameWithExtension = Path.GetFileName(filePathWithName);
//不带后缀的文件名
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePathWithName);
//不带文件名的路径
string filePath = filePathWithName.Replace(fileNameWithExtension, ""); UGUISpriteAsset spriteAsset = AssetDatabase.LoadAssetAtPath(filePath + fileNameWithoutExtension + ".asset", typeof(UGUISpriteAsset)) as UGUISpriteAsset;
bool isNewAsset = spriteAsset == null ? true : false;
if (isNewAsset)
{
spriteAsset = ScriptableObject.CreateInstance<UGUISpriteAsset>();
spriteAsset.texSource = sourceTex;
spriteAsset.listSpriteAssetInfor = GetSpritesInfor(sourceTex);
AssetDatabase.CreateAsset(spriteAsset, filePath + fileNameWithoutExtension + ".asset");
}
} public static List<SpriteAssetInfor> GetSpritesInfor(Texture2D tex)
{
List<SpriteAssetInfor> m_sprites = new List<SpriteAssetInfor>(); string filePath = UnityEditor.AssetDatabase.GetAssetPath(tex); Object[] objects = UnityEditor.AssetDatabase.LoadAllAssetsAtPath(filePath); for (int i = 0; i < objects.Length; i++)
{
if (objects[i].GetType() == typeof(Sprite))
{
SpriteAssetInfor temp = new SpriteAssetInfor();
Sprite sprite = objects[i] as Sprite;
temp.ID = i;
temp.name = sprite.name;
temp.pivot = sprite.pivot;
temp.rect = sprite.rect;
temp.sprite = sprite;
m_sprites.Add(temp);
}
}
return m_sprites;
} }
4.选择.asset文件,你就会发现上面就会有一些你想要存储的信息,但是并不是很美观(其实我改过之后还是很一般),这里我们可以通过一个[CustomEditor]来自定义属性面板,他需要继承Editor,并在类名上声明他为哪个类自定义属性表,需要使用OnInspectorGUI函数来绘制,使用方法与OnGUI一样,注意关键字override,同样UGUISpriteAssetEditor类也需要放在Editor文件夹中
using UnityEngine;
using UnityEditor;
using System.Collections; [CustomEditor(typeof(UGUISpriteAsset))]
public class UGUISpriteAssetEditor : Editor { UGUISpriteAsset spriteAsset; public void OnEnable()
{
spriteAsset = (UGUISpriteAsset)target;
}
private Vector2 ve2ScorllView;
public override void OnInspectorGUI()
{
ve2ScorllView = GUILayout.BeginScrollView(ve2ScorllView);
GUILayout.Label("UGUI Sprite Asset");
if (spriteAsset.listSpriteAssetInfor == null)
return;
for (int i = 0; i < spriteAsset.listSpriteAssetInfor.Count; i++)
{
GUILayout.Label("\n");
EditorGUILayout.ObjectField("",spriteAsset.listSpriteAssetInfor[i].sprite, typeof(Sprite));
EditorGUILayout.IntField("ID:", spriteAsset.listSpriteAssetInfor[i].ID);
EditorGUILayout.LabelField("name:", spriteAsset.listSpriteAssetInfor[i].name);
EditorGUILayout.Vector2Field("povit:", spriteAsset.listSpriteAssetInfor[i].pivot);
EditorGUILayout.RectField("rect:", spriteAsset.listSpriteAssetInfor[i].rect);
GUILayout.Label("\n");
}
GUILayout.EndScrollView();
} }
5.asset文件:
6.写一个测试脚本,不停的切换图片,后面可以封装一下,通过名称或者ID来索引sprite
using UnityEngine;
using UnityEngine.UI;
using System.Collections; public class ChangeUGUISprite : MonoBehaviour {
public UGUISpriteAsset usa;
private float fTime = 0.0f;
// Update is called once per frame
void Update () {
fTime += Time.deltaTime;
if (fTime >= 0.3f)
{
GetComponent<Image>().sprite = usa.listSpriteAssetInfor[Random.Range(0, usa.listSpriteAssetInfor.Count)].sprite;
fTime = 0.0f;
}
}
}
7.测试结果:
unity UGUI实现类似NGUI切换Sprite的方式的更多相关文章
- Unity UGUI基础之Image
UGUI的Image等价于NGUI的Sprite组件,用于显示图片. 一.Image组件: Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择T ...
- Unity UGUI
超详细的基础教程传送门:(持续更新中) Unity UGUI之Canvas&EventSystem:http://blog.csdn.net/qq992817263/article/detai ...
- Unity UGUI图文混排源码(三) -- 动态表情
这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章 Unity UGUI图文混排源码(二):http://blog.csdn. ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity UGUI图文混排源码(一)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity UGUI实现图文混排
目前在unity实现图文混排的好像都是通过自定义字体然后在文本获取字符的位置,用图片替换掉图片标签,这样对于支持英文来说,并没有什么影响.然后对于中文来说就是一个相当麻烦的事了,毕竟图文混排多用于游戏 ...
- [Unity UGUI序列帧]简单实现序列帧的播放
在使用序列帧之前需要准备好序列帧的图集,打图集的操作参考 [Unity UGUI图集系统]浅谈UGUI图集使用 准备好序列帧图集,序列帧的播放原理就是获取到图集中的所有图片,然后按照设置的速度按个赋值 ...
- Unity iOS混合开发界面切换思路
Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...
- Unity UGUI —— 无限循环List
还记得大学毕业刚工作的时候是做flash的开发,那时候看到别人写的各种各样的UI组件就非常佩服,后来自己也慢慢尝试着写,发现其实也就那么回事.UI的开发其实技术的成分相对来说不算多,但是一个好的UI是 ...
随机推荐
- 启动Docker容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动. 因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器. 新建并 ...
- MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引
mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询 ...
- PGM:部分有向模型之条件随机场与链图模型
http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...
- 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
提示:hash表 #include <iostream> using namespace std; #define N 100 #define RANGE 100 int* getRand ...
- 如何将dtb反编译成dts
点击打开链接 由于device tree会将一个node的信息分布在各个文件里,查看起来很不方便,比如如下例子,ldb在三个文件中都有配置: imx6qdl-sabresd.dtsi: [plain] ...
- 理解 Linux 的硬链接与软链接
Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键盘 ...
- Linux命令—文件目录
(1) shell的使用 <1>检查系统当前运行的shell版本: [root@lab root]# echo $SHELL <2>从当前shell下切换到csh: [r ...
- acm入门搜索-石油数目
题意:给出一个N*M的矩形区域和每个区域的状态--有/没有石油,(定义)如果两个有石油的区域是相邻的(水平.垂直.斜)则认为这是属于同一个oil pocket. 求这块矩形区域一共有多少oilpock ...
- SpringMVC源码分析--容器初始化(五)DispatcherServlet
上一篇博客SpringMVC源码分析--容器初始化(四)FrameworkServlet我们已经了解到了SpringMVC容器的初始化,SpringMVC对容器初始化后会进行一系列的其他属性的初始化操 ...
- hadoop端口使用配置总结(非常好的总结)
转自http://www.aboutyun.com/thread-7513-1-1.html Hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以 ...