返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >解决在Unity中使用FairyGUI遇到的坑
  • 642
分享到

解决在Unity中使用FairyGUI遇到的坑

2024-04-02 19:04:59 642人浏览 安东尼
摘要

首先!首先!首先! 首先,我们由于历史问题,项目用的UI编辑器不是大众使用的GUI或者NGUI, 而是使用不知道算不算小众的FairyGUI,这个UI系统使用挺方便的,也提供了很多U

首先!首先!首先!

首先,我们由于历史问题,项目用的UI编辑器不是大众使用的GUI或者NGUI, 而是使用不知道算不算小众的FairyGUI,这个UI系统使用挺方便的,也提供了很多UI编码的案例,至少从直接使用来说方便了不少。

但是!但是!但是!

可能用到这个UI编辑器的不是那么多,项目上遇到的问题在网上百度出来的结果很少,基本自己断点查找bug。

最后!最后!最后!

我这个从没写过几次技术博客的人,要写这篇技术贴的原因是:昨晚加班到四五点钟查找BUG回到屋里,发现由于没有关好自己卧室的门,室友养的猫进我屋里尿了我一床,所以不得不马上更换棉被,才取睡觉!

1.关于在FairyGUI中使用Unity项目里的Sprite问题

在FairyGUI中使用Unity的Sprite需要使用控件GLoader来装载Sprite.官方给予的使用方法是


//Unity, 这里加载的是路径为Assets/Resources/demo/aimage的一个贴图
aLoader.url = “demo/aimage”;

如果Sprite是在一个Sprite图集中,则需要重写自己的GLoader类,


class MyGLoader  : GLoader
{
    override protected function LoadExternal()
    {
        
    }
    override protected function FreeExternal(NTexture texture)
    {
        //释放外部载入的资源
    }
}

并且注册自己的GLoader


UIObjectFactory.SetLoaderExtension(typeof(MyGLoader));

但是这里并没有告诉我们该怎样具体加载Sprite.

实际上只需要自己查找到Sprite载入就行


  protected override void LoadExternal()
        {
         // 这里使用成员变量url查找Sprite载入即可
            if (url.Length > 0)
            {
             Sprite tSprite= Resources.Load<Sprite>(url);
              this.onExternalLoadSuccess(new NTexture(tSprite));
            }

            this.onExternalLoadFailed();
        }

但是如果Sprite是在一个图集中,图片就显示不正确了。

查找了很久才发现FairyGUI使用的图集和Unity中使用的图集Y轴相反,需要重新计算Rect才能正确加载。即


protected override void LoadExternal()
 {
 if (url.Length > 0)
     {
      Sprite[] tSprites= Resources.LoadAll<Sprite>(url);
      Sprite tSprite = tSprites[0];
      // 这里需要将Y轴反转
      Rect tShowRect = new Rect(tSprite.textureRect.x, tSprite.texture.height - tSprite.textureRect.y - tSprite.textureRect.height, 
              tSprite.textureRect.width, tSprite.textureRect.height);
         this.onExternalLoadSuccess(new NTexture(tSprite.texture, tShowRect));
     }
 }

基本上这样子就解决了GLoader使用Unity的Sprite 问题。

2.使用Sprite Atlas打包图集遇到的问题

由于美术给予的图片都是单个的图片,并没有将打包成为一张图片,所以需要程序自行打包。在多次询问谷哥和度娘以后,才知道Unity有个新的图集打包插件Sprite Atlas很好使用

1.创建Sprite Atlas:

创建Sprite Atlas

2.选择需要打包的图片或者图片所在的文件夹

(这里会将文件夹内的图片和子文件夹内的图片一起打包)

也可以打包预制体

选择需要打包的图片或者图片所在的文件夹

3.设置在编辑器模式下也可以使用打包功能

设置在编辑器模式下也可以使用打包功能

这里就已经完成图集打包了。

一切似乎都很完美,图片显示,打包都有了。

但是!但是!但是

图集+Gloader显示图片后,图片显示不出来了,

查了很久才知道


// 获取精灵在其纹理上使用的矩形。如果这个精灵被紧紧地打包在一个地图集中,则引发一个异常。
textureRect   Get the rectangle this sprite uses on its texture. Raises an exception if this sprite is tightly packed in an atlas.

我TM一万匹草泥马奔过,这TM也是我昨晚查了一晚上,Debug了好久查找怎么正确获取textureRect,或者说能正常显示图片。

我发现如果要显示图片可以使用GGraph:


// FairyGUI官方给予的案例
GGraph holder = new GGraph();
holder.SetSize(100, 100);
holder.DrawRect(...);
aComponent.AddChild(holder);
holder.SetNativeObject(aSprite);

但是这里装载的aSprite是一个GameObject对象,相当于我创建了一个GameObject挂载到了FairyGUI上。

这里我不可能1.将所有的GLoader改成GGraph吧,2.为每张需要用到的图片创建GameObject吧。

后来根据官方的案例发现可以,


Texture2D tTx2D = Resources.Load<Texture2D>(strPath);
this.onExternalLoadSuccess(new NTexture(tTx2D));

但是这里加载的Texture2D是整个图片,如果是图片中的某块区域(图集中的一张图片)则无法正常显示。

最后我发现,在创建Sprite Atlas时,取消勾选Tight Packing(取消紧凑打包),属性textureRect就可以正常获取了。

取消紧凑打包

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: 解决在Unity中使用FairyGUI遇到的坑

本文链接: https://lsjlt.com/news/123482.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 解决在Unity中使用FairyGUI遇到的坑
    首先!首先!首先! 首先,我们由于历史问题,项目用的UI编辑器不是大众使用的GUI或者NGUI, 而是使用不知道算不算小众的FairyGUI,这个UI系统使用挺方便的,也提供了很多U...
    99+
    2024-04-02
  • 在python中使用[[v]*n]*n遇到的坑及解决
    目录使用[[v]*n]*n遇到的坑遇到的问题通过一番研究使用[[v]*n]*m遇到的问题需求:想通过python生成m行n列的矩阵使用[[v]*n]*n遇到的坑 今天通过[[v]*n...
    99+
    2024-04-02
  • 解决使用openpyxl时遇到的坑
    最近在用python处理Excel表格是遇到了一些问题 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用 2, openpyxl 这个库, 在使用的时...
    99+
    2024-04-02
  • vue使用mui遇到的坑及解决
    目录使用mui遇到的坑记录mui的js冲突了,有2种解决方法方法1方法2使用mui遇到的坑记录 主要用到webpack打包工具与mui,mint ui,其中mui有不少坑,在此记录 ...
    99+
    2024-04-02
  • 使用SpringBoot的CommandLineRunner遇到的坑及解决
    目录使用场景两个接口的不同特殊的场景遇到的坑填坑总结使用场景 再应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。 Spring Boot中提供了CommandLineR...
    99+
    2023-02-13
    使用SpringBoot CommandLineRunner的坑 SpringBoot CommandLineRunner
  • 使用flutter的showModalBottomSheet遇到的坑及解决
    目录遇到了三个比较坑的地方我们解决完后的效果如下解决问题一解决问题二解决问题三在使用官方的showModalBottomSheet这个组件时到目前为止 遇到了三个比较坑的地方 1. ...
    99+
    2024-04-02
  • 使用@Validated 和 BindingResult 遇到的坑及解决
    @Validated和BindingResult 使用遇到的坑 @Validated 与BindingResult 需要相邻,否则 变量result 不能接受错误信息 控制台输出 ...
    99+
    2024-04-02
  • vue+freemarker中遇到的坑及解决
    目录vue+freemarker遇到的坑在这个过程中遇到了几个坑freemarker的一些坑问题1.对空对象十分敏感2.freemarker中的${}与js中的${}冲突3.渲染数字...
    99+
    2024-04-02
  • @ConfigurationProperties遇到的坑及解决
    想着偷懒,直接使用@ConfigurationProperties(prefix="xxx")读取配置文件,不使用@Value("${xxx}")去一个一个的注入。 遇到的坑: 创...
    99+
    2024-04-02
  • springcloudoauth2feign遇到的坑及解决
    目录springcloudoauth2feign遇到的坑客户端模式基于springsecurityspringcloud微服务增加oauth2权限后feign调用报null一般是这样...
    99+
    2024-04-02
  • 解决线程并发redisson使用遇到的坑
    线程并发redisson的坑 背景 因为业务上的一个购买需求,需要对库存进行行程保护,防止超卖的出现(我们不是电商公司),经过调研,最终选择使用Redission来进行控制。 主要因...
    99+
    2024-04-02
  • 使用vue导出excel遇到的坑及解决
    目录vue导出excel遇到的坑需求准备工作vue导出excel表报错处理vue导出excel遇到的坑 需求 Vue+element UI el-table下的导出当前所有数据到一个...
    99+
    2024-04-02
  • Golang中JSON遇到的坑如何解决
    本篇内容主要讲解“Golang中JSON遇到的坑如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang中JSON遇到的坑如何解决”吧!空指针会被解析成字符串"null&qu...
    99+
    2023-07-05
  • MyBatis+MyBatisPlus中遇到的坑怎么解决
    这篇文章主要介绍了MyBatis+MyBatisPlus中遇到的坑怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis+MyBatisPlus中遇到的坑怎么解决文章都会有所收获,下面我们一起来看...
    99+
    2023-07-05
  • 使用RxJava中遇到的一些”坑“
    前言大家越用RxJava,越觉得它好用,所以不知不觉地发现代码里到处都是RxJava的身影。然而,RxJava也不是银弹,其中仍然有很多问题需要解决。这里,我简单地总结一下自己遇到的一些“坑”,内容上可能会比较松散。一、考虑主线程的切换Rx...
    99+
    2023-05-31
    rxjava 使用 ava
  • 使用vue导出excel遇到的坑怎么解决
    这篇“使用vue导出excel遇到的坑怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“使用vue导出excel遇到的坑...
    99+
    2023-06-29
  • 解决安装Oracle 11g 遇到的坑
    一.Win10下安装Oracle 11g 报错 信息 [INS-30131] 执行安装程序验证所需的初始设置失败解决:在CMD(管理员身份运行)中使用如下带权限的创建c盘共享命令:net share C$=...
    99+
    2024-04-02
  • 解决SpringBoot整合RocketMQ遇到的坑
    应用场景 在实现RocketMQ消费时,一般会用到@RocketMQMessageListener注解定义Group、Topic以及selectorExpression(数...
    99+
    2024-04-02
  • 解决slf4j 和 logback-classic遇到的坑
    slf4j 和 logback-classic遇到的坑 以前一直不注意日志的打印,最近项目需求需要用日志记录用时性能,集成日志时遇到的问题记录下。 问题一:服务器启动时提示未找到sl...
    99+
    2024-04-02
  • 解决springboot整合druid遇到的坑
    springboot整合druid的坑 项目环境 springboot 2.1.6.RELEASE jdk 1.8 pom.xml配置 <?xm...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作