Unity UGUI使所选物体锚点吸附自身顶点

在Unity编辑器中实现:根据UIGUI物体自身的位置和大小,以及其父物体的大小,和UGUI物体自身的中心点,计算物体自身的锚点实现选中的UGUI物体,让锚点快速定位到组件的四个顶点。

(计算自身相对于父物体的锚点(也就等于是自身四个顶点所在位置相对于父物体大小的百分比))

(当然计算锚点的方法也可以在运行状态下使用,大致可用于需要动态加载的UI,设置其锚点,使其可以跟随父物体的大小)

实现的逻辑(详细代码):

#

using System.Collections;

using System.Collections.Generic;

using System.Runtime.InteropServices;

using UnityEditor;

using UnityEngine;

public class CalAnchorsEditor : EditorWindow

{

const string TitleName = "UI设置/设置锚点适应自身";

/// <summary>

/// 是否设置子节点

/// </summary>

bool IsSetChildTransform = false;

[MenuItem(TitleName)]

static void InitWindow()

{

Rect wr = new Rect(0, 0, 500, 500);

var windows = EditorWindow.GetWindowWithRect(typeof(CalAnchorsEditor), wr, true, "设置锚点适应自身");

windows.Show();

}

void OnGUI()

{

IsSetChildTransform = GUILayout.Toggle(IsSetChildTransform, "是否设置子节点", GUILayout.Width(200));

EditorGUILayout.LabelField("选择的物体数量", Selection.gameObjects.Length.ToString());

if (GUILayout.Button("保存", GUILayout.Width(200)))

{

SetSelectGameobjectItemAnchors();

}

}

/// <summary>

/// 设置锚点

/// </summary>

private void SetSelectGameobjectItemAnchors()

    {

var uiItems = Selection.gameObjects;

        for (int i = 0; i < uiItems.Length; i++)

        {

var item = uiItems[i];

var rect = item.GetComponent<RectTransform>();

CalAnchors(rect);

            if (IsSetChildTransform)

            {

var rects = item.GetComponentsInChildren<RectTransform>();

                for (int j = 0; j < rects.Length; j++)

                {

var child = rects[j];

CalAnchors(child);

}

}

}

}

/// <summary>

/// 计算锚点

/// 计算自身相对于父物体的锚点(也就是自身四个顶点所在位置相对于父物体自身大小的百分比)

/// </summary>

private void CalAnchors(Transform transform)

    {

var parent = transform.parent;

RectTransform parentRect = null;

        if (parent)

        {

parentRect = parent.GetComponent<RectTransform>();

}

RectTransform transformRect = transform.GetComponent<RectTransform>();

Vector2 pivot = transformRect.pivot;

        if (parentRect)

        {

float parentWidth = parentRect.rect.width;

float parentHeight = parentRect.rect.height;

float selfWidth = transformRect.rect.width;

float selfHeight= transformRect.rect.height;

float x = transformRect.localPosition.x;

float y= transformRect.localPosition.y;

float anchorsMinx = (parentWidth / 2 + x - (selfWidth * pivot.x)) / parentWidth;//

float anchorsMaxx = (parentWidth / 2 + x + (selfWidth * (1 - pivot.x))) / parentWidth;

float anchorsMiny = (parentHeight / 2 + y - (selfHeight * pivot.y)) / parentHeight;

float anchorsMaxy = (parentHeight / 2 + y + (selfHeight * (1 - pivot.y))) / parentHeight;

transformRect.anchorMin = new Vector2(anchorsMinx, anchorsMiny);

transformRect.anchorMax = new Vector2(anchorsMaxx, anchorsMaxy);

transformRect.offsetMin = Vector2.zero;

transformRect.offsetMax = Vector2.zero;

}

}

}

#

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351