RectTranform通用位置大小工具
# 最简单的就是,直接将anchor先设为center-mid,然后再设置位置大小
public static void SetAnchoredPos(RectTransform rtf, float x, float y) { var v2Mid = Vector2.one * 0.5f; rtf.anchorMin = v2Mid; rtf.anchorMax = v2Mid; var v2 = rtf.anchoredPosition; v2.x = x; v2.y = y; rtf.anchoredPosition = v2; } public static void SetSize(RectTransform rtf, float w, float h) { var size = rtf.sizeDelta; size.Set(w, h); rtf.sizeDelta = size; }
# 不调整原来的anchor设置,通过left-top边距来调整RectTramsform的位置
/// <summary> /// 移动到left-top边距处(与parent的left和top边, 不是anchor边), 保持大小不变 /// </summary> public static void MoveByLeftTopMargin(RectTransform self, float leftMargin, float topMargin) { MoveByLeftTopMargin(self, leftMargin, topMargin, (RectTransform) self.parent); } public static void MoveByLeftTopMargin(RectTransform self, float leftMargin, float topMargin, RectTransform parentRtf) { var sizeDelta = self.sizeDelta; var rect = self.rect; var parentRect = parentRtf.rect; var offsetMin = self.offsetMin; var offsetMax = self.offsetMax; var anchorMin = self.anchorMin; var newLeftAnchorMargin = leftMargin - anchorMin.x * parentRect.width; newLeftAnchorMargin -= rect.width * 0.5f * (1 - self.localScale.x); if (sizeDelta.x <= 0) //x方向拉伸 { var marginDiff = newLeftAnchorMargin - offsetMin.x /* oldAnchorMargin */; offsetMax.x += marginDiff; } else { offsetMax.x = newLeftAnchorMargin + rect.width; } offsetMin.x = newLeftAnchorMargin; var anchorMax = self.anchorMax; var newTopAnchorMargin = topMargin - (1 - anchorMax.y) * parentRect.height; newTopAnchorMargin -= rect.height * 0.5f * (1 - self.localScale.y); if (sizeDelta.y <= 0) //y方向拉伸 { var marginDiff = -newTopAnchorMargin - offsetMax.y /* oldAnchorMargin */; offsetMin.y += marginDiff; } else { offsetMin.y = -newTopAnchorMargin - rect.height; } offsetMax.y = -newTopAnchorMargin; //我们的margin是parent内部为正, 外部为负; unity的top offset是向上为正, 向下为负 self.offsetMin = offsetMin; self.offsetMax = offsetMax; }
# 获取边距
/// <summary> /// 获取与parent的边距(非anchor边), 在parent内部为正, 在parent外部为负 /// </summary> public static float GetMarginLeft(RectTransform self) { return GetMarginLeft(self, (RectTransform) self.parent); } public static float GetMarginLeft(RectTransform self, RectTransform parentRtf) { var parentRect = parentRtf.rect; return self.offsetMin.x + (self.anchorMin.x * parentRect.width); } /// <summary> /// 获取与parent的边距(非anchor边), 在parent内部为正, 在parent外部为负 /// </summary> public static float GetMarginTop(RectTransform self) { return GetMarginTop(self, (RectTransform) self.parent); } public static float GetMarginTop(RectTransform self, RectTransform parentRtf) { var parentRect = parentRtf.rect; return -self.offsetMax.y + (1 - self.anchorMax.y) * parentRect.height; } /// <summary> /// 获取与parent的边距(非anchor边), 在parent内部为正, 在parent外部为负 /// </summary> public static float GetMarginRight(RectTransform self) { return GetMarginRight(self, (RectTransform) self.parent); } public static float GetMarginRight(RectTransform self, RectTransform parentRtf) { var parentRect = parentRtf.rect; return -self.offsetMax.x + (1 - self.anchorMax.x) * parentRect.width; } /// <summary> /// 获取与parent的边距(非anchor边), 在parent内部为正, 在parent外部为负 /// </summary> public static float GetMarginBottom(RectTransform self) { return GetMarginBottom(self, (RectTransform) self.parent); } public static float GetMarginBottom(RectTransform self, RectTransform parentRtf) { var parentRect = parentRtf.rect; return self.offsetMin.y + self.anchorMin.y * parentRect.height; }
# 设置大小
/// <param name="leftDiff">向左为负, 向右为正</param> /// <param name="rightDiff">向左为负, 向右为正</param> /// <param name="topDiff">向上为正, 向下为负</param> /// <param name="bottomDiff">向上为正, 向下为负</param> public static void SetSizeByDiff(RectTransform rtf, float leftDiff, float rightDiff, float topDiff, float bottomDiff) { var offsetMin = rtf.offsetMin; var offsetMax = rtf.offsetMax; offsetMin.x += leftDiff; offsetMax.x += rightDiff; offsetMin.y += bottomDiff; offsetMax.y += topDiff; rtf.offsetMin = offsetMin; rtf.offsetMax = offsetMax; } public static void SetSize(RectTransform rtf, float w, float h) { var sizeDelta = rtf.sizeDelta; if (sizeDelta.x <= 0 && sizeDelta.y <= 0) //x, y都拉伸 { var offsetMin = rtf.offsetMin; var offsetMax = rtf.offsetMax; var parentRectTrans = rtf.parent as RectTransform; if (null != parentRectTrans) { offsetMax.x = w + offsetMin.x - parentRectTrans.rect.width; offsetMax.y = h + offsetMin.y - parentRectTrans.rect.height; rtf.offsetMax = offsetMax; } } if (sizeDelta.x > 0 && sizeDelta.y > 0) { sizeDelta.x = w; sizeDelta.y = h; rtf.sizeDelta = sizeDelta; } else if (sizeDelta.x > 0) //x方向正常, y方向拉伸 { sizeDelta.x = w; rtf.sizeDelta = sizeDelta; //y方向拉伸 var offsetMin = rtf.offsetMin; var offsetMax = rtf.offsetMax; var parentRectTrans = rtf.parent as RectTransform; if (null != parentRectTrans) { //根据: dst-height = parentRectTrans.rect.height + offsetMax.y - offsetMin.y offsetMax.y = h + offsetMin.y - parentRectTrans.rect.height; rtf.offsetMax = offsetMax; } } else if (sizeDelta.y > 0) //x方向拉伸, y方向正常 { //x方向拉伸 var offsetMin = rtf.offsetMin; var offsetMax = rtf.offsetMax; var parentRectTrans = rtf.parent as RectTransform; if (null != parentRectTrans) { //根据: dst-width = parentRectTrans.rect.width + offsetMax.x - offsetMin.x offsetMax.x = w + offsetMin.x - parentRectTrans.rect.width; rtf.offsetMax = offsetMax; } sizeDelta.y = h; rtf.sizeDelta = sizeDelta; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了