Nextrek
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
//----------------------------------------------
// NGUI: Next-Gen UI kit
// Copyright © 2011-2013 Tasharen Entertainment
//----------------------------------------------
using UnityEngine;
/// <summary>
/// Ever wanted to be able to auto-center on an object within a draggable panel?
/// Attach this script to the container that has the objects to center on as its children.
/// </summary>
[AddComponentMenu("NGUI/Interaction/Center Panel On Child")]
public class UICenterOnChild : MonoBehaviour
{
/// <summary>
/// The strength of the spring.
/// </summary>
public float springStrength = 8f;
/// <summary>
/// Callback to be triggered when the centering operation completes.
/// </summary>
public SpringPanel.OnFinished onFinished;
UIScrollView mDrag;
GameObject mCenteredObject;
/// <summary>
/// Game object that the draggable panel is currently centered on.
/// </summary>
public GameObject centeredObject { get { return mCenteredObject; } }
void OnEnable () { Recenter(); }
void OnDragFinished () { if (enabled) Recenter(); }
/// <summary>
/// Recenter the draggable list on the center-most child.
/// </summary>
public void Recenter ()
{
if (mDrag == null)
{
mDrag = NGUITools.FindInParents<UIScrollView>(gameObject);
if (mDrag == null)
{
Debug.LogWarning(GetType() + " requires " + typeof(UIScrollView) + " on a parent object in order to work", this);
enabled = false;
return;
}
else
{
mDrag.onDragFinished = OnDragFinished;
if (mDrag.horizontalScrollBar != null)
mDrag.horizontalScrollBar.onDragFinished = OnDragFinished;
if (mDrag.verticalScrollBar != null)
mDrag.verticalScrollBar.onDragFinished = OnDragFinished;
}
}
if (mDrag.panel == null) return;
// Calculate the panel's center in world coordinates
Vector3[] corners = mDrag.panel.worldCorners;
Vector3 panelCenter = (corners[2] + corners[0]) * 0.5f;
// Offset this value by the momentum
Vector3 pickingPoint = panelCenter - mDrag.currentMomentum * (mDrag.momentumAmount * 0.1f);
mDrag.currentMomentum = Vector3.zero;
float min = float.MaxValue;
Transform closest = null;
Transform trans = transform;
// Determine the closest child
for (int i = 0, imax = trans.childCount; i < imax; ++i)
{
Transform t = trans.GetChild(i);
float sqrDist = Vector3.SqrMagnitude(t.position - pickingPoint);
if (sqrDist < min)
{
min = sqrDist;
closest = t;
}
}
CenterOn(closest, panelCenter);
}
/// <summary>
/// Center the panel on the specified target.
/// </summary>
void CenterOn (Transform target, Vector3 panelCenter)
{
if (target != null && mDrag != null && mDrag.panel != null)
{
Transform panelTrans = mDrag.panel.cachedTransform;
mCenteredObject = target.gameObject;
// Figure out the difference between the chosen child and the panel's center in local coordinates
Vector3 cp = panelTrans.InverseTransformPoint(target.position);
Vector3 cc = panelTrans.InverseTransformPoint(panelCenter);
Vector3 localOffset = cp - cc;
// Offset shouldn't occur if blocked
if (!mDrag.canMoveHorizontally) localOffset.x = 0f;
if (!mDrag.canMoveVertically) localOffset.y = 0f;
localOffset.z = 0f;
// Spring the panel to this calculated position
SpringPanel.Begin(mDrag.panel.cachedGameObject,
panelTrans.localPosition - localOffset, springStrength).onFinished = onFinished;
}
else mCenteredObject = null;
}
/// <summary>
/// Center the panel on the specified target.
/// </summary>
public void CenterOn (Transform target)
{
if (mDrag != null && mDrag.panel != null)
{
Vector3[] corners = mDrag.panel.worldCorners;
Vector3 panelCenter = (corners[2] + corners[0]) * 0.5f;
CenterOn(target, panelCenter);
}
}
}
|
Revision |
Author |
Commited |
Message |
83
|
FMMortaroli
|
Tue 13 May, 2014 11:32:51 +0000 |
|