반응형

이번에는 Game Manager를 만들어서 게임전체를 컨트롤 하고 점수를 올리는 프로그램을 짜보겠습니다

먼저 빈게임오브젝트를 만들고 GameManager라고 합니다



GameManager스크립트를 만듭니다


Player스크립트를 선택하고 수정합니다


canShoot = false로 수정합니다


can Shoot 체크 해제 합니다




SpawnManager스크립트를 수정합니다


SpawnManager스크립트를 SoundManager스크립트 처럼 인스턴스 스크립트를 추가 합니다


SpawnManager오브젝트를 선택하고 is Spawn 을 체크 해제한다


GameManager스크립트를 GameManager오브젝트에 붙힙니다



그리고  Hierarchy창에서 마우스 오른쪽 버튼을 눌러 UI -> Text 를 생성합니다





생성된 Canvas -> Canvas Scaler를 그림과 같이 Scale With Screen Size를 선택합니다


Scale With Screen Size를 선택 하고 Reference Resolution 을 200 320 으로 바끕니다


Text를 선택하여 그림과 같이 속성을 바꿉니다


Text가 화면에 잘보일수있게 그림과같이 설정되었습니다.Text와 위치는 사용자가 보기 좋은 방향으로 위치와 색깔을 수정하셔도 됩니다



그림과 같이 GameManager 스크립트를 작성합니다

3초후 게임이 실행되는 Invoke 함수를 넣고 AddScore 함수를 넣어 적을 격파 하였을때 점수를 올리는 스크립트를 짭니다







GameManager를 선택하고 Text를 붙힙니다



using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;


public class GameManager : MonoBehaviour {


    GameObject player;


    int score = 0;


    public Text scoreText;


    public static GameManager instance;


    private void Awake()

    {

        if (GameManager.instance == null)

        {

            GameManager.instance = this;

        }

    }

    void Start ()

    {

        player = GameObject.FindGameObjectWithTag("Player");


        Invoke("StartGame", 3f);//3초후 StarGame실행

}


    void StartGame()

    {

        player.GetComponent<Player>().canShoot = true;


        SpawnManager.instance.isSpawn = true;

        

    }


    public void AddScore(int enemyScore)//적을 격파할때마다 점수가 올라가는 함수

    {

        score += enemyScore;

        scoreText.text = "Score:" + score;

    }

void Update () {

}

}





Enemy 스크립트를 선택하고 수정합니다


그림과 같이 Enemy스크립트를 수정합니다




게임을 실행하여 3초후 총알이 발사되고 적이나오는것을 확인하고 적을 격파하였을때 점수가 올라가는 것을 확인합니다





반응형
반응형


이번 시간에는 Player 전투기가 화면 밖으로 나가지 않도록 이동 제한을 주겠습니다


Player 스크립트를 선택하고 수정합니다


 

  



MoveContro()함수를 수정합니다 /현재 플레이어의 월드좌표(transform.position)을 뷰포트 기준 좌표로 변환시키는 명령을 추가 하고 

//Mathf.Clamp01(값)- 입력된 값이 0~1 사이를 벗어나지 못하게 강제로 조정해 주는 함수를 넣어 줍니다

그리고 다시 뷰포트를 월드좌표를 변환한 벡터값을 Player  transform position에 넣어줍니다


게임을 실행하여 Player전투기가 화면의 이동제한이 되었는지 확인합니다


반응형
반응형

이번시간에는 적기가 계속 나오는 것을 화면상 안보이면 삭제하여 데

이터 메모리를 절약하는 프로그램을 짜보이겠습니다

먼저 빈게임오브젝트를 만들어 RemoveZone 이라고 이름 붙힙니다


RemoveZone 읍젝트에 Box Collider2D를 붙힘니다



배경 스크롤 밑에다 화면 끝나는 지점에 RemoveZone을 크기와 맞추어 놓습니다


새로운 스크립트 이름을 RemoveZone 이라 하고 스크립트를 만듭니다




RemoveZone 오브젝트에  RemoveZone 스크립트를 붙힙니다



RemoveZone 스크립트에 OnTriggerEnter2D() 함수를 넣어 Enemy 태그가 있는 오브젝트를 삭제 시키는 스크립트를 짭니다



RemoveZone오브젝트에 isTrigger을 체크합니다


게임을 실행합니다




반응형
반응형

이번시간에는 적이 자동으로 생성되는 적 Spawn을 만들겠습니다

Enemy 오브젝트를 선택하고 프리팹을 만듭니다 Enemy 오브젝트를 폴더에 드래그하면 생성됩니다


그리고 Enemy프리팹에 좌표를 0으로 세팅합니다


게임화면에 있는 Enemy는 삭제합니다




빈 오브젝트를 만들어 이름을 SpawnManager라 합니다


스크립트를 생성하여 SpawnManager라 이름 붙힙니다


SpawnManager스크립트를 SpawnManager오브젝트에 붙힙니다




SpawnManager 스크립트를 작성합니다

적이 생성되는 지점을 카메라의 월드좌표를 정의 하는 함수 CreatePosition()을 만들고

시간에따라 자동으로 랜덤하게 적을 생성하게하는 SpawnEnemy()함수를 만들어 저장합니다



using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class SpawnManager : MonoBehaviour

{


    Vector3[] positions = new Vector3[5];


    public GameObject enemy;


    public bool isSpawn = false;


    public float spawnDelay = 1.5f;

    float spawnTimer = 0f;


// Use this for initialization

void Start ()

    {

        CreatePositions();

}

    void CreatePositions() // 적이 나오는 지점을 카메라의 월드좌표로 정의한다

    {

        float viewPosY = 1.2f;

        float gapX = 1f / 6f;

        float viewPosX = 0f;


        for(int i= 0; i < positions.Length; i++)

        {

            viewPosX = gapX + gapX * i;


            Vector3 viewPos = new Vector3(viewPosX, viewPosY, 0);


            Vector3 WorldPos = Camera.main.ViewportToWorldPoint(viewPos);


            WorldPos.z = 0f;


            positions[i] = WorldPos;

        }

    }


    void SpawnEnemy()//isSpawn이 true일때 적을 랜덤하게 생성

    {

        if (isSpawn == true)

        {

            if (spawnTimer > spawnDelay)

            {

                 int rand = Random.Range(0, positions.Length);

              

                 Instantiate(enemy, positions[rand], Quaternion.identity);

                           

                spawnTimer = 0f;

            }


            spawnTimer += Time.deltaTime;

        }


    }

// Update is called once per frame

void Update ()

    {

        SpawnEnemy();

    }

}






SpawnManager오브젝트를 선택하고 Enemy 프리팹을 연결하고 isSpawn을 체크합니다




반응형
반응형

이번시간은 사운드 매니져를 만들어 전투기가 폭발하였을때 음향효과를 내어보겠습니다


먼저 Asset Store에 들어 감니다


free sfx package 를 찾기에 써서 Asset을 찾습니다


에셋을 임포트합니다




Assets폴더에  Free sfx pakage가 들어 갔습니다




빈오브젝트를 만들어 이름을 SoundManage 라 합니다



SoundManage 오브젝트에 Audio Source를 붙힙니다


SoundManager란  새 스크립트를 만들고 바로 SoundManage 오브젝트에 붙힘니다




스크립트를 작성합니다

사운드매니저 자신의 인스턴스를 담을 정적변수를 만드는 스크립트입니다


SoundManage 오브젝트  SoundManager스크립트에 Asset에서 받은 Explosion_04를 붙힘니다 



Player 오브젝트를 선택하고 Player스크립트를 수정합니다





OnTriggerEnter2D 함수에 SoundManager.instance.PlaySound();를 추가합니다



Enemy 스크립트도 수정합니다 



OnTriggerEnter2D 함수에    SoundManager.instance.PlaySound(); 를 추가 하고 게임을 실해 시키면 

사운드가 되는것을 볼수 있습니다





반응형
반응형


이번에는 적을 폭발시키고 로켓을 게임화면에서 멀어졌을때 로켓제거하는 스크립트를 만들어보겠습니다


먼저 Enemy오브젝트를 선택하고 스크립트를 수정합니다



변수에 explosion 을 만들고 그림과 같이 로켓과 접촉되었을때 이벤트 함수를 만듭니다





Enemy스크립트에 Explosion 프리팹을 연결합니다



게임을 실행시키면 동영상과 같이 적 비행기가 로켓을 맞고 사리지고 터지는 이팩트를 생성하는 모습을 볼수있습니다



그러나 한가지 문제가있는데 Player에서 생성되는 로켓이 계속 생성되어 누적되는 모습을 볼수있습니다 

이렇게 되면 PC의 메로리가 많이 차지하게 되서 나중에 PC에 메모리가 모자라는 경우가 생김니다


로켓 프리팹을 선택하고 Rocket스크립트를 수정합니다






Rocket 스크립트에 OnBecamelnvisible함수를 추가하고 로켓이 화면에서 안보이면 삭제되는 함수를 만듭니다


동영상에서 볼수 있듯이 화면에서 볼수 없는 로켓은 삭제되는 모습을 볼수있습니다



반응형
반응형

저번시간에 이어서 비행기 총알을 만들어 보겠습니다


projectiles폴더를 찾아 roket 텍스쳐를 선택한다음 inspector에 속성을 그림과 같이 바꿉니다


속성을 바꾼 텍스쳐를 Hierarchy에 드래그하여 Scene에 보이게 합니다



그리고 roket을 회전 시켜 z값을 90으로 합니다





그림과 같이 회전한 상태



Rocket 스크립트를 생성합니다


Rocket스크립트를 작성합니다





Rocket스크립트를 rocket오브젝트에 붙힙니다


rocket 오브젝트를 선택하고 tog를 생성합니다




Rocket 태그를 생성합니다




rocket 오브젝트를 선택하고 태그를 Rocket을 선택합니다





태그를 붙히고 그림과 같이 Rigidbody2D 와 BoxCollider2D를 붙힙니다 그리고 Kinematic을 선택하고 isTrigger를 클릭합니다



그리고 roket 프리팹을 만들고 Hierachy에 있는 rocket 오브젝트는 삭제 합니다 





Player스크립트를 선택하고 스크립트를 수정합니다


그림과 같이 빨간 부분을 추가 하였습니다

로켓을 0.5초간 생성하는 스크립트를 만듭니다





Player오브젝트를 선택하고 rocket 프리팹을 연결합니다


로켓이 잘나가는 것을 확임합니다



반응형
반응형

이번시간은 Player가 죽을때 폭발효과를 만들어 보겠습니다



먼저 explosion폴더에 있는 텍스쳐를 전부 선택하여 그림과 같이 인스팩터 속성을 바꿉니다


그리고 하이라키창으로 텍스쳐를 몽땅 끌고 오면 애니메이션을 저장하는 위치를 선정하고 이를을 explosion이라 합니다 그리고 하이라키에 있는 Explosion 을 선택하여  사이즈를 X 0.25 Y 0.25 로 바꿉니다 그림과 같이 인스팩터에 Animator가 생성되는 것을 볼수 있습니다




그림과 같이 애니메이션과 Animator controller생성


Explosion에  Animator에 Controller에 있는 것을 이름을 explosion으로 바꿉니다



애니메이션 explosion을 선택하고 Loop Time을 해제합니다



그리고 그림과 같이 Animator explosion에 Speed를 0.5로 바꿉니다


스크립트 폴더를 선택하고 Explosion스크립트를 만듭니다





그림과같이 0.8초후면 폭발이 사라지는 스크립트를 작성합니다


작성한스크립트를 Explosion 오브젝트에 붙혀넣습니다



Prefabs폴더를 만듭니다


Explosion 오브젝트를 방금만든 폴더에 드래그하여 프리팹을 만듭니다 


기존에 있던 하이라키에 Explosion 삭제 합니다





Player를 선택하고 그림과 같이 스크립트를 수정합니다

Instantiate(프리팹,생성위치,생성시 방향)

                         Quaternion.identity:프리팹이 가지고 있는 방향값을 그대로 사둉한다는 의미



Player를 선택하고 Explosion 프리팹을 드래스하여 Player 스크립트 Explosion 여백에 같다 꽂자 넣습니다



반응형
반응형

이번시간은 Player에 충돌체를 만들어 적과 충돌하였을때 Player가 사라지는 효과를 만들어 보겠습니다.


먼저 Enemy를 선택하고 Tag에서 Add Tag를 선택하여 Tag이름을 Enemy로 하고 Save한다


Enemy Tag가  생성 되면 Enemy Tag를 선택한다





Player 를 선택하고 Tag를 Player를 선택한다


Player선택하고 Component ->Physics 2D -> Circle Collider 2D를 선택하여 Collider2D를 생성한다


Player에 Circle Collider2D가 생성된 모습




Cire Collider2D에 Is Trigger를 체크한다



Component -> Physics 2D -> Rigidbody 2D 선택



RigidBody 2D 가 생성되면 Body Type을 Kinematic으로 바꾼다





Enemy를 선택하고 Player와 같이 한다



Player를 선택하고 스크립트를 수정한다 .

OnTriggerEneter2D 함수를 추가하여  Enemy Tag 와 충돌하였을때 사라지게 하는 코드를 입력한다



게임실행 화면

반응형
반응형

이번 이간은 적의 전투기를 움직여 보겠습니다

Assets에 있는 enemies 폴더에 boarder를 드래그하여 Herarchy에 올려 놓습니다

그리고 이름을 Enemy 라고 바꿉니다



Scripts폴더에 Enemy 스크립트를 생성합니다





public class Enemy : MonoBehaviour

{

    public float moveSpeed = 0.5f;


// Use this for initialization

void Start () {

}


    void MoveControl()

    {

        float yMove = moveSpeed * Time.deltaTime;

        transform.Translate(0, -yMove, 0);

    }

// Update is called once per frame

void Update ()

    {

        MoveControl();


    }

}


스크립트를 작성합니다



작성한 스크립트를 Enemy 오브젝트에 드레그 하여 붙힙니다 


게임을 실행하면 Enemy 오브젝트가 위에서 아래로 움직이는 것을 볼수 있습니다



반응형
반응형


플레이어 비행기를 움직이는 스크립트를 짜보겠습니다



스크립트 폴더에 스크립트를 생성하고 이름을 Player라고 합니다



스크립트를 열고  그림과 같이 스크립트를 짭니다 

여기서 Horizontal은 유니티 엔진에서 제공하는 좌우 input  GetAxis이고 좌표 X에 -1과 1을 대입하게 됩니다



using System.Collections;

using System.Collections.Generic;

using UnityEngine;


public class Player : MonoBehaviour

{

    public float moveSpeed = 0.5f;


        


// Use this for initialization

void Start ()

    {

}

void MoveControl()

    {

        float moveX = moveSpeed * Time.deltaTime * Input.GetAxis("Horizontal");

        transform.Translate(moveX, 0, 0);

    }

// Update is called once per frame

void Update ()

    {

        MoveControl();


    }

}



Player 오브젝트를 선택하고 스크립트를 드래그하여 붙힙니다 그리고

키보드 A 와 D 키 와 키보드 좌우키를 움직이면 비행기가 움직입니다. 



반응형
반응형

유니티 슈팅게임 만들기 2장 배경스크롤(background scroller) 만들기 입니다 

 

그림과 같이 raw 파일에 있는 bg 텍스쳐를 선택하고 속성을 바꿉니다

 

 

GameObject -> 3DObject -> Quad 를 만들어 배경화면에 맞춥니다

그리고 이름을BackGround 로 바꿉니다

 

 

 

새로운 폴더를Assets에 만들어 이름을 Materials라하고 새로은 Material을 생성하여 이름을 BackGround라 하고  Shader를 Partcles/Alpha Blended로 바꿉니다 그리고  배경텍스쳐 bg 를 Select에 드래그하여 올립니다.

 

 

BackGround 메터리얼을 BackGround  오브젝트에 드래그 하여 붙입니다

 

BackGround 오브젝트를 선택하고 position을 0 ,0, -5 로 한다

 

 

 

배경이 화면과 같이 나오게 됩니다

 

 

 

BackGround 오브젝트를 선택하고 인스팩터에 offset y 값을 움직여보세요

배경이 스크롤 되는 것을 보게 될것입니다

 

새로운 폴더 Scripts를 만들과 스크립트를 생성하여 이름을 그림과 같이 합니다

 

그림과 같이 스크립트를 작성합니다

 

 

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class BackGroundCtrl : MonoBehaviour

{

    public float scrollSpeed = 0.5f;

    Material myMaterial;

 

// Use this for initialization

void Start ()

    {

        myMaterial = GetComponent<Renderer>().material;

 

}

 

// Update is called once per frame

void Update ()

    {

        float newOffsetY = myMaterial.mainTextureOffset.y + scrollSpeed * Time.deltaTime;

        Vector2 newOffset = new Vector2(0, newOffsetY);

 

        myMaterial.mainTextureOffset = newOffset;

 

}

}

 

 

스크립트를 그림과 같이 드래그하여 붙힙니다

 

게임을 실행하면 배경이 위에서 아래로 스크롤 되는 것을 볼수있습니다

 

 

반응형
반응형

유니티 3D 엔진 다운로드 


게임 리소스 다운로드



유니티3D 작업창 


씬 뷰(Scene) : 게임 제작을 위해 제공되는 씬이(scene)라는 3차원 공간을 편집 하도록 도와 주는 공간


계층뷰(Hierarchy) : 씬에 배치된 물체의 정보를 보여주는 공간  계층구조로 구성되어 있어서 계층 뷰라고 합니다 


프로젝트 뷰(Project) : 프로젝트 제작에 재료로 사용되는 에셋을 관리하는 공간 


인스펙터 뷰(Inspector) : 물체 및 에셋의 상세한 속성을 지정할 때 사용되는 뷰 입니니다


게임뷰 (Game) : 게임 제작이 완료되면 툴바의 플레이 버튼을 눌러 활성화되는 뷰입니다 이곳에서는 제작된 게임이 어떻게 동작하는지 미리 볼수 있습니다


프로젝트 뷰에서 Assets 을 눌러 오른쪽 마우스를 누르면  Creat -> Folder 를 생성하고 그림과 같이 

이름을 Graphic  , Scenes 라고 합니다 


Scenes 폴더에 Scene을 생성하고 이름을 Game 이라 합니다 

 


                                         유니티를 열고 게임 리소스를 다운 받아 에셋에 Graphic 폴더를 만들어 게임 리소스를 다움받아 Graphic 폴더에 집어 넣습니다

리소스를 유니티 Assets -> Graphic 에 몽땅 드레그하여 집어 넣어요

그림과 같이 폴더들이 생기면 됩니다 




2. 그리고 Player폴더에 ship2을Hierarchy에 올려 놓고 이름을 Player로 바꿉니다



3.  Game화면에서 디스플레이를 그림과 같이 설정하고 바꿉니다




4.메인카메라(Main Camera)를 선택하고 인스펙터에 사이즈를 1  로합니다



그림과 같은 모습이 되도록합니다


To bo continue

반응형

+ Recent posts