상세 컨텐츠

본문 제목

총알 만들기

카테고리 없음

by MJ_119 2024. 2. 15. 05:30

본문

- 총알이 속도를 가지도록 하기 위해 리지드바디 컴포넌트 추가

 

- 콜라이더 설정 : 총알이 다른 총알에 충돌했을 때 튕겨나가지 않고 통과하도록 하기 위함.

 

- 트리거 콜라이더 : 충돌이 감지되었을 때 어떤 기능을 실행하는 방아쇠로 많이 사용

    ex. 특정 영역으로 진입 검사 후 새로운 적 출현, 컷씬을 재생.

 

- 프리팹 : 재사용할  수 있는 미리 만들어진 게임 오브젝트 파일(에셋), 현재씬이랑 다른씬에서도 사용 가능.

public class Bullet : MonoBehaviour
{
    public float speed = 8.0f;
    private Rigidbody bulletRigidbody;

    void Start()
    {
        bulletRigidbody = GetComponent<Rigidbody>();
		// velocity = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;
    }
}

 

- tranform 컴포넌트는 GetComponent<Transform>()등을 사용하여 직접 찾아오는 과정이 필요 없음.

- Transform : 타입

- transform : 변수

 

- 총알 자동 파괴하기 : 게임 오브젝트 파괴

        // 3초 뒤에 자신의 게임 오브젝트 파괴
        Destroy(gameObject, 3f);

 

Destroy(gameObject); -> 즉시파괴

Destroy(gameObject, 10f ); -> 10초뒤 파괴

 

- 충돌 : 리지드바디 컴포넌트 필요

 

- OnCollision : 일반 충돌, 입력으로 들어온 충돌한 상대방 게임 오브젝트,충돌 지점, 충돌표면의 방향 등을 알 수 있음.

 충돌한 두 콜라이더는 통과하지않고 서로 밀어냄

 OnCollisionEnter (Collision collosion) : 충돌한 순간

 OnCollisionStay (Collision collosion) : 충돌하는 동안

 OnCollisionExit (Collision collosion) : 충돌했다가 분리되는 순간

 

- OnTrigger : 트리거 충돌, 충돌했을 때 서로 통과함

 OnTriggerEnter(Collider other) : 충돌한 순간

 OnTriggerStay(Collider other) : 충돌하는 동안

 OnTriggerExit(Collider other) : 충돌했다가 분리되는 순간

 

Is Trigger 에 체크했으면 OnTriggerEnter()를 작성해야함.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Experimental.GraphView.GraphView;

public class Bullet : MonoBehaviour
{
    public float speed = 8f;
    private Rigidbody bulletRigidbody; // 이동에 사용할 리지드바디 컴포넌트

    void Start()
    {
        bulletRigidbody = GetComponent<Rigidbody>();
        
        // velocity = 앞쪽 방향 * 이동 속력
        bulletRigidbody.velocity = transform.forward * speed;

        // 3초 뒤에 자신의 게임 오브젝트 파괴
        Destroy(gameObject, 3f);
    }

    void OnTriggerEnter(Collider other)
    {
        //충돌한 상대방 게임 오브젝트가 Player 태그를 가진 경우
        if (other.CompareTag("Player"))
        // if (other.tag == "Player") 랑 동일
        {
            // 상대방 게임 오브젝트에서 PlayerController 컴포넌트 가져오기
            PlayerController playerController = other.GetComponent<PlayerController>();

            // 상대방으로부터 PlayerController 컴포넌트를 가져오는데 성공했다면
            if ( playerController != null )
            {
                //상대방 PlayerController 컴포넌트의 Die() 메서드 실행
                playerController.Die();
            }
        }
    }
}

 

- 탄알 생성기

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

public class BulletSpawner : MonoBehaviour
{
    public GameObject bulletPrefab; // 생성할 탄알의 원본 프리팹
    public float spawnRateMin = 0.5f; // 최소 생성 주기
    public float spawnRateMax = 3f; // 최대 생성 주기

    private Transform target; // 발사할 대상
    private float spawnRate; // 생성 주기
    private float timeAfterSpawn; // 최근 생성 시점에서 지난 시간

    // Start is called before the first frame update
    void Start()
    {
        // 최근 생성 이후의 누적 시간을 0으로 초기화
        timeAfterSpawn = 0f;

        // 탄알 생성 간격을 spawnRateMin과 spawnRateMax 사이에서 랜덤 지정
        spawnRate = Random.Range(spawnRateMin, spawnRateMax);

        // PlayerController 컴포넌트를 가진 게임 오브젝트를 찾아 조준 대상으로 설정
        target = FindObjectOfType<PlayerController>().transform;
    }

    // Update is called once per frame
    void Update()
    {
        // timeAfterSpawn 갱신
        timeAfterSpawn += Time.deltaTime;

        // 최근 생성 시점에서부터 누적된 시간이 생성 주기보다 크거나 같다면
        if (timeAfterSpawn >= spawnRate )
        {
            // 누적된 시간을 리셋
            timeAfterSpawn = 0f;

            // bulletPrefab의 복제본을 
            // transform.position 위치와 transform.rotation 회전으로 생성
            GameObject bullet = Instantiate(bulletPrefab, transform.position, transform.rotation);
            // 생성된 bullet 게임 오브젝트의 정면 방향이 target을 향하도록 회전
            bullet.transform.LookAt(target);

            // 다음번 생성 간격을 spawnRateMin, spawnRateMax 사이에서 랜덤 지정
            spawnRate = Random.Range(spawnRateMin, spawnRateMax);
        }
    }
}

 

- Random.Range(1, 4) : x와 y 사이의 랜덤값 설정

    - int값이면 1,2,3 중 int값 하나가 출력됨

    - float값이면 1f ~ 4f사이의 float 값이 출력됨

 

- FindObjectOfType< A 컴포넌트>().transform; -> A 컴포넌트를 가진 오브젝트를 찾아내서 위치를 설정.

    - Update() 메서드에서 사용하면 프로그램이 심각하게 느려질 수 있음.

 

- FindObjectsOfType : 해당 타입의 오브젝트를 모두 찾아 배열로 반환

 

- Instantiate(Prefab) : 원본 오브젝트를 주면 해당 오브젝트를 복제한 오브젝트를 생성.

- Instantiate(원본, 위치, 회전)

- Instantiate(prefab, transform.position, transform.rotation) : 복제본이 해당 위치와 회전으로 생성됨.