목차
- 바닥 생성하게 하기
- Cube 만들어 주기
- Grid 에 맞춰서 박스 생성하기
- 바닥에만 Ray 를 쏴서 Cube 를 바닥에만 만들기
- CubeDelete 기능 구현하기
- DropDown 으로 Cube 의 색을 선택하기
바닥 생성하게 하기
변경하면 적용 될 수 있게 하는 코드
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 가 있으면, 그걸 지우고 만들어야 하니까, 그걸 지우자
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()
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 큐브를 만들어준다.
메터리얼까지 하나씩 다 복제해서 해줌
이건 각자 할 수 있죠?!
그리고 우리가 만든 Object List 에
각 큐브 넣어주기.
순서는 중요치 않음!
이제 이 리스트의 번호대로 선택해서 할거임
뭘 선택 한지 알아야 하니까, map 에 들어가서 또 만들자
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 할 때 다시 나오게 하는거 남았음!
'MapTool' 카테고리의 다른 글
MapTool (만든 Cube Json으로 Save 및 불러오기 및 생성된 Cube 리스트 관리) (0) | 2022.09.28 |
---|