UnityEditor-批处理Texture,spriteEditor,代码设置Pivot失效问题

2023-11-12

需求起因,最近制作角色2D八方向的动画,美术提供的序列帧图片资源,角色不同动作不同方向的图片大小和角色实际的中心点是不一致的,如图所示:攻击和溃败的序列帧图片尺寸和角色在图片中心位置是不一样的。

这样会导致一个问题:在动画状态切换的时候,犹豫锚点不一致的原因会导致位置的瞬间偏移,但这样导出序列帧资源也有一个好处是最大程度的降低图片尺寸。

那么解决这个问题方案是修改序列帧图片的锚点,将图片锚点设置在角色脚下,这样切换动画的时候就会以脚底为锚点解决位置偏移的问题。

代码设置Texture锚点,只需要先设置好一个模板texture,同一个动画的其他图片根据模板设置即可,通过Texture获取到其TextureImporter,再修改SpritePivote:

TextureImporter textureIm = AssetImporter.GetAtPath(path) as TextureImporter;

textureIm.spritePivot = tempSprite.spritePivot;

在实际执行时发现这个方式并没有生效,奇怪的是,手动在SpriteEditor下设置锚点时,Pivot自动从Center切换成了==>Custom

代码批量设置spritePivot的时候,仅设置了锚点,这个对应的枚举没有变化,所以对应的pivot设置没有生效。

手动修改的Texture pivot,如下图所示,资源对应的meta文件显示,SpritePivot和上面的Alignment都修改了,alignment由0==>9

批量设置的图片,meta文件显示,仅设置了spritePivot,alignment没有变化

那显然时alignment的问题导致pivot设置失效,有意思的是在TextureImporter、Sprite、Texture里都没有看到任何和alignment有关的字段,查阅官方Api得知,alignment对应的是SpriteAlignment

查到了大概是什么原因导致的失效,但是实在是找不到在那里设置这个alignment,都已经怀疑是不是Unity没对外提供接口,准备简单粗暴的直接批处理meta文件时,在Unity的官方问答中找到了解决方案:spritePivot失效原因,需要通过TextureImporterSettings进行赋值。

工具效果如下:

代码就很简单了,没几行,代码如下:

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class GenerateSpriteEditor : EditorWindow
{
    private Texture _spriteTemp;
    private SerializedProperty _forceTest;
    private SerializedObject _forceTestAssets;
    [SerializeField]//必须要加
    protected List<Texture> _assetLst = new List<Texture>();

    protected void OnEnable()
    {
        //使用当前类初始化
        _forceTestAssets = new SerializedObject(this);
        //获取当前类中可序列话的属性
        _forceTest = _forceTestAssets.FindProperty("_assetLst");

        if (Selection.objects.Length > 0)
        {
            //获得所有选中的Texture对象
            foreach (Texture texture in Selection.objects)
            {
                _assetLst.Add(texture);
            }
        }
    }

    private Vector2 _scrolPos;
    private void OnGUI()
    {
        EditorGUILayout.BeginVertical();
        {
                
            EditorGUI.BeginChangeCheck();
            {
                _spriteTemp = EditorGUILayout.ObjectField("设置导出模板Sprite",_spriteTemp, typeof(Texture), false) as Texture;
            }
            EditorGUI.EndChangeCheck();
               
            _scrolPos = EditorGUILayout.BeginScrollView(_scrolPos);
            {
                _forceTestAssets.Update();
                EditorGUILayout.PropertyField(_forceTest, new GUIContent("需要批处理的Sprite"), true);
                _forceTestAssets.ApplyModifiedPropertiesWithoutUndo();
            }
            EditorGUILayout.EndScrollView();
                if (GUILayout.Button("批处理锚点"))
                {
                    OnBtnClick();
                }
        }
        EditorGUILayout.EndVertical();
    }

    private void OnBtnClick()
    {
        var path = AssetDatabase.GetAssetPath(_spriteTemp.GetInstanceID());
        TextureImporter textureIm = AssetImporter.GetAtPath(path) as TextureImporter;

        foreach (var texture in _assetLst)
        {
            SetSprite(texture, textureIm);
        }
    }

    private void SetSprite(Texture exportSprite,TextureImporter tempSprite)
    {
        var path = AssetDatabase.GetAssetPath(exportSprite.GetInstanceID());
        TextureImporter textureIm = AssetImporter.GetAtPath(path) as TextureImporter;
        if (textureIm == null)
        {
            Debug.LogError($"sprite Is Null Spritepath = {path}");
            return;
        }
        TextureImporterSettings texSettings = new TextureImporterSettings();
        textureIm.ReadTextureSettings(texSettings);
        texSettings.spriteAlignment = (int)SpriteAlignment.Custom;
        textureIm.SetTextureSettings(texSettings);
        textureIm.spritePivot = tempSprite.spritePivot;
        AssetDatabase.ImportAsset(path);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UnityEditor-批处理Texture,spriteEditor,代码设置Pivot失效问题 的相关文章

  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • Unity3d Terrain地形制作系列(一)

    游戏简单地形 地形制作 地形制作 第一步在场景里加载一个地形对象 第二步 我们在属性面板里找到绘制地形 然后选择Set Height 绘制高度 应该我们要制作低凹的效果 所有先让他有个高度 不然是不能实现低凹的效果 如图 我们然后选择绘制地
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 微信游戏如何开发

    中懿游游戏软件开发 微信游戏开发通常涉及使用微信小游戏平台进行开发 微信小游戏是一种在微信平台上运行的轻量级游戏 用户可以在微信中直接体验 无需下载安装 以下是在微信平台上开发小游戏的一般步骤 1 注册微信开发者账号 访问 微信开放平台 注
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 自定义检查器将值恢复为 Unity 中 Play 上之前的值

    所以在我的游戏中我有一个需要平滑移动的对象Vector3 fromPosition to Vector3 toPosition高速float speed 然后返回到开始的地方 一切都非常简单 但是为了在设置关卡时尝试让生活变得更轻松 我决定
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 除了在 Unity3D 中使用“Assets/Gizmos”之外,如何拥有自定义脚本图标

    我知道这个问题可能被问过很多次了 但它经常被回答错误 我想要的是 Use a custom icon for specific components scripts in the Inspector e g Figure 2 and Fig

随机推荐

  • springboot过滤器和拦截器

    一 过滤器和拦截器的区别 1 过滤器和拦截器触发时机不一样 过滤器是在请求进入容器后 但请求进入servlet之前进行预处理的 请求结束返回也是 是在servlet处理完后 返回给前端之前 2 拦截器可以获取IOC容器中的各个bean 而过
  • Volatility3内存取证工具使用详解

    Volatility 介绍 Volatility是一款开源的内存取证分析工具 是一款开源内存取证框架 能够对导出的内存镜像进行分析 通过获取内核数据结构 使用插件获取内存的详细情况以及系统的运行状态 支持Windows Linux MaC
  • org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder 找不到依赖包

    org springframework boot autoconfigure jdbc DataSourceBuilder 找不到依赖包 org springframework boot autoconfigure jdbc DataSou
  • PowerOJ2546: fork【C++ STL __gnu_cxx::rope】

    题目链接 我们可以这样定义一个可持久化数组 rope
  • MIPI TX控制器的设计

    MIPI接口在移动设备中被广泛应用 主要用于传输图像传感器 液晶显示器等外设的数据 以MIPI DPHY v1 2为例 它包含一个CLK lane和若干个DATA lane 可配置 每个lane的最高速率可达到2 5Gbps 对比SerDe
  • 向win7旗舰版U盘启动盘 添加usb3.0driver

    以前的主板usb采用的是ehci controller 仅支持usb2 0 而现在的主板一般采用xhci controller 同时支持usb2 0和usb3 0 win7的镜像安装包里面的驱动并没有xhci的驱动 所以在如今的很多新平台的
  • 怎么样对阿里云ECS主机进行绑定域名

    首先我有个阿里的 域名 虚拟云主机 搭建了一个wordpress 的网站 地址为 www liuxun name wordpress liuxun name wordpress 现在我想把一个阿里云的ECS主机 里面装了tomcat 希望以
  • GET请求里的body问题

    故事还得从一个bug说起 今天有人问我 为什么发到后端的请求400了 我说肯定是参数不对 你去检查检查GET POST之类的方法写没写对 要么就是字段没对上 无非是这几个问题 然后他说检查过了 没问题啊 我不太相信 但是看了看前端发送的请求
  • springmvc 03(JSR303和拦截器)

    目录 一 JSR303 1 服务端验证 2 步骤 二 拦截器 1 简介 2 拦截器与过滤器 2 1 什么是过滤器 2 2 拦截器和过滤器的区别 3 拦截器案例 3 1 使用原理 一 JSR303 1 服务端验证 2 步骤 1 导入pom x
  • 【数据结构】6.5 红黑树(C++)

    数据结构 6 5 红黑树 没有学过二叉搜索树 也叫二叉排序树或二叉查找树 的小伙伴们建议先学习一下 这样阅读会更轻松哦 点我学习二叉搜索树 目录 一 红黑树的概念和性质 二 红黑树的存储结构和声明 三 红黑树的构建过程 四 红黑树的实现 1
  • Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

    1 从https github com BVLC caffe 通过git clone下载caffe源码 master分支 版本号为09868ac git clone https github com BVLC caffe git 2 先使用
  • Visio画出简单的拓扑图

    1 选择类别 类别 网络 基本网络图 2 画图 在左边选择 模具 上方选择 连接线
  • Ubuntu下编译并运行C++代码

    安装完Ubuntu后 用户目录有时候也叫 home 文件夹或者主文件夹 它的路径是 home username 其中 username 就是我们登录 Linux 时使用的用户名 Linux 会在 home 目录下为每一个登录的用户创建一个文
  • Java中泛型

    Thinking in Java 第15章笔记 即使使用了接口 就要求代码必须使用特定的接口 对程序的约束也还是太强了 我们希望达到的目的是编写更通用的代码 要使代码能够应用与 某种不具体的类型 而不是一个具体的接口或类 泛型这个术语的意思
  • 2023-05-30 题目

    一 LinkedList 1 特点 线程不安全 底层是链表 删除 插入数据快 查询速度较慢 如果想让其变成线程安全的 可以使用Collections synchronizedList 方法 链表底层结构 2 源码如下 Pointer to
  • 电磁兼容按GB4824-2019分类,为1组A类和2组A类,是如何区分?

    电磁兼容按GB4824 2019分类 为1组A类和2组A类 是如何区分 摘要 电磁兼容按GB4824 2019分类 为1组A类和2组A类 是如何区分 GB4824 2019分类 设备的分组与分类 分组 为了简化区分相关限值 本标准范围内的设
  • 请求分页系统中的置换算法(FIFO、LRU、Optimal)

    操作系统实验导航 实验一 银行家算法 https blog csdn net weixin 46291251 article details 115384510 实验二 多级队列调度和多级反馈队列调度算法 https blog csdn n
  • Spring Boot 使用WebSocket、SockJS、STOMP实现消息功能(三)

    一 介绍 这里主要基于上一篇介绍一下基于SocketJS Stomp来实现的的长连接 我借鉴了其他的一些博客 只是把我用的知识总结在了一起方便我自己以后回顾 二 WebSocket概念 概述 WebSocket协议提供了通过一个套接字实现全
  • 10年老技术人员:C++ 该如何快速入门?

    C 是一门面对对象的语言 我们如何学习呢 其实任何的难题都是多种简单的部分通过复杂的关系组合在一起 学语言 最关键的是理解而不是运用 高中的时候 老师给出的公式 都是告诉我们用就好了 不用去了解它怎么来的 但是语言不一样 你如果只会用那你是
  • UnityEditor-批处理Texture,spriteEditor,代码设置Pivot失效问题

    需求起因 最近制作角色2D八方向的动画 美术提供的序列帧图片资源 角色不同动作不同方向的图片大小和角色实际的中心点是不一致的 如图所示 攻击和溃败的序列帧图片尺寸和角色在图片中心位置是不一样的 这样会导致一个问题 在动画状态切换的时候 犹豫