- 총알이 속도를 가지도록 하기 위해 리지드바디 컴포넌트 추가
- 콜라이더 설정 : 총알이 다른 총알에 충돌했을 때 튕겨나가지 않고 통과하도록 하기 위함.
- 트리거 콜라이더 : 충돌이 감지되었을 때 어떤 기능을 실행하는 방아쇠로 많이 사용
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) : 복제본이 해당 위치와 회전으로 생성됨.