using System; using System.Collections.Generic; using UnityEngine; [ExecuteInEditMode] [AddComponentMenu("NGUI/Interaction/NGUI Progress Bar")] public class UIProgressBar : UIWidgetContainer { public Transform cachedTransform { get { if (this.mTrans == null) { this.mTrans = base.transform; } return this.mTrans; } } public Camera cachedCamera { get { if (this.mCam == null) { this.mCam = NGUITools.FindCameraForLayer(base.gameObject.layer); } return this.mCam; } } public UIWidget foregroundWidget { get { return this.mFG; } set { if (this.mFG != value) { this.mFG = value; this.mIsDirty = true; } } } public UIWidget backgroundWidget { get { return this.mBG; } set { if (this.mBG != value) { this.mBG = value; this.mIsDirty = true; } } } public UIProgressBar.FillDirection fillDirection { get { return this.mFill; } set { if (this.mFill != value) { this.mFill = value; this.ForceUpdate(); } } } public float value { get { if (this.numberOfSteps > 1) { return Mathf.Round(this.mValue * (float)(this.numberOfSteps - 1)) / (float)(this.numberOfSteps - 1); } return this.mValue; } set { float num = Mathf.Clamp01(value); if (this.mValue != num) { float value2 = this.value; this.mValue = num; if (value2 != this.value) { this.ForceUpdate(); if (UIProgressBar.current == null && NGUITools.GetActive(this) && EventDelegate.IsValid(this.onChange)) { UIProgressBar.current = this; EventDelegate.Execute(this.onChange); UIProgressBar.current = null; } } } } } public float alpha { get { if (this.mFG != null) { return this.mFG.alpha; } if (this.mBG != null) { return this.mBG.alpha; } return 1f; } set { if (this.mFG != null) { this.mFG.alpha = value; if (this.mFG.GetComponent() != null) { this.mFG.GetComponent().enabled = (this.mFG.alpha > 0.001f); } else if (this.mFG.GetComponent() != null) { this.mFG.GetComponent().enabled = (this.mFG.alpha > 0.001f); } } if (this.mBG != null) { this.mBG.alpha = value; if (this.mBG.GetComponent() != null) { this.mBG.GetComponent().enabled = (this.mBG.alpha > 0.001f); } else if (this.mBG.GetComponent() != null) { this.mBG.GetComponent().enabled = (this.mBG.alpha > 0.001f); } } if (this.thumb != null) { UIWidget component = this.thumb.GetComponent(); if (component != null) { component.alpha = value; if (component.GetComponent() != null) { component.GetComponent().enabled = (component.alpha > 0.001f); } else if (component.GetComponent() != null) { component.GetComponent().enabled = (component.alpha > 0.001f); } } } } } protected bool isHorizontal { get { return this.mFill == UIProgressBar.FillDirection.LeftToRight || this.mFill == UIProgressBar.FillDirection.RightToLeft; } } protected bool isInverted { get { return this.mFill == UIProgressBar.FillDirection.RightToLeft || this.mFill == UIProgressBar.FillDirection.TopToBottom; } } protected void Start() { this.Upgrade(); if (Application.isPlaying) { if (this.mBG != null) { this.mBG.autoResizeBoxCollider = true; } this.OnStart(); if (UIProgressBar.current == null && this.onChange != null) { UIProgressBar.current = this; EventDelegate.Execute(this.onChange); UIProgressBar.current = null; } } this.ForceUpdate(); } protected virtual void Upgrade() { } protected virtual void OnStart() { } protected void Update() { if (this.mIsDirty) { this.ForceUpdate(); } } protected void OnValidate() { if (NGUITools.GetActive(this)) { this.Upgrade(); this.mIsDirty = true; float num = Mathf.Clamp01(this.mValue); if (this.mValue != num) { this.mValue = num; } if (this.numberOfSteps < 0) { this.numberOfSteps = 0; } else if (this.numberOfSteps > 20) { this.numberOfSteps = 20; } this.ForceUpdate(); } else { float num2 = Mathf.Clamp01(this.mValue); if (this.mValue != num2) { this.mValue = num2; } if (this.numberOfSteps < 0) { this.numberOfSteps = 0; } else if (this.numberOfSteps > 20) { this.numberOfSteps = 20; } } } protected float ScreenToValue(Vector2 screenPos) { Transform cachedTransform = this.cachedTransform; Plane plane = new Plane(cachedTransform.rotation * Vector3.back, cachedTransform.position); Ray ray = this.cachedCamera.ScreenPointToRay(screenPos); float distance; if (!plane.Raycast(ray, out distance)) { return this.value; } return this.LocalToValue(cachedTransform.InverseTransformPoint(ray.GetPoint(distance))); } protected virtual float LocalToValue(Vector2 localPos) { if (!(this.mFG != null)) { return this.value; } Vector3[] localCorners = this.mFG.localCorners; Vector3 vector = localCorners[2] - localCorners[0]; if (this.isHorizontal) { float num = (localPos.x - localCorners[0].x) / vector.x; return (!this.isInverted) ? num : (1f - num); } float num2 = (localPos.y - localCorners[0].y) / vector.y; return (!this.isInverted) ? num2 : (1f - num2); } public virtual void ForceUpdate() { this.mIsDirty = false; if (this.mFG != null) { UIBasicSprite uibasicSprite = this.mFG as UIBasicSprite; if (this.isHorizontal) { if (uibasicSprite != null && uibasicSprite.type == UIBasicSprite.Type.Filled) { if (uibasicSprite.fillDirection == UIBasicSprite.FillDirection.Horizontal || uibasicSprite.fillDirection == UIBasicSprite.FillDirection.Vertical) { uibasicSprite.fillDirection = UIBasicSprite.FillDirection.Horizontal; uibasicSprite.invert = this.isInverted; } uibasicSprite.fillAmount = this.value; } else { this.mFG.drawRegion = ((!this.isInverted) ? new Vector4(0f, 0f, this.value, 1f) : new Vector4(1f - this.value, 0f, 1f, 1f)); this.mFG.enabled = (this.value > 0.001f); } } else if (uibasicSprite != null && uibasicSprite.type == UIBasicSprite.Type.Filled) { if (uibasicSprite.fillDirection == UIBasicSprite.FillDirection.Horizontal || uibasicSprite.fillDirection == UIBasicSprite.FillDirection.Vertical) { uibasicSprite.fillDirection = UIBasicSprite.FillDirection.Vertical; uibasicSprite.invert = this.isInverted; } uibasicSprite.fillAmount = this.value; } else { this.mFG.drawRegion = ((!this.isInverted) ? new Vector4(0f, 0f, 1f, this.value) : new Vector4(0f, 1f - this.value, 1f, 1f)); this.mFG.enabled = (this.value > 0.001f); } } if (this.thumb != null && (this.mFG != null || this.mBG != null)) { Vector3[] array = (!(this.mFG != null)) ? this.mBG.localCorners : this.mFG.localCorners; Vector4 vector = (!(this.mFG != null)) ? this.mBG.border : this.mFG.border; Vector3[] array2 = array; int num = 0; array2[num].x = array2[num].x + vector.x; Vector3[] array3 = array; int num2 = 1; array3[num2].x = array3[num2].x + vector.x; Vector3[] array4 = array; int num3 = 2; array4[num3].x = array4[num3].x - vector.z; Vector3[] array5 = array; int num4 = 3; array5[num4].x = array5[num4].x - vector.z; Vector3[] array6 = array; int num5 = 0; array6[num5].y = array6[num5].y + vector.y; Vector3[] array7 = array; int num6 = 1; array7[num6].y = array7[num6].y - vector.w; Vector3[] array8 = array; int num7 = 2; array8[num7].y = array8[num7].y - vector.w; Vector3[] array9 = array; int num8 = 3; array9[num8].y = array9[num8].y + vector.y; Transform transform = (!(this.mFG != null)) ? this.mBG.cachedTransform : this.mFG.cachedTransform; for (int i = 0; i < 4; i++) { array[i] = transform.TransformPoint(array[i]); } if (this.isHorizontal) { Vector3 a = Vector3.Lerp(array[0], array[1], 0.5f); Vector3 b = Vector3.Lerp(array[2], array[3], 0.5f); this.SetThumbPosition(Vector3.Lerp(a, b, (!this.isInverted) ? this.value : (1f - this.value))); } else { Vector3 a2 = Vector3.Lerp(array[0], array[3], 0.5f); Vector3 b2 = Vector3.Lerp(array[1], array[2], 0.5f); this.SetThumbPosition(Vector3.Lerp(a2, b2, (!this.isInverted) ? this.value : (1f - this.value))); } } } protected void SetThumbPosition(Vector3 worldPos) { Transform parent = this.thumb.parent; if (parent != null) { worldPos = parent.InverseTransformPoint(worldPos); worldPos.x = Mathf.Round(worldPos.x); worldPos.y = Mathf.Round(worldPos.y); worldPos.z = 0f; if (Vector3.Distance(this.thumb.localPosition, worldPos) > 0.001f) { this.thumb.localPosition = worldPos; } } else if (Vector3.Distance(this.thumb.position, worldPos) > 1E-05f) { this.thumb.position = worldPos; } } public static UIProgressBar current; public UIProgressBar.OnDragFinished onDragFinished; public Transform thumb; [HideInInspector] [SerializeField] protected UIWidget mBG; [HideInInspector] [SerializeField] protected UIWidget mFG; [HideInInspector] [SerializeField] protected float mValue = 1f; [HideInInspector] [SerializeField] protected UIProgressBar.FillDirection mFill; protected Transform mTrans; protected bool mIsDirty; protected Camera mCam; protected float mOffset; public int numberOfSteps; public List onChange = new List(); public enum FillDirection { LeftToRight, RightToLeft, BottomToTop, TopToBottom } public delegate void OnDragFinished(); }