[SKKU DT] 5일차 -2D 기반 슈팅게임 만들기

2023. 11. 3. 18:23SKKU DT

728x90
반응형

3D 템플릿을 사용할 예정.(Depth 고려해야 할 상황이 올 수도 있음)

 

 

카메라 컴포넌트 수정 persp -> jortho

 

 

카메라 position.y는 0 으로

 

 

Directional Light 비활성화

 

 

라이팅 굽기

 

 

Envirionment Lighting Source 변경, 색상 흰색 변경

 

 

게임 해상도 새로 생성 (640x960)

 

 

플레이어와 플레이어 스크립트 생성

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float speed = 5.0f;
    void Start()
    {
    }
    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        Vector3 pos = new Vector3(horizontal, vertical, 0);
        //Vector3 dir = Vector3.right * horizontal + Vector3.up * vertical; 더하기도 된다.

        //물체의 이동
        //transform.Translate(pos * speed * Time.deltaTime);  //원래 쓰던 방식
        transform.position += pos * speed * Time.deltaTime;  //물리적 표현. 미래 거리 = 현재 거리 + (속력*시간)
    }
}

 

 

총알 생성, 총알 스크립트 생성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    //이동 속도
    public float speed = 5.0f;
    void Start()
    {
    }
    void Update()
    {
        //방향 구하기
        Vector3 dir = Vector3.up;
        //이동
        transform.position += dir * speed * Time.deltaTime;
    }
}

 

 

PlayerFire 스크립트로 총알을 만드는 스크립트 생성

-Instantiate 함수** 중요

-총알을 프리팹으로 만들어야 함

-firePosition Empty GameObject는 Player의 children으로 이동

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class PlayerFire : MonoBehaviour
{
    //총알 생성 풀
    public GameObject bullet;
    //발사 위치
    public GameObject firePosition;
    void Start()
    {  
    }
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))  //Input Manager에 Fire1 이름을 사용
        {
            //Bullet 생성
            GameObject bullets = Instantiate(bullet);
            bullets.transform.position = firePosition.transform.position;
        }
    }
}

 

 

적 생성, Enemy 스크립트 생성, 플레이어와 충돌 가능하게 만들기(Enemy에 RigidBody 추가)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float speed = 5f;
    void Start()
    {
    }
    void Update()
    {
        //방향
        Vector3 dir = Vector3.down;
        //이동
        transform.position += dir * speed * Time.deltaTime;
    }
    //충돌 감지
    private void OnCollisionEnter(Collision collision)
    {
        //적 오브젝트 제거
        Destroy(gameObject);
        //플레이어 오브젝트 제거 -> 위에 매개변수를 가져다 쓰면 됨. collision
        Destroy(collision.gameObject);
    }
}

 

 

EnemyManager 빈 오브젝트 생성 -적 스폰 위치 표시, 주변에 큐브 만들어서 닿으면 없어지게끔.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DestroyZone : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        Destroy(other.gameObject);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;

public class EnemyManager : MonoBehaviour
{
    //현재 시간
    float currentTime = 0;
    //일정 시간
    public float createTime;
    //적 생성
    public GameObject enemy;

    void Start()
    {
        createTime = Random.Range(0.2f, 2.0f);
    }
    void Update()
    {
        currentTime += Time.deltaTime;
        if (currentTime > createTime)
        {
            currentTime = 0;
            createTime = Random.Range(0.2f, 2.0f);
            //적 생성
            //GameObject enemies = Instantiate(enemy);
            //적 생성 위치 -> EnemyManager 오브젝트의 위치
            //enemies.transform.position = transform.position;
            //랜덤 위치 생성
            Instantiate(enemy, new Vector3(Random.Range(-3.0f, 3.0f), 6, 0), Quaternion.identity);
        }
    }
}

 

 

**DestroyZone 끼리 충돌하여 실행시 사라짐

새로운 레이어 생성해서 적용한다.

Physics에서 DestroyZone 레이어들은 서로 부딪히지 않도록 설정한다.

플레이어, 에너미, 불릿도 레이어 생성해서 Physics 적용한다.

 

 


 

 

무료 에셋 모델링 적용하기

https://assetstore.unity.com/packages/3d/vehicles/air/awesome-cartoon-airplanes-56715

 

Awesome Cartoon Airplanes | 3D 항공 | Unity Asset Store

Elevate your workflow with the Awesome Cartoon Airplanes asset from Richard Lester. Find this & other 항공 options on the Unity Asset Store.

assetstore.unity.com

 

 


 

 

프리팹을 Player의 자식 오브젝트로 등록한다.

 

 


 

 

랜덤 적 색깔 적용

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;

public class EnemyManager : MonoBehaviour
{
    //현재 시간
    float currentTime = 0;
    //일정 시간
    public float createTime;
    //적 생성
    public GameObject[] gameObjects = new GameObject[2];

    void Start()
    {
        createTime = Random.Range(0.2f, 2.0f);
    }
    void Update()
    {
        currentTime += Time.deltaTime;
        if (currentTime > createTime)
        {
            currentTime = 0;
            createTime = Random.Range(0.2f, 2.0f);
            int type = Random.Range(0, 3);
            //적 생성
            //GameObject enemies = Instantiate(enemy);
            //적 생성 위치 -> EnemyManager 오브젝트의 위치
            //enemies.transform.position = transform.position;
            //랜덤 위치 생성
            Instantiate(gameObjects[type], new Vector3(Random.Range(-3.0f, 3.0f), 6, 0), Quaternion.identity);
        }
    }
}

 

 

랜덤 미사일 적용

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class PlayerFire : MonoBehaviour
{
    //총알 생성 풀
    public GameObject bullet;
    //발사 위치
    public GameObject firePosition;

    public GameObject[] missiles = new GameObject[10];
    void Start()
    {  
    }
    void Update()
    {
        int type = Random.Range(0, 7);
        if (Input.GetButtonDown("Fire1"))  //Input Manager에 Fire1 이름을 사용
        {
            //Bullet 생성
            GameObject bullets = Instantiate(missiles[type]);
            bullets.transform.position = firePosition.transform.position;
        }
    }
}

 

 


 

 

맞아서 폭발하는 효과 넣기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float speed = 5f;

    //폭발
    public GameObject explosion;
    void Start()
    {
        
    }
    void Update()
    {
        //방향
        Vector3 dir = Vector3.down;
        //이동
        transform.position += dir * speed * Time.deltaTime;
    }
    
    //충돌 감지
    private void OnCollisionEnter(Collision collision)
    {
        //폭발
        GameObject explosions = Instantiate(explosion);
        explosions.transform.position = transform.position;
        //적 오브젝트 제거
        Destroy(gameObject);
        //폭발
        GameObject explosions_p = Instantiate(explosion);
        explosions_p.transform.position = collision.transform.position;
        //플레이어 오브젝트 제거 -> 위에 매개변수를 가져다 쓰면 됨. collision
        Destroy(collision.gameObject);
        
    }
}

 

 


 

 

점수 표시하기 -Best Score 추가, 빈 오브젝트 ScoreManager 생성

Enemy 스크립트에 접근해서 score 점수를 가져와서 ScoreManager에서 사용. (외부 스크립트에 접근)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float speed = 5f;

    //폭발
    public GameObject explosion;
    void Start()
    {
    }
    void Update()
    {
        //방향
        Vector3 dir = Vector3.down;
        //이동
        transform.position += dir * speed * Time.deltaTime;
    }
    
    //충돌 감지
    private void OnCollisionEnter(Collision collision)
    {
        GameObject smObject = GameObject.Find("ScoreManager");  //Scne에서 ScoreManager 오브젝트를 찾아서 가져옴
        ScoreManager sm = smObject.GetComponent<ScoreManager>();  //스크립트 sm 객체 생성. Getcomponent 안에는 스크립트 이름 그대로 써준다.
        sm.currentscore++;
        sm.currentscoreUI.text = "Current Score\n" + sm.currentscore.ToString();
        
        if(sm.currentscore > sm.bestscore)
        {
            sm.bestscore = sm.currentscore;
            sm.bestscoreUI.text = "Best Score\n" + sm.bestscore.ToString();
        }
        
        //적 폭발
        GameObject explosions = Instantiate(explosion);
        explosions.transform.position = transform.position;
        //적 오브젝트 제거
        Destroy(gameObject);
        //플레이어 폭발
        GameObject explosions_p = Instantiate(explosion);
        explosions_p.transform.position = collision.transform.position;
        //플레이어 오브젝트 제거 -> 위에 매개변수를 가져다 쓰면 됨. collision
        Destroy(collision.gameObject);
    }
}

 

 


 

 

배경 스크롤 -배경 스크립트 추가

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BackGround : MonoBehaviour
{
    //배경 메테리얼 가져오기
    public Material bgMaterial;
    //스크롤 속도 조절
    public float speed = 1.0f;
    void Update()
    {
        //방향 설정
        Vector2 dir = Vector2.up;  //메테리얼이 Vector2이기 때문에 Vector2 사용
        bgMaterial.mainTextureOffset += dir * speed * Time.deltaTime;
    }
}

 

 


 

 

게임 매니저 스크립트 추가

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager_Shoot : MonoBehaviour
{
    public GameObject uiPanel;
    void Start()
    {
        uiPanel.SetActive(false);
    }
    void Update()
    {
        if (!GameObject.Find("Player"))
        {
            uiPanel.SetActive(true);
            Time.timeScale = 0;
        }
        else
        {
            Time.timeScale = 1;
        }
    }

    public void Restart()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
    public void Quit()
    {
        Application.Quit();
    }
}

 

 


 

 

완성

728x90
반응형