Last active
April 7, 2022 12:17
-
-
Save nkjzm/1b31512c00aee93403427f14ebfb4db8 to your computer and use it in GitHub Desktop.
座標を変えずにPivotとAnchorの値を変えるRectTransformの拡張メソッド
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public static class RectTransformExtensions | |
{ | |
/// <summary> | |
/// 座標を保ったままPivotを変更する | |
/// </summary> | |
/// <param name="rectTransform">自身の参照</param> | |
/// <param name="targetPivot">変更先のPivot座標</param> | |
public static void SetPivotWithKeepingPosition(this RectTransform rectTransform, Vector2 targetPivot) | |
{ | |
var diffPivot = targetPivot - rectTransform.pivot; | |
rectTransform.pivot = targetPivot; | |
var diffPos = new Vector2(rectTransform.sizeDelta.x * diffPivot.x, rectTransform.sizeDelta.y * diffPivot.y); | |
rectTransform.anchoredPosition += diffPos; | |
} | |
/// <summary> | |
/// 座標を保ったままPivotを変更する | |
/// </summary> | |
/// <param name="rectTransform">自身の参照</param> | |
/// <param name="x">変更先のPivotのx座標</param> | |
/// <param name="y">変更先のPivotのy座標</param> | |
public static void SetPivotWithKeepingPosition(this RectTransform rectTransform, float x, float y) | |
{ | |
rectTransform.SetPivotWithKeepingPosition(new Vector2(x, y)); | |
} | |
/// <summary> | |
/// 座標を保ったままAnchorを変更する | |
/// </summary> | |
/// <param name="rectTransform">自身の参照</param> | |
/// <param name="targetAnchor">変更先のAnchor座標 (min,maxが共通の場合)</param> | |
public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, Vector2 targetAnchor) | |
{ | |
rectTransform.SetAnchorWithKeepingPosition(targetAnchor, targetAnchor); | |
} | |
/// <summary> | |
/// 座標を保ったままAnchorを変更する | |
/// </summary> | |
/// <param name="rectTransform">自身の参照</param> | |
/// <param name="x">変更先のAnchorのx座標 (min,maxが共通の場合)</param> | |
/// <param name="y">変更先のAnchorのy座標 (min,maxが共通の場合)</param> | |
public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, float x, float y) | |
{ | |
rectTransform.SetAnchorWithKeepingPosition(new Vector2(x, y)); | |
} | |
/// <summary> | |
/// 座標を保ったままAnchorを変更する | |
/// </summary> | |
/// <param name="rectTransform">自身の参照</param> | |
/// <param name="targetMinAnchor">変更先のAnchorMin座標</param> | |
/// <param name="targetMaxAnchor">変更先のAnchorMax座標</param> | |
public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, Vector2 targetMinAnchor, Vector2 targetMaxAnchor) | |
{ | |
var parent = rectTransform.parent as RectTransform; | |
if (parent == null) { Debug.LogError("Parent cannot find."); } | |
var diffMin = targetMinAnchor - rectTransform.anchorMin; | |
var diffMax = targetMaxAnchor - rectTransform.anchorMax; | |
// anchorの更新 | |
rectTransform.anchorMin = targetMinAnchor; | |
rectTransform.anchorMax = targetMaxAnchor; | |
// 上下左右の距離の差分を計算 | |
var diffLeft = parent.rect.width * diffMin.x; | |
var diffRight = parent.rect.width * diffMax.x; | |
var diffBottom = parent.rect.height * diffMin.y; | |
var diffTop = parent.rect.height * diffMax.y; | |
// サイズと座標の修正 | |
rectTransform.sizeDelta += new Vector2(diffLeft - diffRight, diffBottom - diffTop); | |
var pivot = rectTransform.pivot; | |
rectTransform.anchoredPosition -= new Vector2( | |
(diffLeft * (1 - pivot.x)) + (diffRight * pivot.x), | |
(diffBottom * (1 - pivot.y)) + (diffTop * pivot.y) | |
); | |
} | |
/// <summary> | |
/// 座標を保ったままAnchorを変更する | |
/// </summary> | |
/// <param name="rectTransform">自身の参照</param> | |
/// <param name="minX">変更先のAnchorMinのx座標</param> | |
/// <param name="minY">変更先のAnchorMinのy座標</param> | |
/// <param name="maxX">変更先のAnchorMaxのx座標</param> | |
/// <param name="maxY">変更先のAnchorMaxのy座標</param> | |
public static void SetAnchorWithKeepingPosition(this RectTransform rectTransform, float minX, float minY, float maxX, float maxY) | |
{ | |
rectTransform.SetAnchorWithKeepingPosition(new Vector2(minX, minY), new Vector2(maxX, maxY)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
こんにちは!このコードを使わせてもらっています、ありがとうございます!
このコードを使っていて、オブジェクトが回転されたものであった場合、15行目のように単にpivotのズレ分ベクトルを足してあげただけでは、別の方向に動いてしまうことに気づきました。
diffPos = rectTransform.rotation * diffPos;
このコードを14行目と15行目の間に挟めば解決すると思います!失礼しました!