【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)

这篇具有很好参考价值的文章主要介绍了【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文最终效果
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)

一、前言

嗨,大家好,我是新发。
前同事问了我一个问题,如何将UGUIImage进行变形,变成斜斜的,
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)
最直接的就是出图的时候直接就画成斜的,我们不讨论这种情况,这里我们单纯的从技术实现上去思考能不能在Unity中通过UGUIImage对图片进行倾斜变形。
之前我写过一篇文章 【游戏开发进阶】Unity网格探险之旅(Mesh | 动态合批 | 骨骼动画 | 蒙皮 )
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)
文中我讲过一句话:

我们在Unity场景中,所有能被渲染出来的物体都会带有网格,比如3D模型、粒子特效、UI、文字等等

我们的UGUI对象,也是由网格顶点、材质、纹理等配合工作最终由GPU计算渲染出来的,我们可以在Scene视图中选择Wireframe模式,即可看到图片的网格顶点了,如下
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)

我们只需要想办法修改网格的顶点坐标即可达到图片倾斜的效果。
其实,我在更早之前写过另外一篇文章:【游戏开发实战】Unity UGUI制作雷达图/天赋图/属性图/能力图,因为太怕痛就全点了防御力
文中我讲了UGUI实现雷达图的原理与具体实现方法
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)老粉应该看过我这边文章,里面我讲过这么一段话:
UGUI中,不管是RawImageImage还是Text,它们都是继承MaskableGraphic的,而MaskableGraphic又是继承Graphic的,在Graphic中有个OnPopulateMesh方法。

protected virtual void OnPopulateMesh(VertexHelper toFill);

参数是VertexHelper,我们可以通过VertexHelper来获取顶点信息并操作顶点(修改顶点或者插入新的顶点等)。
我们可以去override这个OnPopulateMesh方法,实现我们自己想要的效果,下面我就来讲下具体操作吧~

二、继承Image,重写OnPopulateMesh方法

我们创建一个ShapeImage脚本,
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)
让它继承Image,重写OnPopulateMesh方法,

using UnityEngine.UI;

public class ShapeImage : Image
{
    protected override void OnPopulateMesh(VertexHelper toFill)
    {
        base.OnPopulateMesh(toFill);
        // TODO 顶点偏移
    }
}

一张精灵图,是由四个顶底组成的,顶点顺序是这样的,
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)

我们可以对12两个顶点做一个横向的坐标偏移,即可达到图像倾斜的效果,
获取顶点我们可以通过PopulateUIVertex方法来获得,例:

// 顶点索引
int index = 1;
UIVertex vertex = new UIVertex();
toFill.PopulateUIVertex(ref vertex, index);

接着我们可以对顶点坐标做一个偏移

// 偏移
float offset = 3f;
vertex.position += Vector3.right * offset;

最后重新把顶点数据塞回给VertexHelper对象,如下:

toFill.SetUIVertex(vertex, index);

完整代码如下:

using UnityEngine;
using UnityEngine.UI;

public class ShapeImage : Image
{
    // 倾斜偏移
    public float offset;

    protected override void OnPopulateMesh(VertexHelper toFill)
    {
        base.OnPopulateMesh(toFill);

        UIVertex vertex = new UIVertex();
        toFill.PopulateUIVertex(ref vertex, 1);
        vertex.position += Vector3.right * offset;
        toFill.SetUIVertex(vertex, 1);

        vertex = new UIVertex();
        toFill.PopulateUIVertex(ref vertex, 2);
        vertex.position += Vector3.right * offset;
        toFill.SetUIVertex(vertex, 2);
    }
}

三、挂ShapeImage脚本

我们在Canvas节点下创建一个空物体,重命名为ShapeImage,如下
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)
给它挂上ShapeImage脚本,并设置Source Image成员为精灵图片资源,如下
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)
此时我们发现在Inspector窗口中并没有显示offset参数,不像我们普通的Monobehaviour脚本那样声明了public成员对象就会自动显示到Inspector面包中,此时我们需要重写ImageEditor

四、ShapeImageEditor编辑器脚本

我们在Editor目录中创建一个ShapeImageEditor脚本,如下
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)
代码如下

using UnityEditor;
using UnityEditor.UI;
using UnityEngine;

[CustomEditor(typeof(ShapeImage), true)]
public class ShapeImageEditor : ImageEditor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        ShapeImage image = (ShapeImage)target;
        SerializedProperty sp = serializedObject.FindProperty("offset");
        EditorGUILayout.PropertyField(sp, new GUIContent("offset 倾斜偏移"));
        serializedObject.ApplyModifiedProperties();
    }
}

此时我们就可以在Inspector窗口中看到offset参数了,
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)

五、测试

我们调节offset参数,可以看到图片实现倾斜效果啦~
【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)收工~
我是新发,https://blog.csdn.net/linxinfa
一个在小公司默默奋斗的Unity开发者,希望可以帮助更多想学Unity的人,共勉~文章来源地址https://www.toymoban.com/news/detail-441124.html

到了这里,关于【游戏开发解答】Unity中对UGUI的Image进行倾斜变形(UGUI | 精灵图 | OnPopulateMesh | 顶点偏移 | 变形)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity UGUI使用Text组件位图字体进行自适应大小

    1.首先我们需要把位图字体导入到unity中,然后利用插件转化一下 我使用的是BMFont 2.然后我们就可以看到生成了四个文件,其中我们主要注意的是.fontsettings文件, 我们主要修改的就是 Character Rect里面的各个参数,至于具体是什么 ,大家有兴趣的可以去搜索, 好了 我们直接上代码 把

    2024年02月05日
    浏览(55)
  • 【微信开发】小程序this.setData({})中对普通字段、数组以及数组对象进行赋值,对数组对象进行操作

    前言:         之最近在开发一个系统的时候,this.setData总有时候会出问题,查了查资料,一下进行总结: 字段赋值; 数组静态赋值; 数组动态赋值; 对象数组动态赋值; 组对象进行操作         ① 末位加数据;         ② 中间或者开头加数据;         ③ 删除

    2024年02月08日
    浏览(46)
  • Unity游戏开发之游戏动画(Unity动画系统)

    Unity动画系统分为 动画片段 Animation Clip: 动画资源,与模型无关 动画状态机 Animator Controller:帮助我们跟踪当前动画的播放状态,并且根据设置觉得如何切换动画片段 动画组件 Animator Component:玩家角色需要播放动画功能时,需要动画组件,将游戏对象需要的动画状态机(以

    2024年02月13日
    浏览(58)
  • Vue中如何进行游戏开发与游戏引擎集成?

    Vue.js是一款流行的JavaScript框架,它的MVVM模式和组件化开发思想非常适合构建Web应用程序。但是,如果我们想要开发Web游戏,Vue.js并不是最合适的选择。在本文中,我们将介绍如何在Vue.js中进行游戏开发,并集成一些流行的游戏引擎。 在阅读本文之前,你需要掌握以下技能:

    2024年02月11日
    浏览(47)
  • Unity游戏开发之游戏存档方式

    目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法  4.SQLite 1.SQLite的一些基础(简单介绍,不会深入讲解) 2.在Unity中使用SQLite 3.SQLite的优劣 结语         属于unity自带的数据存储方法,其形式

    2024年02月06日
    浏览(49)
  • 【Unity 框架】QFramework v1.0 使用指南 工具篇:05. ResKit 资源管理&开发解决方案 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    Res Kit,是资源管理快速开发解决方案 特性如下: 可以使用一个 API 从 dataPath、Resources、StreammingAssetPath、PersistentDataPath、网络等地方加载资源。 基于引用计数,简化资源加载和卸载。 拥抱游戏开发流程中的不同阶段 开发阶段不用打 AB 直接从 dataPath 加载。 测试阶段支持只需打

    2024年02月01日
    浏览(63)
  • Pandas中对DataFrame列名进行重命名

    目录 1.重命名Pandas DataFrame Column(列) 2.在创建Dataframe时指定列名 3.※使用 list 设置全部列名※ Pandas是一个用于数据分析和操作的Python库。在 pandas 中几乎所有的操作都围绕着 DataFrame 。 Dataframe 是一个二维表的抽象表示,可以包含各种数据。 背景:只想重命名几列,最好在创

    2023年04月18日
    浏览(35)
  • 在 Python 中对日期和时间进行排序

    Python 是全世界程序员都在使用的一种高级解释型编程语言。 它最著名的是面向对象编程。 我们可以在与人工智能、机器学习、Web 开发和数据分析相关的不同 IT 领域使用 Python。 Python 流行和实用的另一个原因是它有许多内置的库和模块。 本文将教我们如何使用 Python 对日期

    2024年02月07日
    浏览(35)
  • 【Unity小游戏】游戏开发案例-Unity打造畅玩无阻的小游戏(上)

    乒乓克隆 使用立方体建造竞技场、球拍和球。 移动球和球拍。 击球并得分。 让相机感受到冲击力。 给游戏一个抽象的霓虹灯外观。 这是有关基础游戏的系列教程中的第一个教程。在其中,我们将创建一个简单的 Pong 克隆。 本教程是使用 Unity 2021.3.16f1 制作的。 本系列将涵

    2024年02月13日
    浏览(46)
  • UGUI基础游戏对象Canvas

      画布是一种带有画布组件的游戏对象,所有 UI 元素都必须是此类画布的子项。 创建新的 UI 元素(如使用菜单  GameObject UI Image  创建图像)时,如果场景中还没有画布,则会自动创建画布。UI 元素将创建为此画布的子项。 画布区域在 Scene 视图中显示为矩形。这样可以轻松

    2024年02月13日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包