unity 编辑器时读取FairyGUI图集单个图像

这篇具有很好参考价值的文章主要介绍了unity 编辑器时读取FairyGUI图集单个图像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原因

想要在编辑器扩展也能访问FairyGUI图集里面的小图,随便找了一下没有找到接口自己做一个

方法

使用UIPackage.GetItemByURL获得小图信息。从图集中复制出小图,如果有旋转就逆旋转90度即可
图集里面的小图是有可能旋转的,可以通过访问 NTexture.rotated 判断在图集中是否旋转

获取小图在图集中的起始位置

X偏移坐标可以直接 uvRect.min.x * nativeTexture.width 得到真实的X偏移
Y坐标可以根据uvRect赋值反过来获得,原有公式是

uvRect.min.y = 1 - region.yMax / _nativeTexture.height

那么真实的公式就是

y = (1 - startOffset.y) * nativeTexture.height - textureSize.y

无非就是交互律。还原public NTexture(Texture texture, Rect region) 构造传入来的region参数

获得偏移和大小后只需要使用RenderTexture把小图读出来就好

        RenderTexture renderTex = RenderTexture.GetTemporary(nativeTexture.width, nativeTexture.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Linear);
        Graphics.Blit(nativeTexture, renderTex);
        RenderTexture previous = RenderTexture.active;
        RenderTexture.active = renderTex;

        Texture2D resultTexture = new Texture2D(textureSize.x, textureSize.y, nativeTexture.format, false);
        resultTexture.ReadPixels(new Rect((int)startOffset.x, (int)startOffset.y, textureSize.x, textureSize.y), 0, 0);
        resultTexture.Apply();

        RenderTexture.active = previous;
        RenderTexture.ReleaseTemporary(renderTex);

图集中的小图是会旋转的应该如何还原

Texture2D.GetPixel 和 Texture2D.SetPixel 接口读写非常慢
可以直接使用GetPixelData或者GetPixels导出图像数据数组,操作完成后刷新图像数据
根据 nativeTexture.format 类型使用Color或者Color32格式读取

var colorArray = resultTexture.GetPixelData<Color32>(0)

有数组后简单逆旋转90数组数据,就可以得到原来的小图文章来源地址https://www.toymoban.com/news/detail-709356.html

for (int i = 0; i < textureSize.x; i++)
{
    for (int j = 0; j < textureSize.y; j++)
    {
        colors[i * textureSize.y + j] = colorArray[textureSize.x - 1 - i + j * textureSize.x];
    }
}

完整代码

    public Texture GetTexture(string url)
    {
        PackageItem packageItem = UIPackage.GetItemByURL(url);
        if (packageItem == null)
            return null;

        NTexture nTexture = packageItem.texture;
        Texture2D nativeTexture = nTexture.nativeTexture as Texture2D;

        var startOffset = nTexture.uvRect.min;
        var textureSize = new Vector2Int(nTexture.width, nTexture.height);
        if (nTexture.rotated)
            textureSize = new Vector2Int(nTexture.height, nTexture.width);
        startOffset.x *= nativeTexture.width;
        startOffset.y = (1 - startOffset.y) * nativeTexture.height - textureSize.y;


        RenderTexture renderTex = RenderTexture.GetTemporary(nativeTexture.width, nativeTexture.height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Linear);
        Graphics.Blit(nativeTexture, renderTex);
        RenderTexture previous = RenderTexture.active;
        RenderTexture.active = renderTex;

        Texture2D resultTexture = new Texture2D(textureSize.x, textureSize.y, nativeTexture.format, false);
        resultTexture.ReadPixels(new Rect((int)startOffset.x, (int)startOffset.y, textureSize.x, textureSize.y), 0, 0);
        resultTexture.Apply();

        RenderTexture.active = previous;
        RenderTexture.ReleaseTemporary(renderTex);

        if (nTexture.rotated)
        {
            var colorArray = resultTexture.GetPixelData<Color32>(0);
            Texture2D rotationTexture = new Texture2D(textureSize.y, textureSize.x, nativeTexture.format, false);
            var colors = rotationTexture.GetPixelData<Color32>(0);

            for (int i = 0; i < textureSize.x; i++)
            {
                for (int j = 0; j < textureSize.y; j++)
                {
                    colors[i * textureSize.y + j] = colorArray[textureSize.x - 1 - i + j * textureSize.x];
                }
            }

            rotationTexture.SetPixelData(colors, 0);
            rotationTexture.Apply();
            Object.Destroy(resultTexture);
            resultTexture = rotationTexture;
        }

        return resultTexture;
    }

到了这里,关于unity 编辑器时读取FairyGUI图集单个图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity 简单实现tilemap的保存和读取(以便用于关卡编辑器)

            最近在学习使用Tiledmap,用于制作地图确实很方便快捷,但总不能一个关卡就做一个prefab?还是必须将其保存为文本文件才行啊,于是有了以下的尝试:         先定义一个Tiledmap类,用于存储单个Tiledmap信息 tiles是保存的所有tile块。key为坐标值,value为使用的tile

    2024年02月13日
    浏览(38)
  • 【HTML】标签读取富文本编辑器的内容

    1.正确读取富文本内容示例: 代码:  显示结果:  在这个例子中, {$row.content}  是直接输出从数据库中获取的富文本内容,包括可能存在的HTML标签和属性,这样可以确保富文本能够按照预期样式呈现。 2. 错误读取富文本内容示例及其原因分析:  代码:  显示结果: 分析

    2024年02月02日
    浏览(49)
  • Unity编辑器扩展 | 编辑器扩展基础入门

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(77)
  • 【Unity编辑器扩展】 | 编辑器扩展入门基础

    前言 当谈到游戏开发工具,Unity编辑器是一个备受赞誉的平台。它为开发者提供了一个强大且灵活的环境,使他们能够创建令人惊叹的游戏和交互式体验。 然而,Unity编辑器本身也是可以扩展和定制的,这为开发者提供了进一步提升工作流程和增强功能的机会。 在Unity 编辑器

    2024年02月10日
    浏览(84)
  • Unity 可视化节点编辑器(GraphView、编辑器扩展)

      前几天把导师的项目打包发布交了一稿,这半个星期除了再把项目缝缝补补外(说实话项目做到后边实在有些无聊,都是些琐碎的东西而且自己也学不到什么,纯粹是 浪费 消磨时间)无聊逛Unity商店发现了个有意思的东西,说实话一开始我以为只是单纯绘制的2D动画:

    2024年02月12日
    浏览(63)
  • Unity编辑器紫色

    紫色原因是因为编辑器内跑了其他平台的shader兼容性导致的,需要动态的去修改shader,主要用到Unity的api :  Shader.Find(shaderName); 具体的工具代码如下: Shader的添加形式大概有两种: 跟随AssetBundle 打进包里面,可以直接使用       自建材质  

    2024年02月03日
    浏览(57)
  • Unity编辑器扩展(外挂)

    每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/     //添加变量悬浮提示文字     //给数值设定范围(最小0,最大150) //指定输入框,拥有5行 //默认显示5行,最多显示10行内容,再多用滚动条控

    2024年01月24日
    浏览(88)
  • 修改unity代码编辑器

    将   Unity  自带的 MonoDevelop  替换成微软的 VS  2017 编辑器。 操作步骤 : 第一步:选择Edit选项卡下的Preferences..选项 第二步:选择External Tools 第三步:修改右侧的External Script Editor,选择VS2017  有的小伙伴可能下拉框中没有VS2017选项,没关系,点击Brower..,找到VS2017的应用程序

    2024年02月11日
    浏览(48)
  • Unity 编辑器常用方法

    自动根据RuntimeInitializeLoadType选择一个时机执行。静态方法 AfterSceneLoad 在场景加载之后初始化子系统。这意味着子系统将在场景加载完成后进行初始化,并在场景加载后的脚本执行时可用。 BeforeSceneLoad 在场景加载之前初始化子系统。这意味着子系统将在场景加载之前进行初始

    2024年02月07日
    浏览(54)
  • 【Unity UIToolkit】UIBuilder基础教程-制作简易的对话系统编辑器 3步教你玩转Unity编辑器扩展工具

    随着Unity开发的深入,基本的Unity编辑器界面并不能满足大部分玩家高阶开发的要求。为了提高开发的效率,有针对性的定制化扩展编辑器界面是提高开发效率的不错选择。 今天就给大家带来Unity官方提高的编辑器扩展工具UIToolkit(集成了UIBuilder和UI Debugger等插件)的使用教程。

    2024年02月04日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包