선택된 UI의 좌표(X/Y/Width/Height) 보여주기
NGUI를 이용해서 UI 제작을 하면서 UI 디자이너에게서 리소스와 배치 데이터를 받아서 작업을 하는 데,
유니티 특성상 UI는 트리노드 구조를 가져서 특정 UI의 좌표가 어떤지 알기가 힘들어서 쉽게 보기 위해 대충 만들어 봤다.
당장 그냥 쓰기 위해 위치나 색깔등 대충해서 만들기..
따로 넣기도 귀찮아서 그냥 NGUI 소스인 UIWidget.cs에 추가 했다.
P.s. UI디자이너가 포토샵을 보통 쓰기때문에 NGUI가 데카르트 좌표계를 쓰고 있지만 UI디자이너가 주는 정보와 매칭되게 하기 위해서 스크린좌표계로 변환해서 보여주도록 했음.
public class UIWidget : UIRect { .... void OnDrawGizmos () { ..... #if UNITY_EDITOR // 아래 추가한 함수를 여기서 실행. ShowSelectedUICoordinate(); #endif // UNITY_EDITOR } #if UNITY_EDITOR // 에디터에서만 실행하도록.. ////// 선택된 UI의 좌표(X/Y/Width/Height) 보여주는 함수. /// 좌표계는 스크린좌표계 기준. /// void ShowSelectedUICoordinate() { // by blueasa if (UnityEditor.Selection.activeGameObject == gameObject) { // 타겟 해상도(1280x720) 자신이 원하는 해상도에 맞게 변경. float fScreenWidth = 1280f; float fScreenHeight = 720f; Camera cUICamera = UICamera.mainCamera; if (null == cUICamera) { UnityEngine.Debug.LogWarning("Can't find UICamera.."); return; } GUIStyle style = new GUIStyle(); style.normal.textColor = Color.yellow; // UI는 데카르트 좌표계이므로 스크린 좌표계로 변환해서 사용. // X/Y를 Widget 중심으로 사용하기로 해서 수정. 좌측상단 사용하려면 선택하면 될 듯.. #region X/Y Widget 중심(스크린 좌표계) //float fX = cUICamera.WorldToViewportPoint(worldCenter).x * fScreenWidth; //float fY = (1f - cUICamera.WorldToViewportPoint(worldCenter).y) * fScreenHeight; //// X/Y가 Widget의 중심이기때문에 크기가 1/2만 나오므로 원래크기를 만들기 위해 2를 곱함. //float fWidth = ((cUICamera.WorldToViewportPoint(worldCorners[3]).x * fScreenWidth) - fX) * 2f; //float fHeight = (((1f - cUICamera.WorldToViewportPoint(worldCorners[3]).y) * fScreenHeight) - fY) * 2f; #endregion #region X/Y Widget 중심(데카르트 좌표계) float fX = cUICamera.WorldToViewportPoint(worldCenter).x * fScreenWidth; float fY = cUICamera.WorldToViewportPoint(worldCenter).y * fScreenHeight; // X/Y가 Widget의 중심이기때문에 크기가 1/2만 나오므로 원래크기를 만들기 위해 2를 곱함. float fWidth = ((cUICamera.WorldToViewportPoint(worldCorners[2]).x * fScreenWidth) - fX) * 2f; float fHeight = ((cUICamera.WorldToViewportPoint(worldCorners[2]).y * fScreenHeight) - fY) * 2f; #endregion #region X/Y 좌측상단(스크린 좌표계) //float fX = cUICamera.WorldToViewportPoint(worldCorners[1]).x * fScreenWidth; //float fY = (1f - cUICamera.WorldToViewportPoint(worldCorners[1]).y) * fScreenHeight; //float fWidth = (cUICamera.WorldToViewportPoint(worldCorners[3]).x * fScreenWidth) - fX; //float fHeight = ((1f - cUICamera.WorldToViewportPoint(worldCorners[3]).y) * fScreenHeight) - fY; #endregion string strXYWH = string.Format("[X] {0:0.00}, [Y] {1:0.00} [W] {2:0.00}, [H] {3:0.00}", fX, fY, fWidth, fHeight); UnityEditor.Handles.Label(transform.position, strXYWH, style); // 참고.. //Debug.Log("worldCorners[0] " + camera.WorldToViewportPoint(worldCorners[0])); // 좌하(↙) //Debug.Log("worldCorners[1] " + camera.WorldToViewportPoint(worldCorners[1])); // 좌상(↖) //Debug.Log("worldCorners[2] " + camera.WorldToViewportPoint(worldCorners[2])); // 우상(↗) //Debug.Log("worldCorners[3] " + camera.WorldToViewportPoint(worldCorners[3])); // 우하(↘) } } #endif // UNITY_EDITOR }
출처 : Mine
'Unity3D > NGUI' 카테고리의 다른 글
NGUI Atlas Assetbundle 만들기 및 로드 하기 (0) | 2015.06.17 |
---|---|
[펌] NGUI 스크롤뷰 아이템 재사용 스크립트 (0) | 2015.06.17 |
NGUI UI의 현재 위치 표시하기[수정중] (0) | 2015.05.08 |
NGUI 다양한 해상도 대응하기 (2) | 2015.04.21 |
"Infinite Scrolling" for Unity3D Using NGUI's UIScrollView (1st attempt) (0) | 2015.03.21 |