Unity中实现UI翻转
  gEMN1CQh1PXt 2023年11月02日 81 0


一:效果演示

Unity中实现UI翻转_代码实现


二:使用

Unity中实现UI翻转_ide_02

FlipType:翻转类型(水平翻转、竖直翻转、水平竖直翻转)


三:为什么不使用将Scale设置为-1

将Scale的x、y设置为-1也可以实现翻转的效果,但是这样还会影响到子物体以及animation,所以最佳的方法是修改图片的显示,我们可以继承UGUI提供的网格效果基类BaseMeshEffect修改网格顶点去实现翻转效果


四:代码实现

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

/// <summary>
/// 翻转
/// </summary>
/// 与将Scale设置为-1效果相同
[DisallowMultipleComponent]
[RequireComponent(typeof(RectTransform))]
[AddComponentMenu("LFramework/UI/Effects/Flip")]
public class Flip : BaseMeshEffect
{
/// <summary>
/// 翻转类型
/// </summary>
public enum EFlipType
{
Horizontal,
Vertical,
HorizontalAndVertical,
}

//翻转类型
[SerializeField]
EFlipType m_FlipType;
public EFlipType FlipType
{
get
{
return m_FlipType;
}
set
{
m_FlipType = value;
graphic.SetVerticesDirty();
}
}

//顶点缓存
List<UIVertex> vertexCache = new List<UIVertex>();

public override void ModifyMesh(VertexHelper vh)
{
vh.GetUIVertexStream(vertexCache);
vh.Clear();

ApplyFlip(vertexCache, graphic.rectTransform.rect.center);

vh.AddUIVertexTriangleStream(vertexCache);
vertexCache.Clear();
}

void ApplyFlip(List<UIVertex> vertexCache, Vector2 pivot)
{
int vertexCount = vertexCache.Count;
for (int i = 0; i < vertexCount; i++)
{
UIVertex veretx = vertexCache[i];
if (m_FlipType == EFlipType.HorizontalAndVertical)
{
veretx.position.x = 2 * pivot.x - veretx.position.x;
veretx.position.y = 2 * pivot.y - veretx.position.y;
}
else if (m_FlipType == EFlipType.Horizontal)
{
veretx.position.x = 2 * pivot.x - veretx.position.x;
}
else if (m_FlipType == EFlipType.Vertical)
{
veretx.position.y = 2 * pivot.y - veretx.position.y;
}
vertexCache[i] = veretx;
}
}
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论