using System; using UnityEngine; [ExecuteInEditMode] [AddComponentMenu("NGUI/UI/Anchor")] public class UIAnchor : MonoBehaviour { private void Awake() { this.mTrans = base.transform; this.mAnim = base.GetComponent(); UICamera.onScreenResize = (UICamera.OnScreenResize)Delegate.Combine(UICamera.onScreenResize, new UICamera.OnScreenResize(this.ScreenSizeChanged)); } private void OnDestroy() { UICamera.onScreenResize = (UICamera.OnScreenResize)Delegate.Remove(UICamera.onScreenResize, new UICamera.OnScreenResize(this.ScreenSizeChanged)); } private void ScreenSizeChanged() { if (this.mStarted && this.runOnlyOnce) { this.Update(); } } private void Start() { if (this.container == null && this.widgetContainer != null) { this.container = this.widgetContainer.gameObject; this.widgetContainer = null; } this.mRoot = NGUITools.FindInParents(base.gameObject); if (this.uiCamera == null) { this.uiCamera = NGUITools.FindCameraForLayer(base.gameObject.layer); } this.Update(); this.mStarted = true; } private void Update() { if (this.mAnim != null && this.mAnim.enabled && this.mAnim.isPlaying) { return; } bool flag = false; UIWidget uiwidget = (!(this.container == null)) ? this.container.GetComponent() : null; UIPanel uipanel = (!(this.container == null) || !(uiwidget == null)) ? this.container.GetComponent() : null; if (uiwidget != null) { Bounds bounds = uiwidget.CalculateBounds(this.container.transform.parent); this.mRect.x = bounds.min.x; this.mRect.y = bounds.min.y; this.mRect.width = bounds.size.x; this.mRect.height = bounds.size.y; } else if (uipanel != null) { if (uipanel.clipping == UIDrawCall.Clipping.None) { float num = (!(this.mRoot != null)) ? 0.5f : ((float)this.mRoot.activeHeight / (float)UICamera.ScreenHeight * 0.5f); if (GameMain.Instance.VRMode && Application.isPlaying) { this.mRect.xMin = -1280f * num; this.mRect.yMin = -720f * num; } else { this.mRect.xMin = (float)(-(float)UICamera.ScreenWidth) * num; this.mRect.yMin = (float)(-(float)UICamera.ScreenHeight) * num; } this.mRect.xMax = -this.mRect.xMin; this.mRect.yMax = -this.mRect.yMin; } else { Vector4 finalClipRegion = uipanel.finalClipRegion; this.mRect.x = finalClipRegion.x - finalClipRegion.z * 0.5f; this.mRect.y = finalClipRegion.y - finalClipRegion.w * 0.5f; this.mRect.width = finalClipRegion.z; this.mRect.height = finalClipRegion.w; } } else if (this.container != null) { Transform parent = this.container.transform.parent; Bounds bounds2 = (!(parent != null)) ? NGUIMath.CalculateRelativeWidgetBounds(this.container.transform) : NGUIMath.CalculateRelativeWidgetBounds(parent, this.container.transform); this.mRect.x = bounds2.min.x; this.mRect.y = bounds2.min.y; this.mRect.width = bounds2.size.x; this.mRect.height = bounds2.size.y; } else { if (!(this.uiCamera != null)) { return; } flag = true; this.mRect = this.uiCamera.pixelRect; } float x = (this.mRect.xMin + this.mRect.xMax) * 0.5f; float y = (this.mRect.yMin + this.mRect.yMax) * 0.5f; Vector3 vector = new Vector3(x, y, 0f); if (this.side != UIAnchor.Side.Center) { if (this.side == UIAnchor.Side.Right || this.side == UIAnchor.Side.TopRight || this.side == UIAnchor.Side.BottomRight) { vector.x = this.mRect.xMax; } else if (this.side == UIAnchor.Side.Top || this.side == UIAnchor.Side.Center || this.side == UIAnchor.Side.Bottom) { vector.x = x; } else { vector.x = this.mRect.xMin; } if (this.side == UIAnchor.Side.Top || this.side == UIAnchor.Side.TopRight || this.side == UIAnchor.Side.TopLeft) { vector.y = this.mRect.yMax; } else if (this.side == UIAnchor.Side.Left || this.side == UIAnchor.Side.Center || this.side == UIAnchor.Side.Right) { vector.y = y; } else { vector.y = this.mRect.yMin; } } float width = this.mRect.width; float height = this.mRect.height; vector.x += this.pixelOffset.x + this.relativeOffset.x * width; vector.y += this.pixelOffset.y + this.relativeOffset.y * height; if (flag) { if (this.uiCamera.orthographic) { vector.x = Mathf.Round(vector.x); vector.y = Mathf.Round(vector.y); } vector.z = this.uiCamera.WorldToScreenPoint(this.mTrans.position).z; vector = this.uiCamera.ScreenToWorldPoint(vector); } else { vector.x = Mathf.Round(vector.x); vector.y = Mathf.Round(vector.y); if (uipanel != null) { vector = uipanel.cachedTransform.TransformPoint(vector); } else if (this.container != null) { Transform parent2 = this.container.transform.parent; if (parent2 != null) { vector = parent2.TransformPoint(vector); } } vector.z = this.mTrans.position.z; } if (this.mTrans.position != vector) { this.mTrans.position = vector; } if (this.runOnlyOnce && Application.isPlaying) { base.enabled = false; } } public Camera uiCamera; public GameObject container; public UIAnchor.Side side = UIAnchor.Side.Center; public bool runOnlyOnce = true; public Vector2 relativeOffset = Vector2.zero; public Vector2 pixelOffset = Vector2.zero; [HideInInspector] [SerializeField] private UIWidget widgetContainer; private Transform mTrans; private Animation mAnim; private Rect mRect = default(Rect); private UIRoot mRoot; private bool mStarted; public enum Side { BottomLeft, Left, TopLeft, Top, TopRight, Right, BottomRight, Bottom, Center } }