language:unity:2-gui-1
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
language:unity:2-gui-1 [2013/03/07 15:25] – 바깥 편집 127.0.0.1 | language:unity:2-gui-1 [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | < | ||
+ | |||
+ | ====== 레퍼런스 ====== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ====== 위치 ====== | ||
+ | < | ||
+ | void OnGUI() { | ||
+ | // 이 함수의 안쪽. | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== GUI 요소 ====== | ||
+ | |||
+ | ===== 윈도우 ===== | ||
+ | |||
+ | * GUI.Window : 윈도우 출력 | ||
+ | * GUI.Label : 단순 텍스트 표시용. | ||
+ | * GUI.Box : 단순한 박스 생성. | ||
+ | * GUI.DrawTexture() : 텍스쳐를 특정 위치에 그린다. | ||
+ | * GUI.Button() : 버튼을 임의 위치에 작성. ([[http:// | ||
+ | * GUI.Toolbar() : 툴바를 만든다, 만드는방법에 따라 탭처럼 보이게 할 수 있다. | ||
+ | |||
+ | ====== 요소 ===== | ||
+ | * GUIContent : 화면에 표시할 gui 항목 ( 텍스트, 아이콘, 툴팁 3가지의 항목 ) | ||
+ | |||
+ | ===== 스크롤바가 들어가는 GUI요소 ===== | ||
+ | |||
+ | <code csharp> | ||
+ | float scrollPos = 0.0f; | ||
+ | scrollPos = GUI.BeginScrollView( new Rect(x, | ||
+ | List< | ||
+ | //... | ||
+ | items.Add( new GUIContent(..) ); | ||
+ | // (opt) | ||
+ | GUI.SelectionGrid( new Rect(?), 전체 아이템 개수, 아이템 리스트, 선택?, GUISkin ); | ||
+ | GUI.EndScrollView(); | ||
+ | </ | ||
+ | ====== 도우미 함수 ====== | ||
+ | * Mathf.Clamp(value, | ||
+ | |||
+ | ====== Layout Modes ====== | ||
+ | * 고정된 레이아웃 사용 : GUI 사용 | ||
+ | * 가변 레이아웃 사용시 : GUILayout 사용 | ||
+ | ===== GUILayout ===== | ||
+ | * Rect로 위치를 고정하지 않는다. | ||
+ | * 기본 위치는 왼쪽 | ||
+ | ===== Area : 임의 위치에 배치 ===== | ||
+ | |||
+ | **GUILayout.BeginArea()** 함수로 영역을 새로 설정하고, | ||
+ | 이 두 함수 사이에서 UI를 만들면 설정된 Area 안에 UI가 추가된다. | ||
+ | Area 영역에서 만들어지는 UI요소는 보이지 않는다. | ||
+ | |||
+ | UI가 만들어질 때는, 너비는 Area의 너비만큼 설정되고 위에서 아래로 만들어 간다. | ||
+ | |||
+ | <code csharp> | ||
+ | GUILayout.Button( " | ||
+ | // 화면 중간에 Area 설정 후 안쪽에 UI 요소 배치 | ||
+ | GUILayout.BeginArea( new Rect(Screen.width/ | ||
+ | GUILayout.Box( " | ||
+ | GUILayout.Button( "I am completely inside an Area" ); | ||
+ | GUILayout.Button( "2nd button" | ||
+ | GUILayout.Button( "t button" | ||
+ | GUILayout.Button( "h button" | ||
+ | GUILayout.EndArea(); | ||
+ | </ | ||
+ | |||
+ | 좌우 또는 위아래로 만들어지는 순서를 정하고 싶을 때는, | ||
+ | * 좌에서 우로 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, | ||
+ | // Begin the singular Horizontal Group | ||
+ | GUILayout.BeginHorizontal(); | ||
+ | // Place a Button normally | ||
+ | if (GUILayout.RepeatButton (" | ||
+ | maxSliderValue += 3.0f * Time.deltaTime; | ||
+ | // Arrange two more Controls vertically beside the Button | ||
+ | GUILayout.BeginVertical(); | ||
+ | GUILayout.Box(" | ||
+ | sliderValue = GUILayout.HorizontalSlider (sliderValue, | ||
+ | // End the Groups and Area | ||
+ | GUILayout.EndVertical(); | ||
+ | GUILayout.EndHorizontal(); | ||
+ | GUILayout.EndArea(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== GUILayoutOptions ==== | ||
+ | 생성시 추가 파라미터를 줄 수 있다고 한다. | ||
+ | |||
+ | 다른 설정이 없으면 Area의 100% 기본 너비로 사용하지만, | ||
+ | |||
+ | <code csharp> | ||
+ | GUILayout.BeginArea (Rect (100, 50, Screen.width-200, | ||
+ | GUILayout.Button ("I am a regular Automatic Layout Button" | ||
+ | GUILayout.Button ("My width has been overridden", | ||
+ | GUILayout.EndArea (); | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====== 화면에 맞게 GUI 확대/ | ||
+ | |||
+ | 왠지 필요 없는 부분에 신경 쓰는 거 같지만.. 일단 사용한 방법은, | ||
+ | |||
+ | - 기준이 되는 해상도를 속성으로 저장한다. | ||
+ | - 해상도가 바뀔 때마다, 화면 비율을 구한다. | ||
+ | - GUI.matrix 에 GUI 스케일 비율을 반영한다. | ||
+ | - GUI 함수 (OnGUI)에서 GUI 부분을 처리한다. | ||
+ | |||
+ | 그다지, 깔끔한 방법은 아닌 듯하지만 일단 이걸로 기본만 적용한다. | ||
+ | |||
+ | <code csharp> | ||
+ | public class GuiGameScreen : MonoBehaviour { | ||
+ | // ... 이런 저런 코드들 ... | ||
+ | |||
+ | // 기준이 되는 해상도 | ||
+ | protected float | ||
+ | protected float | ||
+ | |||
+ | // 화면 확대 비율을 구하고, 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, | ||
+ | } | ||
+ | |||
+ | // GUI 화면을 그린다. | ||
+ | void OnGUI() | ||
+ | { | ||
+ | changeGuiScale(); | ||
+ | Rect _rcScreen = new Rect( 0, 0, uiWidth, uiHeight ); // UI 그리기 시작 | ||
+ | GUILayout.BeginArea( _rcScreen ); // Area를 설정하고, | ||
+ | { | ||
+ | GUILayout.BeginHorizontal(); | ||
+ | GUILayout.Label( " | ||
+ | GUILayout.FlexibleSpace(); | ||
+ | { | ||
+ | GUILayout.BeginVertical(); | ||
+ | GUILayout.Box( " | ||
+ | GUILayout.EndVertical(); | ||
+ | } | ||
+ | GUILayout.FlexibleSpace(); | ||
+ | { | ||
+ | GUILayout.BeginVertical(); | ||
+ | GUILayout.Box( " | ||
+ | GUILayout.EndVertical(); | ||
+ | } | ||
+ | GUILayout.EndHorizontal(); | ||
+ | } | ||
+ | GUILayout.EndArea(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 그리고, \\ | ||
+ | 남은 것은, 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 ); | ||
+ | </ |