연재

[자작] 유니티로 게임을 만들자! -5- 슬라임 반격!편인데 슬라임은 이제 무쓸모

안녕~


1편 http://www.dogdrip.net/index.php?mid=userdog&search_target=nick_name&search_keyword=Go2Heaven&document_srl=49900277&page=1

2편 http://www.dogdrip.net/49909933

3편 http://www.dogdrip.net/49913932

4편 http://www.dogdrip.net/49919851


어제까지는 히어로가 마우스 클릭하면 앞으로 전진하고 슬라임을 밀어서 떨어 뜨리는 것까지 구현했지?


아래에서 지금까지의 결과물을 확인할 수 있음.


http://unitydatas.besaba.com/InfiniteHero/


그리고 오늘의 결과물은 여기서 확인 가능.


http://unitydatas.besaba.com/InfiniteHero2/

망할 크롬 포커스가 안잡히니 실행후에 재빨리 다른 텝을 클릭하고 다시 돌아와서 클릭해야 클릭이 먹는다.


그럼 시작하자.


[슬라임 움직이기]

먼저 슬라임을 움직이려면 스크립트가 있어야 겠지?


히어로 스크립트 생성한것 처럼 생성하자.


Assets에서 우클릭 Create > C# Script


.1.png



이름은 당근 csSlime


그리고 이 스크립트 파일을 드래그앤 드랍으로 Hierarchy에 있는 slime오브젝트에 투척!


그러면 Hierarchy에 있는 slime 오브젝트에 csSlime이 붙는거야.


이제 csSlime을 더블클릭해서 MonoDevelop으로 열어 보자.


아래 코드를 복붙하고 저장하자.


using UnityEngine;

using System.Collections;


public class csSlime : MonoBehaviour {

//슬라임에게 히어로를 알려주기 위한 변수

public GameObject player;


void Start () {

}


//슬라임이 움직일 속도

float speed = 1.0f;

void Update () 

{

//transform은 좌표,크기,회전을 가지고 있는 변수

//transform.position은 좌표를 가지고 있는 변수야

//이넘은 모든 오브젝트가 가지고 있어

//슬라임의 x좌표가 플레이어의 x좌표보다 작으면

if (transform.position.x < player.transform.position.x)

{

//속도 * 시간 만큼 움직임.

transform.Translate(speed*Time.deltaTime,0,0);


Vector3 scale = transform.localScale;

scale.x = -5;

transform.localScale = scale;

}

else

{

//속도 * 시간 * -1 즉 반대방향으로 움직임.

transform.Translate(speed*Time.deltaTime*-1,0,0);


Vector3 scale = transform.localScale;

scale.x = 5;

transform.localScale = scale;

}

}


//충돌하면 호출되는 함수

void OnCollisionEnter2D(Collision2D collision)

{

//collision은 나랑 충돌한 물체

//나랑 충돌한 물체가 player라면

if (collision.gameObject == player)

{

//x좌표를 비교해서 뒤로 넉백시킨다.

if (transform.position.x < player.transform.position.x)

{

transform.Translate(-0.5f,0,0);

}

else

{

transform.Translate(0.5f,0,0);

}

}

}

}


플레이어의 좌표를 알아야 슬라임이 움직이겠지?


public GameObject player;


public 남들이 다 볼 수 있게 GameObject라는 형태의 player라는 변수를 추가한다는 뜻임.

public 을 앞에 붙여주면 나중에 Inspector에서 값을 수정할 수 있어.

Hierarchy의 slime오브젝트를 클릭한 후 Inspector를 보면 맨아래에 Cs Slime (Script)라고 추가되어 있을 꺼임.

거기의 Player에다가 Hierarchy에 있는 hero를 투척하자.


2.png


그리고 MonoDevelop으로 돌아 와서 void Update()함수의 { } 안에 슬라임의 움직임을 구현하면됨.

Update()함수는 오브젝트가 없어질때까지 계속 호출되는 함수야.


float speed = 1.0f;


speed는 1.0f이고,


if (transform.position.x < player.transform.position.x)


플레이어의 x좌표에 따라서 좌우로 움직이게 됨.


transform.Translate(speed * Time.deltaTime , 0 , 0);


transform.Translate(speed * Time.deltaTime * -1 , 0 , 0);


transform은 지금 붙어있는 오브젝트의 좌표,크기,회전 등을 가지고 있는 변수인데, 여기다가 Translate()함수를 호출하면 움직인다.

안에 들어 있는 값은 speed (1.0f) 곱하기 Time.deltaTime (지금까지 흘러간시간) 에다가 반대로 움직일 때만 곱하기 -1을 해줬어.

Y축과 Z축은 변화할 필요가 없으므로 0이고,


Update()함수는 메 프레임마다 호출되는 함수야.

프레임은 게임을 좀 하는 사람은 잘 알겠지만 게임하면 몇 프레임 나온다 그거 있지?

1초에 몇 프레임을 보여줄 수 있나가 fps 프레임퍼세컨트 이지.

Time.deltaTime은 이전 프레임으로 부터 몇초가 지났냐임.


이제 실행해 보면 플레이어를 향해서 슬라임이 움직이고 플레이어와 충돌하면 뒤로 밀림.


[히어로의 동작 수정]

전에는 히어로는 클릭할때만 움직였지?


기본 동작으로 한방향으로 계속 움직이다가 클릭하면 반대방향으로 움직이도록 하자.


Assets에 있는 csHero를 더블클릭해서 열자.

복붙하고 코드를 살펴 보자.


using UnityEngine;

using System.Collections;


public class csHero : MonoBehaviour {

int direction = 1; //히어로의 방향 처음에는 + 방향

float speed = 2.0f; //움직일 speed

void Start () {

}

void Update () 

{

//클릭 또는 터치를 하면

if (Input.GetButtonDown("Fire1") == true)

{

//방향을 반대로 1이면 -1이되고 -1이면 1이 되겠지?

direction = direction * -1;


//방향에 따라서 히어로의 그림을 뒤집기 위한 코드

Vector3 scale = transform.localScale;

scale.x = scale.x * -1;

transform.localScale = scale;

}

//속도 * 시간 * 방향 만큼 X좌표를 움직여라

transform.Translate(speed*Time.deltaTime*direction,0,0);

}

}


[하늘에서 불덩이가 떨어진다]


원래 기획이 없이 진행하다 보니 이게 뭔가 싶을 정도로 정리가 안되고,

생각보다 스크립트 사용이 많아 지고 있어.

그래서 원래 의도에 맞게 단순하게 변경해야 할것 같아.

첨부터 욕심이 과했다.


하늘에서 불덩이가 떨어지도록 해보자.

그걸 용사가 피하도록해서 단순 똥피하기류의 게임으로 급선회할께~


먼저 fire.png 불덩이를 그리고 Assets폴더에 넣어.

그다음은 알지? Assets에서 fire그림을 선택하고 Inspector에서 Filter Mode를 Point로 Format을 16bits로 변경.

Hierarchy에 추가하고 Scale X,Y를 5로변경.

Add Component에서 콜라이더와 리지드바디를 추가해

좌표는 대략 0,4로 줬어.


3.png


실행시켜 보면 불덩이가 땅위에 있지?


이러면 바닥에 쌓이니깐 땅을 뚫고 나가게 해야 겠다.

콜라이더를 보면 Is Trigger라는 게 있음.

이걸 체크해주면 땅을 뚫고 지나가게됨.


5.png


그리고 땅을 뚫고 지하 5000m의 천연암반수를 찾을 때까지 내려가겠지.


그걸 방지하기 위해서 적당히 내려가면 스스로 삭제되도록 하자.


스크립트를 만들고 이름은 csFire 그걸 Hierarchy에 있는 fire에 붙이고, csFire를 더블클릭해서 열어보자.

이거는 몇번해봐서 이제 쉬울꺼임.


그다음은 복붙!


using UnityEngine;

using System.Collections;


public class csFire : MonoBehaviour {


// Use this for initialization

void Start () {

}


void Update () 

{

//y좌표가 -10보다 작아지면

if (transform.position.y < -10)

{

//파/개/한/다

Destroy(gameObject);

}

}

}


실행시켜 놓고 Hierarchy를 보고 있으면 fire가 사라지는걸 볼 수 있지.

[파이어볼 동적생성]

불덩이 하나만 피하면 게임같지 않을 꺼야.

ㅇㅇ

그러므로 동적으로 불덩이를 계속 생성해 주자.


이제 하나 중요한 용어가 나옴.

Prefab 라는 용어야.


이거는 뭐냐면 Hierarchy에 있는 오브젝트를 그때 그때 복사해서 만들지 않고 코드상에서 불러 올수 있게 해주는 거라고 생각하면됨.

만드는것은 간단해 Hierarchy에 있는 fire오브젝트를 선택해서 Assets으로 드래그앤 드랍하면 됨.

4.png

이제 Assets에 fire Prefab이 생성되었어. slime도 똑같이 드래그앤 드랍해주자.

이렇게 생성된 Prefab을 이용해서 하나씩 불덩이를 떨어뜨릴꺼임.


그럼 불덩이를 떨어뜨리는 불덩이 생성기가 필요하겠네

Assets에 csFireManager를 만들고 열자.

그리고 복붙!


using UnityEngine;

using System.Collections;


public class csFireManager : MonoBehaviour {


//생성할 불덩이의 소스가 되는 불덩이 Prefab

public GameObject srcFire;


// Use this for initialization

void Start () {

}

//타이머

float timer =0.0f;

float timerMax = 0.3f;

void Update () 

{

//타이머에 시간을 더해 준다.

timer += Time.deltaTime;


//타이머가 0.3초보다 작으면 return시킨다.

//return되면 함수는 바로 종료되어 뒤에 부분이 실행되지 않는다.

if (timer < timerMax)

{

return;

}


//시간이 지날수록 어렵게 하기 위해서

//0.15초 이상일 경우 0.01초씩 max값을 줄여 준다.

//이렇게 되면 첫 불덩이는 0.3초만에 나오고 그 다음 부터는 0.01초씩 줄어 들어서

//최후에는 0.15초마다 불덩이가 나오게 된다.

if (timerMax > 0.15f)

{

timerMax -= 0.01f;

}

//타이머를 다시 0으로 변경하고

timer = 0;


//x좌표를 -6에서 6까지 랜덤으로 생성한다.

float randX = Random.Range(-6.0f,6.0f);


//소스 Fire 프리팹을 랜덤좌표X,7에 생성한다.

Instantiate(srcFire,new Vector3(randX,7,0),transform.rotation);

}

}


이 csFireManager역시 Hierarchy안에 있어야지만 동작하기 때문에

Hierarchy에 넣어줘야 함.

그런데 스크립트는 단독으로 Hierarchy에 존재할 수 없어서 드래그앤 드랍이 안된다.


6.png

그렇기 때문에 Menu에 있는 GameObject를 선택 하여 Create Empty를 이용해서 빈 GameObject를 생성해 준다.

그리고 GameObject에 csFireManager를 투척!


그 다음 Hierarchy에 있는 GameObject를 클릭하고 Inspector를 보면 Cs Fire Manager (Script)가 있는데 거기의 Src Fire에 아까 만든 fire프리팹을 투척한다.

Assets에 보면 fire그림파일은 불덩이 모양이 보이고 fire프리팹은 상자 모양이 보일꺼임.

이렇게 이름이 똑같으면 햇갈릴수 있으니깐 프리팹의 경우 preFire이라고 이름을 바꿔 주기도 함.

또는 Assets에 Prefabs라는 폴더를 만들어서 거기에 넣어놓고 관리하기도 하지. 아니 관리해야만 한다. 지금은 가벼운 강좌니깐 패스~

7.png



자 실행해 보면 이제 무쓸모가된 슬라임도 움직이고 하늘에서는 불덩이가 쏟아진다.


다음장에서 마무리될 듯~




9개의 댓글

2014.05.21
다음장에서는 플레이어와 불덩이 충돌.
게임오버.
플레이 타임.
베스트 스코어.
레벨 벨런스 조정 등을 할 예정이야.

거창하게 시작한 똥피하기 + RPG였는데 RPG까지 할려면 스크립트 지옥이 될듯ㅠ.ㅠ
0
2014.05.21
와 신기하다 ㅋㅋㅋ
0
2014.05.21
@하안동
신기할꺼 까지야 ㅎㅎ
0
2014.05.21
이미 어느정도 자신이 프로그래밍을 할수 있다 라는 게이들에게는 쉽게 설명은 되있는데..
이제 막 배우기 시작한 꼬꼬마 프로그래머들은 저게 뭔소리여~ 라는 소릴 할지도 모르겠음
(아직 객체지향이라는 것을 모르는 플머로 합시다.. 그렇다고 객체지향 못한다고 못하는게 아니라구..)
천천히 배워가다보면 알게되겠지만...

너무 잘 써줘준거에 대해서 아쉬운 소리를 하자면..

좀더 써줘... ㅋㅋㅋ


마지막으로 자신이 플머로 살아가려는 지망생들에게 한마디 쓰지면
요즘 유니티3D 많이 쓰고 있음...
이걸로 포플 해서 제출하는 경우도 상당하니 이 강좌를 게임으로만 보지 말고
다른 프로그램을 짤 수 있도록 연습하는것도 상당히 득이 될꺼라 생각됨


ps. 유니티가.. 썩을 플레폼에 따라 따로 파는게 그지같은거 뿐이지 상당히 좋은 프로그램임..
따라서 금전적 여유가 있는 읽게이 플머 지망생은 사서 쓰자~
0
2014.05.21
@준가르
굳굳
보니깐 어플 만드는 사람도 있더라구
카메라 사진 촬영해서 얼굴 찌부 시키는 그런거였는데...
0
2014.05.21
자바 스크립도 사용 가능한거임?
웹 플머라 자바가 좀더 친숙한데
0
2014.05.21
@멍멍이
물론가능.
하지만 C# 이번기회에 배우는게 좋음.
0
2014.05.21
@멍멍이
자바도 가능한데 요즘은 대부분 C샵으로 많이 넘어갔어
자바 할 줄 알면 C샵도 어렵지 않으니까 배워두는게 좋아
0
2014.05.22
요시
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
5224 [연재] 공포게임하는만화.manhwa 21 <화이트데이> 신관편 8 잿더미어캣 11 2 일 전
5223 [연재] 공포게임하는만화.manhwa20 <화이트데이> 본관편 14 잿더미어캣 9 8 일 전
5222 [연재] 공포게임하는만화.manhwa19 <화이트데이> 11 잿더미어캣 14 16 일 전
5221 [연재] 공포게임하는.manhwa 18 [유튜브 관종이 되는 게임] <콘텐... 10 잿더미어캣 9 23 일 전
5220 [연재] 공포게임하는.manhwa 17 [소녀의 잔혹동화] <마녀의 집> 15 잿더미어캣 9 2024.04.29
5219 [연재] 공포게임하는.manhwa16 <마녀의집MV> 10 잿더미어캣 20 2024.04.22
5218 [연재] 공포게임하는.manhwa 15[아편고양이, 캣냅편] <파피플레이... 13 잿더미어캣 23 2024.04.15
5217 [연재] 공포게임하는.manhwa 14[교권의 수호자, 미스딜라이트] <... 15 잿더미어캣 31 2024.04.08
5216 [연재] 공포게임하는.manhwa 13[4D로 즐기는 허기워기] <파피플레... 21 잿더미어캣 22 2024.04.01
5215 [연재] 공포게임하는.manhwa 12 <파피플레이타임> 7 잿더미어캣 21 2024.03.25
5214 [연재] 공포게임하는.manhwa 11 <파피플레이타임> 4 잿더미어캣 17 2024.03.19
5213 [연재] 조조전 모드 - 유선전 플레이 일지 (29) 8 CopyPaper 14 2024.03.15
5212 [연재] 조조전 모드 - 유선전 플레이 일지 (28) 6 CopyPaper 6 2024.03.15
5211 [연재] 조조전 모드 - 유선전 플레이 일지 (27) 4 CopyPaper 5 2024.03.14
5210 [연재] 조조전 모드 - 유선전 플레이 일지 (26) 3 CopyPaper 5 2024.03.14
5209 [연재] 조조전 모드 - 유선전 플레이 일지 (25) 8 CopyPaper 6 2024.03.13
5208 [연재] 조조전 모드 - 유선전 플레이 일지 (24) 5 CopyPaper 5 2024.03.12
5207 [연재] 조조전 모드 - 유선전 플레이 일지 (23) 7 CopyPaper 5 2024.03.12
5206 [연재] 조조전 모드 - 유선전 플레이 일지 (22) 5 CopyPaper 5 2024.03.11
5205 [연재] 공포게임하는.manhwa 10 <파피플레이타임> 4 잿더미어캣 9 2024.03.11