사용자 도구

사이트 도구


language:unity:2-gui-1

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
language:unity:2-gui-1 [2014/01/05 17:24] kieunslanguage:unity:2-gui-1 [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
  
 +<note>UnityUI가 추가 되어서, 쓸모 없는 내용이 되었다.</note>
 +
 +====== 레퍼런스 ======
 +  * [[http://docs.unity3d.com/Documentation/Components/gui-Basics.html|GUI Basics]]
 +  * [[http://docs.unity3d.com/Documentation/Components/gui-Layout.html|GUILayout]]
 +
 +====== 위치 ======
 +<code>
 +void OnGUI() {
 +  // 이 함수의 안쪽.
 +}
 +</code>
 +
 +====== GUI 요소 ======
 +
 +===== 윈도우 =====
 +
 +  * GUI.Window : 윈도우 출력
 +  * GUI.Label : 단순 텍스트 표시용.
 +  * GUI.Box : 단순한 박스 생성.
 +  * GUI.DrawTexture() : 텍스쳐를 특정 위치에 그린다.
 +  * GUI.Button() : 버튼을 임의 위치에 작성. ([[http://docs.unity3d.com/Documentation/ScriptReference/GUI.Button.html|도움말]])
 +  * GUI.Toolbar() : 툴바를 만든다, 만드는방법에 따라 탭처럼 보이게 할 수 있다.
 +
 +====== 요소 =====
 +  * GUIContent : 화면에 표시할 gui 항목 ( 텍스트, 아이콘, 툴팁 3가지의 항목 )
 +
 +===== 스크롤바가 들어가는 GUI요소 =====
 +
 +<code csharp>
 +float scrollPos = 0.0f;
 +scrollPos = GUI.BeginScrollView( new Rect(x,x,x,x), scrollPos, new Rect(스크롤 영역의 크기) );
 +List<GUIContent> items = new List<GUIContent>();
 +//...
 +items.Add( new GUIContent(..) );
 +// (opt)
 +GUI.SelectionGrid( new Rect(?), 전체 아이템 개수, 아이템 리스트, 선택?, GUISkin );
 +GUI.EndScrollView();
 +</code>
 +====== 도우미 함수 ======
 +  * Mathf.Clamp(value,min,max) : value가 (min~max)를 넘지 않게 한다.
 +
 +====== Layout Modes ======
 +  * 고정된 레이아웃 사용 : GUI 사용
 +  * 가변 레이아웃 사용시 : GUILayout 사용
 +===== GUILayout =====
 +  * Rect로 위치를 고정하지 않는다.
 +  * 기본 위치는 왼쪽  상단으로 고정.
 +===== Area : 임의 위치에 배치 =====
 +
 +**GUILayout.BeginArea()** 함수로 영역을 새로 설정하고, **GUILayout.EndArea()** 함수로 영역을 설정을 종료한다.
 +이 두 함수 사이에서 UI를 만들면 설정된 Area 안에 UI가 추가된다. 
 +Area 영역에서 만들어지는 UI요소는 보이지 않는다.
 +
 +UI가 만들어질 때는, 너비는 Area의 너비만큼 설정되고 위에서 아래로 만들어 간다.
 +
 +<code csharp>
 +GUILayout.Button( "LeftTop" ); // 왼쪽 상단에 생성
 +// 화면 중간에 Area 설정 후 안쪽에 UI 요소 배치
 +GUILayout.BeginArea( new Rect(Screen.width/2, Screen.height/2, 200, 150) );
 +  GUILayout.Box( "box" );
 +  GUILayout.Button( "I am completely inside an Area" );
 +  GUILayout.Button( "2nd button" );
 + GUILayout.Button( "t button" );
 + GUILayout.Button( "h button" );
 +GUILayout.EndArea();
 +</code>
 +
 +좌우 또는 위아래로 만들어지는 순서를 정하고 싶을 때는, 
 +  * 좌에서 우로 UI 생성 : GUILayout.BeginHorizontal() ~ GUILayout.EndHorizontal()
 +  * 위에서 아래로 : GUILayout.BeginVertical() ~ GUILayout.EndVertical()
 +추가 위치는,
 +  * (GUILayout.BeginArea() ~ GUILayout.EndArea()) 영역 설정 안쪽에서 사용한다.
 +  * 중첩 시켜서 사용 가능하다.
 +
 +<code csharp>
 +private float sliderValue = 1.0f;
 +private float maxSliderValue = 10.0f;
 +
 +void test5_autolayout()
 +{
 +  // Wrap everything in the designated GUI Area
 +  GUILayout.BeginArea (new Rect (0,0,200,60));
 +    // Begin the singular Horizontal Group
 +    GUILayout.BeginHorizontal();
 +      // Place a Button normally
 +      if (GUILayout.RepeatButton ("Increase max\nSlider Value"))
 +        maxSliderValue += 3.0f * Time.deltaTime;
 +      // Arrange two more Controls vertically beside the Button
 +      GUILayout.BeginVertical();
 +        GUILayout.Box("Slider Value: " + Mathf.Round(sliderValue));
 +        sliderValue = GUILayout.HorizontalSlider (sliderValue, 0.0f, maxSliderValue);
 +        // End the Groups and Area
 +      GUILayout.EndVertical();
 +    GUILayout.EndHorizontal();
 +  GUILayout.EndArea();
 +}
 +</code>
 +
 +==== GUILayoutOptions ====
 +생성시 추가 파라미터를 줄 수 있다고 한다.
 +
 +다른 설정이 없으면 Area의 100% 기본 너비로 사용하지만, 추가 파라미터를 설정해서 너비를 임의 조절할 수 있다. (아래 예제)
 +
 +<code csharp>
 +GUILayout.BeginArea (Rect (100, 50, Screen.width-200, Screen.height-100));
 +GUILayout.Button ("I am a regular Automatic Layout Button");
 +GUILayout.Button ("My width has been overridden", GUILayout.Width (95));
 +GUILayout.EndArea ();
 +</code>
 +
 +
 +====== 화면에 맞게 GUI 확대/축소 ======
 +
 +왠지 필요 없는 부분에 신경 쓰는 거 같지만.. 일단 사용한 방법은,
 +
 +  - 기준이 되는 해상도를 속성으로 저장한다.
 +  - 해상도가 바뀔 때마다, 화면 비율을 구한다.
 +  - GUI.matrix 에 GUI 스케일 비율을 반영한다.
 +  - GUI 함수 (OnGUI)에서 GUI 부분을 처리한다.
 +
 +그다지, 깔끔한 방법은 아닌 듯하지만 일단 이걸로 기본만 적용한다.
 +
 +<code csharp>
 +public class GuiGameScreen : MonoBehaviour {
 +// ... 이런 저런 코드들 ...
 +
 +// 기준이 되는 해상도
 +protected float   uiWidth = 768f;
 +protected float   uiHeight = 1024f;
 +
 +// 화면 확대 비율을 구하고, GUI에 적용한다.
 +void changeGuiScale()
 +{
 + // 화면 방향에 따라 기준 해상도 변경, 그다지 효과는 ...
 + if( Camera.main.aspect > 1.0f ) { // wide
 + uiWidth = 1024f; uiHeight = 768f;
 + }
 + else { // tall
 + uiWidth = 768f; uiHeight = 1024f;
 + }
 + // 화면 비율 계산
 + float _xScale = (float)Screen.width / uiWidth;
 + float _yScale = (float)Screen.height / uiHeight;
 + // GUI에 확대/축소 비율 적용
 + GUI.matrix = Matrix4x4.TRS( Vector3.zero, Quaternion.identity, new Vector3(_xScale, _yScale, 1) );
 +}
 +
 +// GUI 화면을 그린다.
 +void OnGUI()
 +{
 + changeGuiScale(); // GUI에 확대/축소 비율을 정한다. 확인하기 편하게 여기에다가 넣었다.
 + Rect _rcScreen = new Rect( 0, 0, uiWidth, uiHeight ); // UI 그리기 시작  - Area크기는 미리 정한 해상도만큼.
 + GUILayout.BeginArea( _rcScreen ); // Area를 설정하고, AutoLayout으로 UI 요소를 테스트용으로 아무거나 넣었다.
 + {
 + GUILayout.BeginHorizontal();
 + GUILayout.Label( "T1" );
 + GUILayout.FlexibleSpace();
 + {
 + GUILayout.BeginVertical();
 + GUILayout.Box( "T2" ); GUILayout.Box( "LeftCoin" );
 + GUILayout.EndVertical();
 + }
 + GUILayout.FlexibleSpace();
 + {
 + GUILayout.BeginVertical();
 + GUILayout.Box( "T3" ); GUILayout.Box( "T4" );
 + GUILayout.EndVertical();
 + }
 + GUILayout.EndHorizontal();
 + }
 + GUILayout.EndArea();
 +}
 +}  
 +</code>
 +
 +그리고, \\
 +남은 것은, Aspect에 맞게 스케일을 조정하는 것인가, 왠지 이것도 괜히 신경 쓰는 것 같지만.
 +
 +업그레이드 방법을 더 생각해보자. 다른 GUI 프로그램을 구매할 것 같기도 하지만..
 +
 +찾아보긴했지만 안쓴 코드
 +
 +<code csharp>
 +float _xScale = (float)Screen.width / uiWidth;
 +float _yScale = (float)Screen.height / uiHeight;
 +
 +Vector2 scale = new Vector2( _xScale, 1.0f );
 +Vector2 pivotPoint;
 +pivotPoint = new Vector2( Screen.width * 0.5f, 0 );
 +
 +// pivotPoint를 중심으로 scale 만큼 확대 축소한다. 이것도 기억해두면 좋을 것 같아서 메모.
 +GUIUtility.ScaleAroundPivot( scale, pivotPoint );
 +</code>