도파민조아 MYPI

도파민조아
접속 : 4423   Lv. 51

Category

Profile

Counter

  • 오늘 : 1 명
  • 전체 : 143484 명
  • Mypi Ver. 0.3.1 β
[Unity Engine] 유니티로 퍼즐드래곤 만들기 - part1 (9) 2014/07/30 PM 05:17
이전까지 보드를 만들고 배치하는 것까지 만들었다.


이번에는 다음과 같은 것을 할것이다.
- 원소에 특성을 부여함(불,물,나무,빛,어둠,회복)
- 원소를 터치하여 이동시킴

앞으로도 그렇겠지만 점점 코딩이 들어나는군요 @_@

1.step 원소부여
새로운 c# 스크립트를 Element 라고 만든다.
이번에는 MonoBehavier를 상속받는 대신 UIDragDropItem을 상속받는다.

이 컴포넌트는 터치를 가능하게 하는 NGUI 클래스이다.
또 클래스 선언 위에
[RequireComponent(typeof(BoxCollider))]
를 넣자 BoxCollider는 터치를 하기 위해 필요한 요소임으로 이런식으로 선언해 놓으면
스크립트를 Gameobject안에 add할때 BoxCollider가 자동으로 들어간다.


이렇게 만든 스크립트를 element에 넣기 전에 일단 전에 만들었던 element를
1개만 남기고 지우자 그리고 넣으면


이렇게 BoxCollider가 자동으로 추가되는 것을 볼 수 있다.
이제 이것을 Prefab으로 등록시키자 Hierarchy에 있는 Element를 Project에 드래그하기만 하면
된다. 그럼 Hierarchy에 있는 Element가 파랗게 변경되는 걸 볼 수 있다.
이제 30개로 증식(?)시키고
Board에 있는 Rep-osition 버튼을 누른다음 실행해보자. 일단 드래그는 될것이다.

* prefab으로 등록시키면 아주 많은 이점이 있다.

2 step 원소부여(2)
일단 다 하얀색인게 마음에 안든다. 빈 Element 클래스안에 맴버 변수를 추가해주자.


type : 엘레먼트가 가지고 있는 타입(불,물...)
coord : 보드에서 현재 원소의 좌표

여기서 C++만 하던 사람이 보면 enum과 get 사용법이 조금 이상해 보일 것이다.
만... 여기서는 C#를 하는게 아니기 때문에 자세한 설명은 생략한다.
하지만 찾아서 보는걸 추천한다.

이제 type 별로 스프라이트를 바꾸거나 색상을 변경해보자.
유니티스크립트에서는 생성자를 지원하지 않는다. 하지만 다음과 같은 함수를 지원한다.

void Awake(); -> 가장만저 실행됨
void Start(); -> 모든 Awake()가 끝난뒤에 실행됨
void OnEnable(); -> 활성화 상태가 되면 실행됨.

모두 초기화를 위해 필요한 함수들인데 여기서 void OnEnable()을 사용하여 초기화를 해보자.

단순히 type에 랜덤한 값을 넣고 type값에 따라 랜덤한 색상값을 주는 함수이다.

이제 실행시켜 보면 다음과 같이 나올 것이다.


물론 어떻게든(?) 퍼즐 드래곤의 리소스만 있으면 다음과같은 과정으로 다음과같이 표현이 가능하다.(뭔소리야;;-_-)
1. 만들어진 아틀라스에 리소스를 추가한다. 이때 이름을 선언한 enum과 똑같이 만들면 좋음
2. swich - case 문을 지우고 uiSprite.spriteName = type.ToString();이렇게 추가해준다.

이렇게 하면 다음과 같이 나오지만 저작권의 철퇴가 무서우니 그냥 서클로 진행하도록 하겠다.


3. step Board Class
일단 드래그는 되지만 이상하게 동작할 것이다.

들었다가 놓은 원소가 우측 하단 끝으로 이동하는 것을 볼 수 있다.
이것을 해결하기 위해선 UITable에 있는 Sorting 방식을 변경할 필요가 있다.

일단 Board의 Insfector에서 Sorting을 None 에서 Custom으로 바꾸고


코딩질을 시작하면 된다.


여기서 특이점은
protected override void Sort(List list) 함수일 것이다.
C++에서는 듣도보도 못한 예약어인 override가 있는데 이것은 부모클래스에서
virtual로 선언된 함수를 override 한다는 소리이다. protected override void
까지 치면 부모클래스에서 무엇을 override 할 수 있는지 자동완성까지 된다.

* 1.1추가내용
클래스를 비교하기 위해서는 이런식으로 Compare 함수를 정의해서 sort함수에 넘겨준다.
자세한건 STL을 쓸때 많이 사용됨으로 해당하는 내용을 공부하면 알게된다. (외면)

* 1.2 추가내용
여기서 Sorting 방식을 Custom으로 바꾸면 Sort함수로 소팅을 하게 되는데 이것을
overriding 하면 나만의 로직을 넣을 수 있게 된다. 고 NGUI에 적혀 있다.

또, CopyPDTool 이라는 클래스가 존재한다. 이것은 이 프로젝트에서만 쓰는
전용 툴같은 함수를 모아두기 위해 선언한 클래스이다.

딱봐도 이 프로젝트에서 밖에 안 쓸 것 같은 함수이다.
NGUI도 NGUITools같은 함수가 존재한다. 이것을 보고 따라 만들어 본것이다.
(단, NGUITools는 아무 프로젝트에서나 써도 편한 함수들이 많다.)

이제 실행시켜 보면 아무것도 바뀌지 않을 것이다. 변경하는 이벤트를 설정하지 않아서인데
퍼즐앤 드래곤의 경우 잡은 드롭이 인접한 드롭에 닿을 경우 위치가 변하게 된다.

이 함수는 Element에 다음과 같이 선언해주면 된다.


위에 두 함수는 일단은 다음 마이피에서 설명하고 Board에 추가 코드를 넣는다.


이렇게 하면 다음과 같이 동작하게 된다.


다음에는 Element 추가했던 OnDragOver 함수와 떨거지(?..)를 설명하고
- 움직일때 animation 추가 하는 것
- 드롭 파.개. -> 생성
를 다루고 싶은데 어디까지나 만들면서 올리는 것이기 때문에
막히면 막히는대로 늦어집니다.

신고

 

Gun들지마    친구신청

와 대단하시네요 ㅎ 무지 복잡해 보여요

잘자염    친구신청

아 깜빡한게 있군요.
소스코드 : https://github.com/geniikw/copy-of-puzzleD/

혹시라도 만에하나 궁금한게 있으시면 답글 다시면
다음 내용에 추가될 수도 있습니다.

루리웹다삼    친구신청

친추 하고 가요 ~

hapines    친구신청

아. 본인의 프로젝트군요...

대충살면어때    친구신청

좋네요ㅎㅎ

유니티는 c#이 된다는 게

한번 쯤 만들어 보고 싶게 하는군요

잘자염    친구신청

c#이 좀 복잡한거 같아도 좀 배우면 정말 좋은 언어인구나 싶은게 느껴지더군요 ㅎㅎ

흠냐뤼    친구신청

설명 완전 잘하시네요
NGUI테이블로 만들수 있을줄은 생각도 못했네요

눌쨩    친구신청

개발자!!! 개발자는 대단!

아여름은너무덥다    친구신청

저도 개인 개발하고 있는데.. 앞으로의 내용이 많은 도움이 될거 같아서 친구추천하구 갑니다 ^^
X