본문 바로가기
공부/Unity 기초

2D 슈팅 - 8 / 함정 추가

by svcbn 2022. 5. 16.

사각형 형태의 함정 오브젝트를 만들어서 배치

함정 오브젝트에 플레이어가 함정에 닿아 있는 동안에는 총알을 발사할 수 없도록 한다.

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

public class Trap : MonoBehaviour
{

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

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

    // 트리거에 충돌했을 때

    private void OnTriggerEnter(Collider other)
    {
        // 플레이어가 가진 PlayerFire 스크립트를 가져온다.
        PlayerFire pFire = other.GetComponent<PlayerFire>();

        // 만일, 플레이어가 맞다면 가져온 PlayerFire의 총알 발사 가능 변수를 false로 바꾼다.
        if(pFire)
        {
            pFire.canFire = false;
        }
    }


    // 트리거로부터 빠져나갔을 때

    private void OnTriggerExit(Collider other)
    {
        // 플레이어가 가진 PlayerFire 스크립트를 가져온다.
        PlayerFire pFire = other.GetComponent<PlayerFire>();

        // 만일, 플레이어가 맞다면 가져온 PlayerFire의 총알 발사 가능 변수를 true로 바꾼다.
        if(pFire)
        {
            pFire.canFire = true;
        }

    }



}

 

OnTrigger > 충돌 이벤트가 발생시 호출

GetComponent > 일치하는 다른 GameObject의 속성을 가져온다.

 

 

 

 

 

이때 PlayerFire에 영향을 받게 되었으니

PlayerFire에 상태를 체크하는 속성을 추가한다.

 // 만약 사용자가 마우스 왼쪽버튼을 누르면
        if (Input.GetButtonDown("Fire1"))
        {
            // 만일, 총알을 쏠 수 있는 상태라면
            if (canFire == true)
            {

                // bulletCount에 설정된 숫자만큼
                for (int i = 0; i < bulletCount; i++)
                {

                    // 총알공장에서 총알을 만들어서
                    GameObject bullet = Instantiate(bulletFactory);

                    // 총구 위치에 가져다 놓고싶다.
                    // bullet.transform.position = firePosition.transform.position;

                    // 최초 생성위치부터 1.5m 간격으로 생성.
                    bullet.transform.position = firstPos + new Vector3(i * 1.5f, 0, 0);


                }
            }
        }

bool > true/false로만 저장되는 변수 형식

 

 

PlayerFire 전문

더보기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 사용자가 마우스 왼쪽버튼을 누르면
// 총알을 발사하고싶다. (Bullet prefab을 읽어와서 총구 위치에 가져다 놓고싶다.)


// 플레이어가 발사할 총알의 수를 지정할 수 있는 변수 bulletCount를 추가한다.
// bulletCount에 설정된 숫자만큼 Player가 총알을 발사한다.
// 발사되는 총알의 간격은 1.5m로 균일해야한다.

public class PlayerFire : MonoBehaviour
{
    // 총알공장
    public GameObject bulletFactory;

    // 총구위치
    public GameObject firePosition;

    // 총알의 수
    public int bulletCount = 1;

    // 총알 발사 가능 체크용 변수
    public bool canFire = true;



    // 총알의 간격
    float spacing = 1.5f;

    

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

    // Update is called once per frame
    void Update()
    {
        
        // 총알의 총 간격 = (총알의 수 - 1) * 총알의 간격
        float totalSpacing = (bulletCount - 1) * spacing;

        // 총알의 최초 위치(벡터) = x: firePosition - (총알의 총 간격 / 2), y:0, z:0
        Vector3 firstPos = firePosition.transform.position - new Vector3(totalSpacing * 0.5f, 0, 0);


        // 만약 사용자가 마우스 왼쪽버튼을 누르면
        if (Input.GetButtonDown("Fire1"))
        {
            // 만일, 총알을 쏠 수 있는 상태라면
            if (canFire == true)
            {

                // bulletCount에 설정된 숫자만큼
                for (int i = 0; i < bulletCount; i++)
                {

                    // 총알공장에서 총알을 만들어서
                    GameObject bullet = Instantiate(bulletFactory);

                    // 총구 위치에 가져다 놓고싶다.
                    // bullet.transform.position = firePosition.transform.position;

                    // 최초 생성위치부터 1.5m 간격으로 생성.
                    bullet.transform.position = firstPos + new Vector3(i * 1.5f, 0, 0);


                }
            }
        }



    }
}