Unity Web Player. Install now! Restart your browser after install. <created with Unity>

Unity 5로 '유니티 게임제작입문' 6, 7장 Plastic Runner 게임 예제 따라하기.

* 타이틀에서 마우스 좌클릭시 게임 시작, 게임 오버시 타이틀로 돌아옴.
* 화면은 자동으로 오른쪽에서 왼쪽으로 스크롤된다.
* 마우스 좌클릭을 하면 볼이 점프를 한다. 점프는 속도와 마우스를 누르고 있는 시간에따라 얼마나 멀리 뛰는지가 결정된다.
* 볼이 구멍에 빠져 떨어지면 게임 오버.
* 텍스트 파일에서 시간에 따른 주인공 속도, 바닥 길이, 구멍 길이, 바닥 높이를 정하고 텍스트 파일을 읽어 레벨을 생성, 진행시킨다.

* 볼 앞쪽에 약간 튀어나온 부분이 블록에 걸리거나 볼이 떨어진 장소가 블록이 너무 가장자리일 경우 게임이 더이상 진행안되고 멈추는 버그가 있다.

15/10/4 일

* 주인공을 볼에서 3ds max로 모델링한 차로 변경.
* esc 키 클릭하면 타이틀 화면으로 빠져나오게 처리.
* 타이틀 화면 다듬기.
- 15/10/6 화

2015/9/28 월
* this.player = GameObject.FindGameObjectsWithTag ("Player");에서 에러가 나기에 왜 그런가 헤멨는데
this.player = GameObject.FindGameObjectWithTag ("Player");로 FindGameObjet(s)의 s를 제거해야 하는 것이었다.
* 'Player'란 이름의 Sphere 만들고 'Player' Tag 적용, PlayerControl.cs 추가
* 'Floor0', 'Floor1'란 이름의 cube 만들고 'Floor0Mat'(흰색), 'Floor1Mat'(붉은색)이란 이름의 Material 만들어 적용, 이들을 Project Tab으로 옮겨 'Floor0Prefab' 'Floor1Prefab'으로 만들기.
* Main Camera에 CameraControl.cs 추가.
* 'GameRoot'란 이름의 빈 게임 오브젝트 만들어 MapCreator.cs, BlockCreator.cs 넣기.BlockCreator.cs의 BlockPrefabs 변수에 Size 2로 하고 Element0 항목에 Floor0Prefab을, Element1 항목에 Floor1Prefab을 드래그하여 넣기.
* 플레이어 오른쪽으로 진행하게 하고 카메라는 플레이어를 동일한 속도로 따라가게 처리.
* 블록들을 동적으로 생성해 깔기.
* 화면 밖으로 스크린 반화면 분 이상 나가 보이지 않는 블록 지우기.
* 플레이어에 Rigidbody 적용, Rigidbody Contrains/Freeze Position의 z 체크, Contrains/Freeze Rotation의 X,Y,Z 체크하여 z축 이동과 x,y,z축 회전을 막기.
* 열거체:
public enum STEP{ //Player의 각종 상태를 나타내는 자료형
NONE = -1, // 상태 정보 없음
RUN = 0, //달리기
JUMP, //점프
MISS, //실패
NUM, //상태가 몇 종류인지 보여준다(=3)
};
열거체는 선풍기 다이얼 같은 것-한가지 만 선택 가능. NONE에는 -1, RUN에는 0을 명시적으로 지정, JUMP 이후 값을 지정않는데 이 경우 자동으로 1이 할당된다. 이후 차례로 2,3이란 값이 할당된다. 마지막에 NUM을 넣어 유효한 상태의 갯수를 알아낼 수 있는 꼼수. 이 경우 NUM엔 3이 들어가 상태가 3개임을 보일 수 있다.
* do{ }while(false); 라고 조건을 false로 해 두면 안의 내용은 단 한 번만 실행되고 나오게 된다. 한데 이를 이용하면 if문의 중첩이 지나치게 깊어지는 것을 막을 수 있다. if(빠져나갈 조건){break;}를 사용해 if문을 열거식으로 나열할 수 있는 것. 꽤 유용해 보이는 팁.
* Physics.Linecast(위치A, 위치B, out Raycasthit 변수);
위치 A에서 위치 B로 선을 그었을 때 그 선이 어떤 게임 오브젝트에 닿았는지 여부를 판정하는 메서드.
ex)
Vector3 s = this.transform.position; //Player의 현재위치
Vector3 e = s + Vector3.down * 1.0f; //s부터 아래로 1.0f로 이동한 위치
RaycastHit hit;
if(!Physics.Linecast(s,e,out hit)){ //s부터 e 사이에 아무것도 없을 때

* 마우스 좌클릭시 플레이어 점프 처리-오래 누를 수록 높이 점프.
* LevelControl.cs(이건 어디에도 적용시키지 않고 그냥 Project 폴더에 놔둠) 만들어 바닥에 구멍내기 처리.
* ref 인수 형태는 값만이 아닌 참조에의한 전달을 하는 것. 호출한 쪽 메서드에서 변수의 내용을 수정하고 싶을 때 사용한다. 참조에의한 인수 전달시는 호출하는 쪽과 호출되는 쪽 모두 인수에 ref를 붙여야 한다.
ex) private void clearNextBlock(ref CreationInfo block){} -호출되는 쪽
this.clearNextBlock (ref this.previousBlock); -호출하는 쪽

* 10개 블록, 5개 구멍 반복 형태 블록 생성.
주인공이 구멍에 떨어지면 '실패'로 상태 바꾸고 움직임 멈추기까지.

2015/10/4 일
* 텍스트로 레벨 디자인하고 텍스트를 불러들여 변환한 뒤 레벨로 적용하기.
* LevelControl.cs, MapCreator.cs 수정하고 Hierarchy-GameRoot의 MapCreator 스크립트 중 LevelDataText항목에 levelData.txt를 적용하기.
* Mathf.Repeat(value, max); value값이 뭐든 반드시 0~max 범위의 값 반환. max를 넘으면 value - max 값이 반환된다.
ex)Mathf.Repeat(2, 10) -> 10 반환
Mathf.Repeat(15, 10) -> 15 - 10 = 5 반환
Mathf.Repeat(22, 10) -> 22 - 10 - 10 = 2 반환

* Mathf.Clamp(value, min, max); value값이 min~max 범위 안일 경우 그대로 반환, min보다 작으면 min 반환, max보다 크면 max 반환.
* 플레이어가 착지 직전 점프 버튼을 누를 경우 착지가 되지 않았기에 점프가 되지 않는 경우를 대비하기 위해 약간의 시간 여유를 주어 착지 직전 점프 버튼 클릭하면 착지 후 점프하게 처리.
타이틀 만들고 타이틀에서 좌클릭시 게임시작, 게임 오버 되면 타이틀로 돌아오게 처리. 화면 좌상단에 현재 레벨 표시하기.