I am maker

유니티 자습서 비행기게임 Space Shooter tutorial 본문

Unity

유니티 자습서 비행기게임 Space Shooter tutorial

코딩하는고릴라 2016. 3. 7. 00:23
반응형

Introduction to Space Shooter

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/introduction?playlist=17147

프로젝트 목표: 우리가 익히아는 종스크롤 비행기 게임. 위에서 적들이나오고 좌우로 피하고 미사일쏘고 적들도 미사일쏘고.


Setting up the project

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/setting-up-the-project?playlist=17147
학습목표 : 새로운 프로젝트를 만들고, 에셋을 임포트하고, 빌드 타켓등 프로젝트 관련 세부사항을 알아보자.


무엇을 배웠나?

-프로젝트 만들기.

-에셋 다운로드 및 에셋 임포트

-빌드타겟을 설정하는 것은 중요하다. 유니티는 모든 플랫폼에 동일 코드로 작동하지만 빌드는 정하고 해야한다.

-플레이어세팅 에서 배포관련 사항들을 정할 수 있다.

-레이아웃 변경으로 화면을 크게크게 볼 수 있다.


The player gameobject 

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/the-player-gameobject?playlist=17147

학습목표 : 플레이어 게임오브젝트를 설정한다. 메쉬모델, 콜라이더 등등의 빌트인 컴포넌트들을 이용한다.


무엇을 배웠나?

-리지드바디

-메쉬콜라이더 

  * 성능을위해서는 메쉬보다는 다른 기본 콜라이더를 사용하도록하자

  * 어쩔수없이 메쉬를 쓸경우 간소화시킨 메쉬를 쓰자.

-캡슐콜라이더


Camera and lighting

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/camera-and-lighting?playlist=17147

학습목표 : 메인카메라와 빛을 설정한다.


무엇을 배웠나?

-플레이어를 돌릴수도 있지만, 카메라를 돌리는게 더 편하네.

-카메라는 perspective(원근법) orthographic(직교법)이 있네. 2D게임처럼 보이려면 직교법으로!

-플레이어의 위치는 원점위치인게 프로젝트 관리와 보기에 더 좋다

-라이트는 3개로 메인라이트(우측 후면에서 강한빛으로) 채우기라이트(좌측으로 반사광처럼 색깔도 푸르스름) 가장자리라이트(비행기 아래에서 쏴준다 약하게)

-기본 빛을 끄는 방법 window - lightning -Ambient Intensity = 0



Adding a background 

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/adding-a-background?playlist=17147

학습목표: 게임화면 배경을 깔자


무엇을 배웠나?

-쿼드

-텍스쳐를 입히는 방법: 그냥 드레그앤 드롭 하면 자동으로 머티리얼 생성되면서 입혀짐

-텍스쳐 미리보기: 사이즈 및 크기를 볼 수 있다

-스케일 할 때는 이미지 비에 맞도록 하자

-쉐이더 디퓨즈 : 무광, 스펙큘라 : 빛나는 플라스틱, unlit/texture : 텍스쳐 원본대로


Moving the player 

http://unity3d.com/kr/earn/tutorials/projects/space-shooter/moving-the-player?playlist=17147

학습목표: 비행기를 움직여보자.


무엇을 배웠나?

-스크립트의 이름은 파스칼 규칙으로 하자. PlayerController 이런게 파스칼.

-RIgidbody.velocity 를 변경하여 플레이어를 움직이자.

-Mathf.Clamp(현재값, 최소값, 최대값) =>플레이어가 화면을 못벗어나게하자.

-Custom Class를 인스펙터에서 확인하려면 직렬화 해야한다. 클래스명위에 [Serializeable]



using UnityEngine;


[System.Serializable]//인스펙터에서 보이도록

public class Boundary

{

    public int xMin, xMax, zMin, zMax;

}


public class PlayerController : MonoBehaviour {

    public float Speed=1;

    public float Tilt = 0;

    public Boundary boundary;

    Rigidbody rb;


    void Start()

    {

        rb = GetComponent<Rigidbody>();//rigidbody 컴포넌트를 가져온다.

    }


    void FixedUpdate()//물리법칙에 관련된 업데이트 코드들은 FixedUpdate

    {

        Vector3 MoveMent;

        MoveMent = new Vector3(Input.GetAxis("Horizontal") ,0.0f, Input.GetAxis("Vertical"));

        rb.velocity = Speed*MoveMent;//플레이어를 움직인다.


        rb.position = new Vector3(

            Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax), 

            0.0f,

            Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax)

            );//플레이어가 화면 가장자리를 벗어나지 않도록한다.


        rb.rotation=Quaternion.Euler(0.0f,0.0f,rb.velocity.x*-Tilt);//플레이어의 화면을 돌린다.

    }

}



Creating shots

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/creating-shots?playlist=17147

학습목표: 미사일을 만든다.

무엇을 배웠는가?
- 디자인과 실제 기능부분을 분리하여 위에 미사일 생김새만 교체해 로직은 재사용할 수 있게하자.
-머티리얼 생성
-미사일처럼 배경을 투명하고 흰색을 더밝게하려면 쉐이더중 Additive를 쓰자.

-플레이중 프리팹을 인스펙터에 놓으면, 객체가 실시간으로 생성되는것을 볼 수 있다.


using UnityEngine;


public class Mover : MonoBehaviour {

    Rigidbody rb;

    public int Speed;

// Use this for initialization

void Start () {

        rb = GetComponent<Rigidbody>();

        rb.velocity= new Vector3(0.0f, 0.0f, Speed); //미사일의 움직임.

}

}


Shooting Shots

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/shooting-shots?playlist=17147
학습목표: 플레이어가 미사일을 발사하게 하자.

무엇을 배웠는가?
-Instanciate

-Spawn 포인트에서 미사일을 발사하는 기법

-미사일 발사시 시간 제한 두는 기법


using UnityEngine;


[System.Serializable]//인스펙터에서 보이도록

public class Boundary

{

    public int xMin, xMax, zMin, zMax;

}


public class PlayerController : MonoBehaviour {

    public float Speed=1;

    public float Tilt = 0;

    public Boundary boundary;

    public float fireRate;

    public GameObject Bolt;//미사일

    public Transform ShowSpawn;//미사일이 나오는 부분. 트랜스폼으로 선언한 경우 자동으로 unity에서 트랜스폼 컴포넌트를 찾아온다.

    


    Rigidbody rb;


    private float nextFire;


    void Start()

    {

        rb = GetComponent<Rigidbody>();//rigidbody 컴포넌트를 가져온다.

    }


    void Update()

    {

        //미사일을 발사한다.

        if (Input.GetButton("Fire1") && Time.time > nextFire)

        {

            nextFire = Time.time + fireRate;//미사일 발사 속도를 제한한다. fireRate가 2000인경우 nextFire는 현재시간+2000초 후에 위의 if문을 통과한다.

            Instantiate(Bolt, ShowSpawn.position, ShowSpawn.rotation);//미사일 발사! 스폰포인트에서 미사일이 나간다.

        }

    }



    void FixedUpdate()//물리법칙에 관련된 업데이트 코드들은 FixedUpdate

    {

        Vector3 MoveMent;

        MoveMent = new Vector3(Input.GetAxis("Horizontal") ,0.0f, Input.GetAxis("Vertical"));

        rb.velocity = Speed*MoveMent;//플레이어를 움직인다.


        rb.position = new Vector3(

            Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax), 

            0.0f,

            Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax)

            );//플레이어가 화면 가장자리를 벗어나지 않도록한다.


        rb.rotation=Quaternion.Euler(0.0f,0.0f,rb.velocity.x*-Tilt);//플레이어의 화면을 돌린다.

    }

}




Boundary 

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/boundary?playlist=17147

학습목표: 게임 구역 둘레에 박스를 만들어서 떠나는 물체들을 파괴시켜버리자.


무엇을 배웠나?

-OnTriggerExit



CREATING HAZARDS


http://unity3d.com/kr/learn/tutorials/projects/space-shooter/creating-hazards?playlist=17147

학습목표: 운석으로 사용자를 위협하자.


무엇을 배웠나?

-Random.insideUnitSphere

-Drag, Angular Drag : 마찰력같은거.

-Debug.Log: 콘솔에 나타남


using UnityEngine;


public class DestroyByContact : MonoBehaviour {

    void OnTriggerEnter(Collider other) //isTrigger=t==true일 때 들어온 충돌체 판별!

    {

        if (other.CompareTag("Boundary")) return; //태그명이 BOundary일 경우는 처리안함.


        Destroy(other.gameObject); //닿은 놈 부셔지고

        Destroy(gameObject); //소행성도 부셔지고

    }

}


using UnityEngine;


public class RandomRotator : MonoBehaviour {


    public float Tumble;

    Rigidbody rb;

    void Start()

    {

        rb = GetComponent<Rigidbody>();

        rb.angularVelocity = Random.insideUnitSphere * Tumble;

    }

}


EXPLOSIONS

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/explosions?playlist=17147
학습목표 : 운석이 폭발할 때 폭파 효과를 주자, 운석과 플레이어가 충돌할때 플레이어한테도 효과를 주자.

무엇을 배웠나?
-이펙트 프리팹 발생. 이펙트를 만드는건 안가르쳐줌..따로봐야하는듯?



GAME CONTROLLER

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/game-controller?playlist=17147

학습목표: 운석을 생성하고, 점수를 표시 및 갱신하고, 게임이 끝났는지 판단하고, 게임을 재시작할 수 있게하는 컨트롤러를 만들자.


무엇을 배웠나?

-Random.Range

-Quaternion.identity


using UnityEngine;

using System.Collections;


public class GameController : MonoBehaviour {

    public GameObject hazard;//장애물

    public Vector3 SpawnValues;//장애물 스폰 지점

void Start () {

        spawnWaves();    

}


    void spawnWaves()

    {

        Vector3 spawnPosition = new Vector3(Random.Range(-SpawnValues.x,SpawnValues.x),SpawnValues.y,SpawnValues.z);

        Quaternion spawnRotation = Quaternion.identity;//회전없음

        Instantiate(hazard, spawnPosition, spawnRotation);

    }

}


SPAWNING WAVES

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/spawning-waves?playlist=17147

학습목표: 무한 운석 웨이브를 쏟아내보자!


무엇을 배웠나?

-StartCoroutine

-Destory(물체, 수명)


public class GameController : MonoBehaviour
{
    public GameObject hazard;
    public Vector3 spawnValues;
    public int hazardCount;
    public float spawnWait;
    public float startWait;
    public float waveWait;

    void Start ()
    {
        StartCoroutine (SpawnWaves ()); //쓰레드같은거
    }

    IEnumerator SpawnWaves () //IEnumerator로 해야함.
    {
        yield return new WaitForSeconds (startWait);
        while (true)
        {
            for (int i = 0; i < hazardCount; i++)
            {
                Vector3 spawnPosition = new Vector3 (Random.Range (-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
                Quaternion spawnRotation = Quaternion.identity;
                Instantiate (hazard, spawnPosition, spawnRotation);
                yield return new WaitForSeconds (spawnWait);
            }
            yield return new WaitForSeconds (waveWait);
        }
    }
}


AUDIO

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/audio?playlist=17147

학습목표 : 오디오 효과를 추가하자. 무기, 폭발, 배경음악.


무엇을 배웠나?

-오디오를 적용하는 방법 : 그냥 드래그앤 드롭

-Play ON Awake 객체가 생기자마자 재생됨. 파괴음 배경음

-Loop 배경음같이 반복



using UnityEngine;


[System.Serializable]//인스펙터에서 보이도록

public class Boundary

{

    public int xMin, xMax, zMin, zMax;

}


public class PlayerController : MonoBehaviour {

    public float Speed=1;

    public float Tilt = 0;

    public Boundary boundary;

    public float fireRate;

    public GameObject Bolt;//미사일

    public Transform ShowSpawn;//미사일이 나오는 부분. 트랜스폼으로 선언한 경우 자동으로 unity에서 트랜스폼 컴포넌트를 찾아온다.

    


    Rigidbody rb;


    private float nextFire;

    new AudioSource audio; //Unity 5.x부터는 audio.Play가 안써짐. 쓰려면 이렇게 GetComponent한 후 사용해야함. audio라고 기존에있던거랑 이름 똑같아서 new붙음. 안붙여도 잘돌아감.

    void Start()

    {

        rb = GetComponent<Rigidbody>();//rigidbody 컴포넌트를 가져온다.


        audio = GetComponent<AudioSource>();


    }


    void Update()

    {

        //미사일을 발사한다.

        if (Input.GetButton("Fire1") && Time.time > nextFire)

        {

            nextFire = Time.time + fireRate;//미사일 발사 속도를 제한한다. fireRate가 2000인경우 nextFire는 현재시간+2000초 후에 위의 if문을 통과한다.

            Instantiate(Bolt, ShowSpawn.position, ShowSpawn.rotation);//미사일 발사! 스폰포인트에서 미사일이 나간다.

            audio.Play();//미사일 발사음

        }

    }



    void FixedUpdate()//물리법칙에 관련된 업데이트 코드들은 FixedUpdate

    {

        Vector3 MoveMent;

        MoveMent = new Vector3(Input.GetAxis("Horizontal") ,0.0f, Input.GetAxis("Vertical"));

        rb.velocity = Speed*MoveMent;//플레이어를 움직인다.


        rb.position = new Vector3(

            Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax), 

            0.0f,

            Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax)

            );//플레이어가 화면 가장자리를 벗어나지 않도록한다.


        rb.rotation=Quaternion.Euler(0.0f,0.0f,rb.velocity.x*-Tilt);//플레이어의 화면을 돌린다.

    }

}



COUNTING POINTS AND DISPLAYING THE SCORE

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/counting-points?playlist=17147
학습목표 : 점수를 계산하고 보여준다.

무엇을 배웠는가?
-Text는 Canvas가 추가됨. GUIText 이건 더이상 안써요~
-Instance는 Inspector에서 매개변수로 넘겨줄수가없다. 프리팹같이 오브젝트 템플릿만 됨.
-GameObject.FindWithTag("GameController");// 태그로 오브젝트 찾기

using UnityEngine;

public class DestroyByContact : MonoBehaviour {
    public int Score;
    private GameController gameController;
    void Start()
    {
        GameObject gameControllerObject = GameObject.FindWithTag("GameController"); //태그로 게임컨트롤러 오브젝트를 찾는다.
        gameController = gameControllerObject.GetComponent<GameController>();// 게임컨트롤러 오브젝트에 GameController 객체를 가져온당.
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Boundary")) return;
        
        if (other.CompareTag("Player"))
            Instantiate(playerExplosion, other.transform.position, other.transform.rotation);

        Instantiate(explosion, transform.position, transform.rotation);
        gameController.AddScore(Score);
        Destroy(other.gameObject);
        Destroy(gameObject);
    }
}


ENDING THE GAME

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/ending-the-game?playlist=17147
학습목표: 게임을 종료하고 게임오버 상태를 표시하고 재시작한다.

무엇을 배웠는가?
-딱히 새로운게 없음요....

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameController : MonoBehaviour {
    public int hazardCount;
    public GameObject hazard;//장애물
    public Vector3 SpawnValues;//장애물 스폰 지점
    public float spawnWait;
    public float waveWait;
    public float startWait;

    public Text GameOverText;
    public Text RestartText;

    private int score;
    public Text scoreText;

    private bool gameOver;
    private bool restart;

    void Start () {
        GameOverText.text = "";
        RestartText.text = "";
        score = 0;
        gameOver = false;
        restart = false;
        UpdateScore();
        StartCoroutine(spawnWaves());
}
    
    void Update()
    {
        if (restart)
        {
            if (Input.GetKeyDown(KeyCode.R))
            {
                SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);//아래 함수는 deprecated 래요. 곧 없어질거임. 이건 제가 찾았어요 .찍으면서 헤헷
                //Application.LoadLevel(Application.loadedLevel);
            }
        }
    }

    IEnumerator spawnWaves()
    {
        yield return new WaitForSeconds(startWait);
        while (true)
        {
            for (int i = 0; i < hazardCount; i++)
            {
                Vector3 spawnPosition = new Vector3(Random.Range(-SpawnValues.x, SpawnValues.x), SpawnValues.y, SpawnValues.z);
                Quaternion spawnRotation = Quaternion.identity;//회전없음
                Instantiate(hazard, spawnPosition, spawnRotation);
                yield return new WaitForSeconds(spawnWait);
            }
            yield return new WaitForSeconds(waveWait);
            if (gameOver)
            {
                restart = true;
                RestartText.text = "재시작하려면 'R'키를 눌러주세요.";
                break;
            }
        }
    }
    public void GameOver()
    {
        gameOver=true;
        GameOverText.text = "Game Over!!";
    }

    public void AddScore(int amount)
    {
        score += amount;
        UpdateScore();
    }

    private void UpdateScore()
    {
        scoreText.text = "Score : " + score;
    }
}



//튜토리얼에는 ContactByDestroy에서gameOver 처리했는데. 플레이어가 죽어야 게임오버인게 직관적인거 같아서 이렇게 했어염. 혹시 모르죠 다음 강좌에서 고칠지도?

public class PlayerController : MonoBehaviour {

    void OnDestroy()

    {

        gameController.GameOver();

    }

}


BUILDING THE GAME

http://unity3d.com/kr/learn/tutorials/projects/space-shooter/building-the-game?playlist=17147
게임 빌드

SpaceShooter.zip

html로 만들어지다니 놀랍습니다 오호오오

근데 엣지에서는 실행안되네요 ㅎㅎ



EXTENDING SPACE SHOOTER: ENEMIES, MORE HAZARDS, SCROLLING BG

http://unity3d.com/kr/learn/tutorials/modules/beginner/live-training-archive/extending-space-shooter?playlist=17147
개인적으로 해보려고했는데 이렇게 확장까지 튜토리얼로 해주네요.. ㅎㅎ 일단 학습이 중요하니 보겠습니다.
학습목표 : 다양한 운석장애물, 움직이며 미사일 쏘는 적군, 움직이는 배경

무엇을배웠는가?
일단... 강좌 만든사람 천재다... 이 마지막 강좌는 실시간 강좌 녹화본으로 보이는데.. 굉장하다.

-복잡한 AI없이 적 비행기를 움직이는방법
 랜덤으로 움직이기 혹은 플레이어를 따라 움직이기
-미사일 방향 및 미사일 스폰 추가 등 미사일 발사 형태 바꾸기
-오디오 소스 재생이 아니라 클립으로 재생하는 방법
-Mathf.Sign
-Mathf.MoveTowards
-Mathf.Repeat

MOBILE DEVELOPMENT: CONVERTING SPACE SHOOTER TO MOBILE

http://unity3d.com/kr/learn/tutorials/modules/beginner/live-training-archive/space-shooter-to-mobile?playlist=17147

학습목표: 모바일 버전으로 컨버팅 해보자.

무엇을 배웠나?

-accellerate 사용법

-터치패드 생성

반응형