본문 바로가기
etc./🕹️unity

2D Shooting

by yewoneeee 2022. 6. 11.

# 실습 영상

 

# Bullet.cs

총알 컴포넌트 설정

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

//위로 이동하고 싶다

public class Bullet : MonoBehaviour
{
    public float speed = 10;
    // 구글에 unity lifecycle검색
    /* 유니티에서 프로젝트 창에 있는 것은 파일임
        게임오브젝트를 드래그해서 프로젝트에 놓으면 파일이 됨(prefab)
    */
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += Vector3.up * speed * Time.deltaTime;
    }
}

 

# PlayerFire.cs

플레이어가 총알 발사

총알 컴포넌트를 생성해서 발사하는 것처럼 이동시킴

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

// 사용자가 마우스 왼쪽버튼을 누르면 
// 총알을 발사하고 싶다. (Bullet factory(총알 공장)에서 총알을 만들어서 총구위치에 가져다 놓고 싶다.)
public class PlayerFire : MonoBehaviour
{
    // 총알공장
    public GameObject bulletFactory;//prefab은 게임오브젝트를 파일로 만든 것이기 때문에 다시 게임오브젝트로 만들어줘야함
    // 총구위치
    public GameObject firePosition;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // 1. 만약 사용자가 마우스 왼쪽버튼을 누르면
        if (Input.GetButtonDown("Fire1"))
        {
            //왼쪽버튼을 누르는 순간 Fire1은 왼쪽버튼, Fire2는 오른쪽버튼, 휠버튼은 Fire3

            // 2. 총알공장에서 총알을 만들어서
            GameObject bullet = Instantiate(bulletFactory); //Instantiate하면 GameObject가 하나 만들어져서 씬 어딘가에 위치하게 됨
            bullet.transform.position = firePosition.transform.position; //유니티에서 게임오브젝트 눌러보면 transform에 position이 나옴 -> transform.position
            //유니티 게임오브젝트 우클릭해서 create Empty누르면 자식이 하나 생성되는데 이것은 실체는 없고 그냥 위치만 가지고 있음

            // 3. 총구 위치에 가져다 놓고 싶다.
        }

    }
}

 

# PlayerMove.cs

플레이어 이동

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

//사용자의 입력에 따라 플레이어를 이동하고 싶다.
public class PlayerMove : MonoBehaviour
{
    public float speed = 5;
    //기획자가 speed를 수정하려면 유니티 에디터 상에서 수정할 수 있어야 하기 때문에 public써줌

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //사용자의 입력에 따라 플레이어를 이동하고 싶다.

        // 1. 사용자의 입력에 따라
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        //Horizontal과 Vertical도 유니티의 Edit -> Project Settings -> Input Manager -> Axes를 열어보면 Name으로 들어가있음
        //print(h); // a키, 아무것도 누르지 않았을 때, d키눌렀을 때 -> -1,0,1


        // 2. 방향을 만들고
        Vector3 dir = Vector3.right * h + Vector3.up * v;
        //  right  : [0, 0, 0] [1, 0, 0] [-1, 0, 0] 값이 나올 수 있음
        //   up    : [0, 0, 0] [0, 1, 0] [0, -1, 0]  값이 나올 수 있음
        //right+up : 벡터값임 a벡터 + b벡터 같은 개념
        /* 
         * 문제발생!
         * 두 방향키를 같이 누르게 되면 (대각선 이동 시) 대각선 벡터기 때문에 움직임의 크기가 더 커서 속도가 빨라짐
         * 따라서 벡터를 정규화(Nomalize) 시켜줘야함 -> 크기가 1인 벡터로 만들어줌
        */
        dir.Normalize(); //정규화 함수

        // 3. 그 방향으로 플레이어를 이동하고 싶다
        //이동공식 P=P0+vt
        transform.position += dir * speed * Time.deltaTime;
        
    }
}

 

# Enemy

적 컴포넌트 설정

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

// 태어날 때 30% 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
// 살아가면서 그 방향으로 계속 이동하고 싶다.
public class Enemy : MonoBehaviour
{
    // 방향
    Vector3 dir;
    //속력
    public float speed = 5;

    // Start is called before the first frame update
    void Start()
    {
        // 태어날 때 
        // 1. 30% 확률로 플레이어 방향, 나머지 확률로 아래방향으로 정하고
        int result = UnityEngine.Random.Range(0, 10); //float형으로하면 0과 10도 포함(0~10), int형으로 쓰면 10은 미포함(0~9)
        if (result < 3)
        {
            //플레이어 방향
            GameObject target = GameObject.Find("Player");
            // dir = target - me
            dir = target.transform.position - transform.position;
            dir.Normalize();
        }
        else
        {
            //아래방향
            dir = Vector3.down;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // 살아가면서 그 방향으로 계속 이동하고 싶다.
        transform.position += dir * speed * Time.deltaTime;
    }
    public GameObject explosionFactory;
    private void OnCollisionEnter(Collision other)
    {
        // 1. 시각효과 공장에서 시각효과를 만들어서
        GameObject explosion = Instantiate(explosionFactory);
        // 2. 내 위치에 가져다 놓고 싶다
        explosion.transform.position = transform.position;
        //rigidbody는 움직이는 물체와 움직이지 않는 물체 구분
        Destroy(other.gameObject); //너죽고(bullet)
        Destroy(gameObject); //나죽자(enemy)
    }
}

 

# EnemyManager.cs

적 컴포넌트를 생성하는 역할

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

// 일정시간마다 적공장에서 적을 만들어서 내 위치에 가져다 놓고 싶다.
public class EnemyManager : MonoBehaviour
{
    // 적 공장
    public GameObject enemyFactory;
    // 현재시간
    float currentTime;
    // 생성시간 
    public float createTime=1;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // 1.시간이 흐르다가
        currentTime += Time.deltaTime; 
        // 2. 현재시간이 생성시간이 되면
        if (currentTime > createTime)
        {
            // 3. 적 공장에서 적을 만들어서
            GameObject enemy = Instantiate(enemyFactory);
            // 4. 내 위치에 가져다 놓고 싶다.
            enemy.transform.position = transform.position;
            // 5. 현재시간을 0으로 초기화 하고싶다.
            currentTime = 0;
        }
    }
}

 

# DestroyZone.cs

화면 범위를 벗어나면 destroy

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

public class DestroyZone : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        //너만 죽어라
        Destroy(other.gameObject); 
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

'etc. > 🕹️unity' 카테고리의 다른 글

VR UI 설정  (0) 2022.06.11
VR 실습  (0) 2022.06.11
3D FPS  (0) 2022.06.11
unity shader, effect, light & 지형 만들기  (0) 2022.06.11
간단 실습 - fps 게임  (0) 2022.06.11