실전 Unity3D Engine Programing 과정 2일차 (2013.07.23 (화))


금일 만든 파일: 

shooting.unitypackage




툴에대해서

히어락키

카메라

인스팩터 : 설명, 폴더 (중요하지 않다.)

플레이/좌우 버튼.


창을 새로 끄낼경우.. 우측 상단에 Layers 버튼으로 추가할 수 있다.

Layers는  WIde로 하자..



슈팅게임 만들자..

프로젝젝트 하단 폴더가 비어 있습니다. 오른쪽 클릭, 옵션 메뉴 

크리에터 / 폴더

- Scripts 만든다.

- Materials

- Prefabs




포커싱의 의미

 히어아키에서 카메라를 선택해서 카메라가 중앙에 오도록 한다.

- 카메라가 중앙에 있으면 이상태에서 개발하면 좋다.

- 0 1 1.0

- 이상태 Menu-> GameObject -> Create Empty하면 카메라 것과 동일하게 생긴다.

- 이 GameObject 클릭해 보면 카메라와 동일하다. 포지션이


카메라 선택하고 포지션은 0.0.0으로 한다.





프로젝션은 Othographic를 선택한다.

신창  Alt + 마우스로 카메라를 옯길 수 있다. 휠키로 줌 처리



카메라 신창의 박스를 조절하자.

Size : 5

ClippingPlanes

Near -2, Far 2




Menu GameObject Create Other Cube를 선택한다. 




히얼아키에 Cube가 생기고

신탭 옆에 Game탭을 눌러보면 검은색이 생겨 있을 것이다.

검은색 박스가 안보이면  포지션을 0.0.0 으로 한다.

그리고 이름은 Cube -> Player로 변경한다.




-5   5  5  -5 크기의 박스에서 중앙에 플레이어가 있게 한다.

플레이어 중앙으로 옮기기 위해서 -4한다.



Menu GameObject Create Other Direct Light






Assets에서  Meterial -> Create -> Meterial 이름은 PlayerMat 로 지정한다.

이것을 선택하면 좌측에 Main Color를 녹색으로 바꾼다.






Player를 선택하고 

프로젝트에 PlayerMat를 끌어다가 오른쪽 인스팩토리리에 옮겨 놓으면 Player는 녹색된다.





코딩해 보자

프로젝트의 scripts > create > C# script > 이름은 PlayerControl





이 PlayerControl을 누르면 모노디벨롭이 뜬다. 여기서 코딩한다.






파일 이름과 클래스 이름이 동일하다. <== 매우 중요 틀리면 컴파일 안됨

클래스이름이 스크립의 해더가 된다. 


using UnityEngine;

using System.Collections;


public class PlayerControl : MonoBehaviour {


// Use this for initialization

void Start () {

}

// Update is called once per frame

void Update () {

}

}


열어 보면 MonoBehaviour를 상속 받는다.

start: 이니셜

update: 여기서 그려진다.



using UnityEngine;

using System.Collections;


public class PlayerControl : MonoBehaviour {

public float Speed = 1.0f;

// Update is called once per frame

void Update () {

}

}


이렇게 수정하고 


하이어라키에서 Player를 선택하고 프로젝트에서 PlayerControl를 잡아서 오른쪽으로 옮겨 놓는다.

그러면 speed가 생긴다. Public으로 해서 나오는 것이다. (디자이너에게 수정할 때 이렇게 해 주면 좋다.) 


코드를 아래와 같이 수정해 보고

void Update () {

float moveAmt = Input.GetAxis ("Horizontal") * Speed * Time.deltaTime;

transform.Translate(Vector3.right * moveAmt);

}



플레이 버튼을 누르고 키보드로 좌우를 눌러보면 녹색박스가 좌우로 움직인다.

그리고 인스팩트에서 스피드를 1 -> 10으로 변경해 본다. 그리고 움직이면 움직인다.

플레이중에 스피드를 변경하면 저장안된다. 



저장


File Save Scene 

File Save Project

한다. (play는 스톱해야 한다.)


Edit -> Project Setting -> Input 를 누르면 우측 인스팩터에 Axes가 나온다..

이중 Negative Button left, Positive Button은 Right

따라서 좌우 키를 누르면 코드상에 음수 값 양수값이 GatAxis에서 값이 들어오게 되는 것이다.

경과시간을 곱한다..

업데이트 타임은 deltaTime을 사용한다. (타임의 종류도 많다.)

float moveAmt = Input.GetAxis ("Horizontal") * Speed * Time.deltaTime;


transform.Translate(Vector3.right * moveAmt);

인스팩트에 있는 것으로 숏컷 개념으로 바로 사용하고 

transform 해당 항목을 정의 하면 해당 항목과 링크를 걸어 주는 것이다.


Vector3 는 아래와 같은 방향을 제공한다.

방향은 

업다운

레프트라이트

프론트백




이제 총을 쏴보자..

GameObject create other Shpere

positon은 0.0.0

이름은 Bullet이다.

그리고 메터리얼 만들고 색깔 바꾸고 Bullet에 선택하고 드래그 드럽한다.


스크립터 한다.

Bulletcontrol을 만든다.

내용은

using UnityEngine;

using System.Collections;


public class BulletControl : MonoBehaviour {


public float Speed = 20f;

// Update is called once per frame

void Update () {

float moveAmt = Speed * Time.deltaTime;

transform.Translate(Vector3.up * moveAmt);

}

}




콘솔창을 띄우다.

Window >  console

진행과정을 볼 수 있다.


하이얼라키에서 Bullet을 선택하고 BulletControl을 마우스로 잡아서 오른쪽으로 드래그 드랍한다.

플레이 한다. 


총알 올라가는 것을 제약해야 한다. 

if(transform.position.y > 7.0f){

Destroy(gameObject);

}

gameObject와 같이 소문자는 자기로써.. 삭제된다는 것이 GC전까지..


Assets > Prefabs > Create Prefa  이름 BulletPrefab

만든 Bullet 오브젝트를 끌어서 여기에 저장한다. 

그리고  Bullet는 삭제한다. 



스페이스바에서 총을 쏴보자.

PlayerControl에서 아래 것을 추가한다.


public GameObject bullet;

public GameObject bullet;

void Update () {

float moveAmt = Input.GetAxis ("Horizontal") * Speed * Time.deltaTime;

transform.Translate(Vector3.right * moveAmt);

if(Input.GetKeyDown(KeyCode.Space)){

Instantiate(bullet, transform.position, transform.rotation);

}

}



Player

None 한번도 링크를 건적이 없다.

Missing 링크 걸고 지운것


Prefabs에서 BulletPrefab을 선택해서 마우스로 끌어서 오른쪽에 스크립의 Bullet 항목에  드랍한다.


그리고 플레이 시켜서 스페이바를 눌러 본다.









[적군을 만들자]

적군 만들기: GameObject > Create Other > Cube 이름은 Enemy

적군 색상바꾸기: Materials  Create > Metrial 이름은 EnemyMat 색은 빨간색

Enemy선택해서 EnemyMat를 잡아서 오른쪽에 둔다.

적군 코드를 넣다. : Script Create > C# script 이후 코딩한다.


using UnityEngine;

using System.Collections;


public class EnemyConrol : MonoBehaviour {


public float Speed = 8.0f;

// Update is called once per frame

void Update () {

float moveAmt = Speed * Time.deltaTime;

transform.Translate(Vector3.down * moveAmt);

if(transform.position.y < -7.0f){

// 하단까지떨어지면  다시 상단으로간다 

InitPosition();

}

}

void InitPosition()

{

// 죽으면 상단에 x값을랜덤하게새로생성된다 

transform.position = new Vector3 (Random.Range(-5.0f, 5.0f), 7.0f, 0.0f);

}

}




Prefabs를 선택해서 우측 상단에 Tag를 추가한다. 

선택하면 TagManager가 생긴다.

* 총알은 계속 발사하면, 또는 벽 등으로 구분하기 위해서는 클론된 것들을 Tag로 구분한다.


Tags  선택하고 Element에 bullet를 입력한다.



[충돌체크를 넣는다.]

다시 Prefabs에서 BulletPrefab을 선택하고 오른쪽에


BulletPrefab에 RidgBody를 붙이고 중력값을 큰다.

Menu > Componet > Physics > RigidyBody를 선택한다.

그리고 Sphere Colliderd의 Is Trigger를 체크한다.

<== 이제 물리엔진에 대한 속성을 갖게 된다.


다시 EnemyControl로 이동한다.

//인자로  충돌된 것이날라온다 충돌시자동으로온다 in trigger를체크할경우

void OntriggerEnter(Collider other)

{

if(other.gameObject.tag == "bullet")

{

// 충돌 오브젝트의 테그를보고 총알인지   벽인지 구분한다 

InitPosition();

}

}



[이팩트]

이제 충돌시 이팩트를 넣어 보자.. 

간단한 제공하는 것으로 레가시로 하자.


Assets > Import Package > Particle > 팝업에서 Import버튼을 누른다. 그러면 Assets에 Standard Assets이 추가된다.

여기서 Legacy Particle > Small explosion이 있다. 

이것을 끌어서 히얼아키창에 드레그 드랍한다.


이것을 One Shot을 체크한다.

- 한번 노출 되었다 사라진다.


파티클 사이즈와 에니메이션 몇개 노출될 것인가를 지정ㅎ낟.

Emit

MiknSize

Max Size

..

Max Emission


Rnd Velocity를 3.3.3d으로 변경


다시  Prefabs Explosion을 만들고

Small expiosion을 드레그 드랍으로 끌어 넣고 지운다. 



[사운드 만든다.]

인터넷을 열어서 구글 에서 

http://www.drpetter.se/project_sfxr.html 이동한다.

http://www.drpetter.se/files/sfxr.zip

sfxr.zip을 다운받는다. 

압축을 풀고 실행해서 원하는 사운드를 골라서 저장한다. (붉은색 박스의 버튼으로 저장할 수 있다.)



Assets  에서  Audios폴더 선택하고 오른쪽 마우스 > Import New Asset 으로 파일하나씩 불러온다.

꼭 이 방식으로 한다. 같은 이름을 임포트하지 않기에 프로젝트 뻑나지 않게 한다.

파일 익스플로러로 해당 파일에 옮기지 말것 <=== 매우 중요함

audio show in folder로 익스플로러를 열어 볼 수 있다. 여기다 직접 넣으면 안됨.. ** 


player 오브젝트를 선택하고  Menu > Componet > Audio > Audio source를 선택한다. 

오른쪽을 보면 Audio Source생긴다

audo clip에 audios  파일을  여기다 끌어 놓는다.

play on awake를 체크를 언체크한다. 생성시 계속 출력하기에



스크립트에 코드 추가

//인자로  충돌된 것이날라온다 충돌시자동으로온다 in trigger를체크할경우

void OntriggerEnter(Collider other)

{

if(other.gameObject.tag == "bullet")

{

audio.Play();

Instantiate(explosion, transform.position, transform.rotation);

// 충돌 오브젝트의 테그를보고 총알인지   벽인지 구분한다 

InitPosition();

}

}



prefabs에서 explosion을 선택하고 audio source를 추가한다.

오디오 파이를 오디오 클립에 넣어 준다.

그리고 play on awake를 체크한다. 한번만 출력하게..



Enemy에도 오디오 소스를 추가하고 오디오를 오디오클립에 넣어 준다.


유니티는 3D 사운드를 제공해서 카메라 위치에 따라서 다르게 들린다.

Main Camera에 Audio Listener로 한개의 리스너만 있다. 카메라를 추가해도 메인카메라에 리스너 하나만 있어야 한다.

한신에 오디오리스너는 한개만 존재해야 한다. 


[스코어 추가하자.]

메인하나 추가하고 스코어를 추가한다.

히어아키 GameObject > Create GameObject 이름은 main game object


스크립트 추가한다. Main

using UnityEngine;

using System.Collections;


public class Main : MonoBehaviour {


static public int Score = 0;

static public int Lives = 3;

// Update is called once per frame

void Update () {

}

// 느려터치 유니티 GUI 거의안씀

void OnGUI() 

{

GUI.Label(new Rect(10.0f, 10.0f, 200.0f, 20.0f),"Score : ", Main.Score.ToString());

GUI.Label(new Rect(10.0f, 10.0f, 200.0f, 20.0f),"Lives : ", Main.Lives.ToString());

}


MainGameObject에 Main 스크립트 추가한다.


그리로 블랫에 코드를 추가해서 변경


New Scene을 만든다.

엠프티 오브젝트 추가 WinGameObject를 만든다. 

스크립트 단다. WIn

using UnityEngine;

using System.Collections;


public class Win : MonoBehaviour {



void OnGUI()

{

if(GUI.Button(new Rect(Screen.width/2-100.0f, Screen.height/2-100.0f, 200.0f, 200.0f),"YouWin!"))

{

//버튼눌러지면이곳으로들어온다

Application.loadedLevel("game");  // main scene이노출된다

}

}

}


winGameObject에  win  스크립트를 추가하고

menu save scene을 눌러서 win 으로 저장한다.

Assets을 보면 추가된 것을 볼 수 있다. 


Menu > File > Game Setting > 두개의 신을 추가하다. game, win  순서대로



using UnityEngine;

using System.Collections;


public class Main : MonoBehaviour {


static public int Score = 0;

static public int Lives = 3;

public int FinishScore = 1000;

// Update is called once per frame

void Update () {

if(Score >= FinishScore)

{

Score = 0;

Application.loadedLevel("win");

}

}

// 느려터치 유니티 GUI 거의안씀

void OnGUI() 

{

GUI.Label(new Rect(10.0f, 10.0f, 200.0f, 20.0f),"Score : "+ Main.Score.ToString());

GUI.Label(new Rect(10.0f, 30.0f, 200.0f, 50.0f),"Lives : "+ Main.Lives.ToString());

}

}





내일은 모델, 폴리곤, UI를 붙인다. 드레곤플라이트를 만든다. 배경 만든다.

케릭터, 전투, 이팩트, 채팅, 슈팅,  네트워크해서 드레곤플라이트를 만든다.



에너미를 복사해서 위치를 바꿔주면 여러개의 적이 나온다.




숙제..

1. 플레이어도 죽자. <= 리니지 바디를 붙인다. 

2. 아이템 박스 (스코어를 올려준다.) <= 큐브 만들면 된다. 

3. 아이템 박스 먹으면 다양한 삼지창 방향으로 총이 나가게 한다. <= 방향을 바꿔주면 된다.

4. 스테이지 늘리기 <= 옵션

5. 보스 <= 옵션