본문 바로가기

MapTool

Map tool 둘째 날 (Floor 생성 버튼, Cube 생성하기, Grid 에 맞춰서 생성하기, Cube 색 선택하는 PopUp 구현하기)

목차


 

바닥 생성하게 하기

 

변경하면 적용 될 수 있게 하는 코드

 

MapEditor.cs ------> OnInspectorGUI()

이 함수 안에 작성

변경 사항이 생기면, Scene 옆에 * 표시가 나오게 하는거임

 

MapEditor.cs ------> OnInspectorGUI()

바닥생성 버튼을 만들고

안에 CreateFloor 함수를 만들자

그럼 이렇게 나오는거임

 

그리고 이렇게 할 예정

Create Empty(Floor) - 자식 Quad

만든 모습

그 후, 이걸 Prefab 으로 만들고

 

코드로 생성하기 위해 세팅을 해보자

 

Map.cs ----> 변수생성

 

MapEditor.cs -----> OnInspectorGUI() 에 작성

바닥(Floor) 프리팹을 변수에 넣는거임

 

false 이면 Prefabs 폴더의 GameObject만 넣을 수 있다

true 면 Hierarchy창 GameObject도 넣을 수 있다 (EX) Main Camera

 

Editor 로 가서 바닥 란에, 아까 생성한 Prefab 을 넣는다

 

그리고 CreateFloor함수를 작성 할 수 있는 몇가지 방법이 있는데

 

방법1

그냥 Instantiate 하기

하지만 이렇게 하면 Prefab 과 연결된 상태가 아니다.

-> 잘 사용하지 않는 방법이다.

 

방법2

Prefab 과 연결된 상태의 Instantiate 를 해보자

그럼 이렇게 프리팹과 연결이 되어있다.

 

형변환 시켜야 함 ->

 GameObject floor = (GameObject)PrefabUtility.InstantiatePrefab(map.floorFactory);

그리고, 만든 프리팹을 floor 라고 변수 지정하고,

이것의 Scale 의 x, z 값을 

우리가 가지고 있었던, 타일 가로, 타일 세로인 map.tileX, map.tileZ 를 정해준다

(EX)

엄청 많이 생성해준 모습

 

근데, 여기서 이전에 작업하던 floor 가 있으면, 그걸 지우고 만들어야 하니까, 그걸 지우자

원래 있던 floor 삭제하기


Cube 만들어 주기

이제 클릭하면 Cube 를 생성해주는 걸 해줄건데,

 

이 큐브는 

- 부모 기준으로 왼쪽 하단에 위치하게 한다

- Material 넣고

- Prefabs 에 넣는 작업을 할거임

 

어떤 말이냐면,

BlueCube 라고 해놓은 Empty GameObject 를 생성하고

그 자식으로 Cube 를 하나 생성한다.

 다음 자신 Position 을 위 처럼 생성한다.

Material 을 Blue 로 하나 만들어서, Cube 안에 넣어서 파랗게 만들어준다!

 

코드를 작성해보자

Map.cs ---->

우리는 이제 Cube 를 생성해줄 거니까

Map 스크립트에서 변수를 생성해준다.

그 후, CreateObject 함수 틀을 만들고, OnSceneGUI() 에 함수를 넣는다

 

 

MapEditor.cs ----> OnInspectorGUI()

아까, map.cs 에서 만든 변수에 프리팹을 넣는다

이걸 이제 소환 시킬거니까

 

 //BlueCube Prefab 공간

        map.blueCubeFactory = (GameObject)EditorGUILayout.ObjectField("파란 큐브", map.blueCubeFactory, typeof(GameObject), false);

 

 

이제 만든 큐브의 Prefab 까지 다 넣었다.

이 프리팹을 Ray 로 쏴서 맞은곳에 큐브를 생성시켜보자!

Event e = Event.current

=> 변경사항을 계속 update 해주고 있는거임

 

e.type 에서 MouseDown 을 해주면, (= 내가 마우스를 클릭하면) 이라는 말임

 

즉, 마우스를 클릭하면, 클릭했던 그 순간 마우스의 마우스포지션에 Ray 를 쏜다

그래서 그 Ray 가 맞으면, 해당 위치에 BlueCube 를 생성해서 놓게 하는것이다!


 

그래서 이제 해봤음

클릭했을 때, 큐브가 나오긴 함!

근데.....

 

Map 오브젝트를 클릭을 계속 해주면서 Cube 를 실행 시켜줘야 한다...

내가 클릭을 해서 큐브 프리펩이 생성되더라도 Map 에 계속 focus 가 생겼으면 좋겠다!

 

MapEditor.cs ---> OnSceneGUI()

그래서, OnSceneGUI 에 이렇게 작성한다

Scene 화면에서 계속 그 오브젝트에만 Focus 가 되어있는것이다.

 

 

이제는 클릭할 때마다 잘 된다.

하지만 만든다음에 지워주는게 여간 쉬운게 아니다.

Hierarchy 창에서 계속 하나씩 다 선택해서 지워줘야 함...

 Cube 가 생성될 때 Floor 가 부모가 된다면

Floor 에서 바닥생성 버튼을 누르는 순간, 

원래 있던 Floor 는 Destroy 되고 

Floor 가 새로 생긴다.

 

즉, 바닥 생성을 눌러 만든 Cube 를 한번에 없애 줄 수 있다는 뜻이다

 

생성하면 이렇게 됨

 

이 상태에서 '바닥생성' 버튼을 누르면 한번에 다 없앨 수 있음!

 

근데, 지금 왼쪽 마우스로 클릭했을 때만 나오게 하고싶어서 이걸 추가해준다!

e.buttom == 0 이라고 하면 왼쪽 마우스 버튼만 가능하다

0 = 왼쪽 마우스


Grid 에 맞춰서 박스 생성하기

지금 선택을 했을 때, 선택한 position 의 꼭지점 부분에서 생성이 되는데

 

우리는 이제 , Grid 에 맞춰서 생성되게 해볼거임

포인트의 x,y,z 좌표를 int 형으로 형변환 하면

소수점은 버려지고 Grid 에 맞춰서 생성될거임!


바닥에만 Ray 를 쏴서 Cube 를 바닥에만 만들기

근데 바닥에만 쏘고 싶으면?

 

바닥의 Layer 가 Floor 일 때만 생성되게 하면 됨!

  if(hit.transform.gameObject.layer == LayerMask.NameToLayer("Floor"))


Cube Delete 기능구현하기

이번에는 Delete 해보는 기능을 만들어 보자!

함수 작성

 

MapEditor.cs ---->

Ctrl키를 누른 상태에서 클릭을 하면, Ray 에 맞은 큐브가 사라지게 한 거다

 

근데 이렇게 하면,

오류가 뜬다.

 

왜냐하면, 우리는 아까 빈게임오브젝트로 BlueCube 를 만들고 Cube 를 자식에 놨었다.

 

BlueCube 의 자식에 있는 Cube에만 Collider 가 있기 때문에

 

그렇기 때문에 자식에 있던 Collider 를 부모에게 넣자!!

 

 

자식 Cube 에 있는 Collider 를 삭제하고

부모에 Box Collider 를 넣고

Center 를 0.5 0.5 0.5 로 바꾸자 (콜라이더 위치 바꾸려고)

BlueCube 의 Layer 를 Object 로 만들고 해보면

 

Ctrl 이랑 마우스로 클릭하면 지워짐


DropDown 으로 Cube 의 색을 선택하기

Inspector 창에서 DropDown을 생성해서 거기서 색을 정한 Cube 로 

Cube 가 나오게 해줄거다!

 

Map.cs ---->

GameObject 를 담는 배열을 Map.cs 에서 하나 생성한다

빨강, 파랑, 초록 큐브를 넣을 예정!

 

MapEditor.cs ---> ( OnIspectorGUI() )

여기에 이렇게 작성

저게 한 세트임

변경된걸 체크해주는 코드임

 

dropDown 에서 선택한 후, 변경된걸 알려줘야 바뀐 프리펩 큐브를 나오게 할 수 있기 때문이다.

 

(참고) base.OnInspectorGUI 가 있다면?

더보기

사실 위에 base.OnInspectorGUI 가 있으면 이거 안해줘도 되는데

없애고 우리가 커스텀 하려고 이렇게 계속 코드를 작성해주는거임

 


BlueCube 에서 복제 한 후,

Red, Green 큐브를 만들어준다.

메터리얼까지 하나씩 다 복제해서 해줌

 

이건 각자 할 수 있죠?!

Cube 프리펩 복제해서 만들어주기
메터리얼도 복제해서 만들어주기

 

자식 Cube 에 Material 넣으면 됩니다!

 

그리고 우리가 만든 Object List 에

각 큐브 넣어주기.

순서는 중요치 않음!

 

이제 이 리스트의 번호대로 선택해서 할거임

 

뭘 선택 한지 알아야 하니까, map 에 들어가서 또 만들자

 

이런 DropDown 을 만들어 볼거임

map.cs ------->

변수 생성

 

MapEditor.cs ---->

여기서 위에서 작성한, 아까 cube 들이 들어간 Object 리스트들의

이름을 담을 리스트 변수 생성

 

(참고) MapEditor 와 Map 에서 변수 선언하는것의 차이

더보기

Map 에서 사용한 변수들은 focus 를 다른데다 주고 와도 유지가 되지만,

Editor 에서 사용한 변수들은 focus 를 잃고 오면 유지가 안됨. 그냥 초기화 된다!

 

MapEditor.cs ----> OnEnable()

이름 배열을 만들어주고

for문으로 각각 큐브들의 이름을 넣어준다

 

이렇게 되면, Inspector 창에서 넣어준 순서대로, objectListName 리스트에 각 이름이 들어간다!

 

그 후,

MapEditor.cs -----> OnInspectorGUI() 에서

------>

Popup 메소드로, 만들애들, 각각의 이름

을 넣은 드랍다운을 만든다

Isnpector 창에 가보면 이렇게 뜬다 이제!

 

 

MapEditor.cs ------>CreateObject()

 

여기서 위처럼 수정한다!

 

생성 할 때, dropDown 에서 선택한 번호의 오브젝트를 생성하겠다는 거임

이렇게 하면, 선택한 Cube 를 생성할 수 있다!

 


이제 Save 버튼 누르면 Load 할 때 다시 나오게 하는거 남았음!