본문 바로가기

프로그래밍/Unity

2D를 위한 Plane 생성

Unity3D Plane 생성

   

스크립트 마법사를 사용한 Plane 생성 루틴

   

unity3d에서의 plane은 여러개의 버텍스와 삼각 폴리곤으로

이루어져 있다. 단순한 빌보드를 표시하기 위한 용도로서는 불필요한 버텍스가 너무 많다.

이를 4개의 버텍스와 2개의 폴리곤으로 구성하기 위해 일반적으로 동적으로 메쉬필터와 렌더러를 구성하는데, 이런 경우 Play 전에는 Scene 에 정상적으로 표시되지 않아 불편한 점이 많다.

   

그래서 보통 별도의 Editor 메뉴를 등록해 생성하도록 하는데, 보다 다양한 옵션 설정이 가능한

마법사 대화상자를 이용하는 방법이 있어 소개한다.

   

링크 [ http://www.unifycommunity.com/wiki/index.php?title=CreatePlane ]

   

동적생성이 아닌 스크립트 마법사 대화상자를 통한 메쉬를 생성하는 예제이며,

Inspector와 마찬가지로 public 항목은 마법사 대화상자에 표시되어 변경이 가능하도록

구성되어 있다.

   

아래는 ScriptWizard 관련한 정리와 2D에서 사용할 간단한 plane을 만드는 예제이다.

   

0. 메뉴 아이템 만들기 : ScriptableWizard

   

우선 레퍼런스에 보면 다음과 같은 주의사항이 있다. 게임을 위한 스크립트가 아닌 에디터용 스크립트 이기에 Assets/Editor 폴더 아래에 위치해야 한다는 내용과 UnityEditor 클래스를 포함해야 한다.

   

   

ScriptableWizard Inherits from EditorWindow

Derive from this class to create an editor wizard.

   

   

Note: This is an editor class. To use it you have to place your script in Assets/Editor inside your project folder. Editor classes are in the UnityEditor namespace so for C# scripts you need to add "using UnityEditor;" at the beginning of the script.

   

아래는 구현해야하는 요소들이다.

   

> 어느 메뉴에 추가할지 지정하고, 스크립트 위자드에서 호출할 static 함수를 작성한다.

> 그리고 마법사 대화상자를 보인다.(버튼은 생성, 적용 버튼임)

[MenuItem("GameObject/Create My Object"] 

static void CreateWizard()

{

ScriptableWizard.DisplayWizard<클래스명>("제목", "버튼1", "버튼2");

// ScriptableWizard.DisplayWizard("제목", typeof(클래스명), "버튼1", "버튼2" );

}

   

> 대화상자가 표시되고 나면 아래 메쏘드가 호출되고, 각 값 변경시에도 주기적으로 호출된다.

 이 메쏘드에서 유효값 검사나 메시지등을 표시할 수 있다.

void OnWizardUpdate()

   

각 버튼의 호출은 아래와 같다.

> 버튼 1 : void OnWizrdCreate()

   

> 버튼 2 : void OnWizardOtherButton()

   

1. 플렌 오브젝트 만들기

   

// Create 버튼 클릭 시 오브젝트 생성하기

void OnWizardCreate()

{

// GameObject 생성

GameObject plane = new GameObject();

   

// 포지션 설정

plane.transform.position = cam.transform.position + cam.transform.forward * 5.0f;

   

// 메쉬필터 등록

MeshFilter meshFilter = plane.AddComponent<MeshFilter>();

   

// 메쉬 렌더러 등록

MeshRenderer meshRenderer = plane.AddComponent<MeshRenderer>();

   

// 메쉬 생성

Mesh m = new Mesh();

   

// 버텍스 설정 : 원하는 형태로 버텍스를 지정한다.

// 위 위키 예제에서는 방향, 사이즈 등을 고려해 버텍스를 추가하고 있음.

mesh.vertices = new Vector3[] {

new Vector3( -0.5f, 0.5f, 0.0f), new Vector3( 0.5f, 0.5f,0.0f),

new  Vector3( -0.5f, -0.5f, 0.0f), new Vector3(0.5f, -0.5f, -0.5f)

};

   

// 텍스처 맵핑을 위한 uv 값을 지정한다.

// 단순한 2d용 플랜이므로 간단히 지정.

// 원점 좌표가 좌하단이 0,0 이므로 uv를 뒤집어 적용 시켰다.

mesh.uv = new Vector2[] {

new Vector2(0.0f, 1.0f) , new Vector2(1.0f, 1.0f),

new Vector2(0.0f, 0.0f), new Vector2(1.0f, 0.0f)

};

   

// 버텍스 연결 순서

mesh.triangles = new int[] {0,1,2,2,1,3};

   

mesh.RecalculateNormals();

   

2. 생성한 메쉬를 Project에 저장

AssetDatabase.CreateAsset( m , "Assets/Editor/" + 이름);

AssetDatabase.SaveAssets();

   

3. 메쉬 필터에 메쉬 설정

meshFilter.sharedMesh = m;

m.RecalculateBounds();

   

4. 필요한 경우 collider 추가한다.

plane.AddComponent<BoxCollider>();

   

5. 마무리

Selection.activeObject = plane;

}

   

끝.

   


'프로그래밍 > Unity' 카테고리의 다른 글

[Unity] AssetDatabase  (0) 2018.09.12
[Unity] AssetBundle  (0) 2018.08.24
[unity3d] 서피스 쉐이더 정리  (1) 2018.06.26
[Unity] Mesh 생성 및 변경  (0) 2011.06.24
[Unity] 인스펙터에 UI 추가하기  (0) 2011.06.15
Physics.Raycast  (0) 2011.05.13
2D 게임을 위한 몇가지  (0) 2011.05.09
터치 입력  (0) 2011.04.04
스크립트에서 오브젝트/컴포넌트 접근 및 활성화  (0) 2011.02.11
강체-RigidBody 기본속성  (0) 2011.02.03