void OnGUI() { // 이 함수의 안쪽. }
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();
GUILayout.BeginArea() 함수로 영역을 새로 설정하고, GUILayout.EndArea() 함수로 영역을 설정을 종료한다. 이 두 함수 사이에서 UI를 만들면 설정된 Area 안에 UI가 추가된다. Area 영역에서 만들어지는 UI요소는 보이지 않는다.
UI가 만들어질 때는, 너비는 Area의 너비만큼 설정되고 위에서 아래로 만들어 간다.
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();
좌우 또는 위아래로 만들어지는 순서를 정하고 싶을 때는,
추가 위치는,
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(); }
생성시 추가 파라미터를 줄 수 있다고 한다.
다른 설정이 없으면 Area의 100% 기본 너비로 사용하지만, 추가 파라미터를 설정해서 너비를 임의 조절할 수 있다. (아래 예제)
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 ();
왠지 필요 없는 부분에 신경 쓰는 거 같지만.. 일단 사용한 방법은,
그다지, 깔끔한 방법은 아닌 듯하지만 일단 이걸로 기본만 적용한다.
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(); } }
그리고,
남은 것은, Aspect에 맞게 스케일을 조정하는 것인가, 왠지 이것도 괜히 신경 쓰는 것 같지만.
업그레이드 방법을 더 생각해보자. 다른 GUI 프로그램을 구매할 것 같기도 하지만..
찾아보긴했지만 안쓴 코드
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 );