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 WebGL错误集锦

    ips 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace 可以在打出的包中的浏览器的webgl打印出错
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge

随机推荐

  • 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八方向的动画 美术提供的序列帧图片资源 角色不同动作不同方向的图片大小和角色实际的中心点是不一致的 如图所示 攻击和溃败的序列帧图片尺寸和角色在图片中心位置是不一样的 这样会导致一个问题 在动画状态切换的时候 犹豫