
Retro 유니티 서적을 공부한 내용을 정리합니다.
컴포넌트의 물리적 충돌을 위한 정보.
따라서 이 콜라이더를 가진 물체끼리 충돌시 튕겨 나가게 됨.
트리거 콜라이더는 충돌한 물체를 밀어내는 물리적 표면이 없음
따라서 일반 콜라이더와 충돌시 충돌감지만 진행되고, 일반 콜라이더를 가진 오브젝트는 이를 통과하게 됨.
따라서 트리거 콜라이더를 통해서 도착 여부를 판단하거나, 새로운 오브젝트 출현 등등으로 활용이 가능
언제든지 재사용할 수 있는 미리 만들어진 게임 오브젝트 파일.
비슷한 옵젝을 여러번 만드는 번거로움을 줄이기 위해 탄생
따라서 어떤 옵젝을 프리펩으로 만들면, 추후에 똑같은 옵젝을 재사용해서 만들 수 있음.
프리펩을 만드는 방법은 하이어라키 창에서 프로젝트 에셋 창으로 드래그 & 드랍
하면 간단히 프리펩을 만들 수 있음.
public float speed = 8f;
private Rigidbody bulletRigidbody;
// Start is called before the first frame update
void Start()
{
bulletRigidbody = GetComponent<Rigidbody>();
bulletRigidbody.velocity = transform.forward * speed;
Destroy(gameObject, 3f);
}
탄알의 RigidBody 컴포넌트의 velocity를 조절하는 방식을 사용
transform 컴포넌트를 이용하여 앞쪽 방향에 지정해놓은 속도값을 곱함.
모든 오브젝트들이 갖고 있는 컴포넌트로, 위치, 크기, 회전을 담당.
이 컴포넌트는 GetComponent<Transform>처럼 가져올 필요 없이
그냥 transform으로 가져오기 가능
입력한 오브젝트를 파괴
두번째 파라미터에 시간을 할당, 그 시간이 되면 옵젝이 파괴
게임 오브젝트는 자신이 충돌한 사실을 알 수 없음.
그 대신 충돌했다는 메시지가 해당 오브젝트에게 전달.
메시지를 받은 오브젝트는 충돌 사실을 알고, 상황에 맞는 메서드를 실행
OnTriggerEnter 혹은 OnCollisionEnter 메시지를 받음
충돌 메시지에는 충돌한 상대방 게임 오브젝트 정보도 담김.
이 충돌 메시지는 Rigidbody 컴포넌트에서 발생시기키 때문에,
충돌 구현시 어느 한쪽은 꼭 RigidBody 컴포넌트가 있어야 함.
일반적 콜라이더 가진 두 옵젝 충돌시 발생, 충돌시 서로 밀어냄.
collision 타입은 충돌 관련 정보를 담아두는 컨테이너,
입력으로 들어온 collision 을 통해서 충돌한 상대방 게임 오브젝트, 충돌지점, 충돌 표면의 방향을 알 수 있음
충돌한 오브젝트의 콜라이더 중 최소 하나가 트리거 콜라이더라면 자동 실행
충돌시 서로 그대로 통과
collider 타입으로 받는 이유는 트리거 충돌은 통과하기 때문에 상세한 정보가 필요 없기 때문.
other는 충돌한 상대방 컴포넌트를 가리킴
void OnTriggerEnter(Collider other) {
if (other.tag == "Player")
{
PlayerController playerController = other.GetComponent<PlayerController>();
if(playerController != null)
{
playerController.Die();
}
}
}
OnTriggerEnter 메서드를 활용, Player 태그를 가진 오브젝트와 충돌시
PlayerController 컴포넌트의 Die 메서드를 실행
// Start is called before the first frame update
void Start()
{
timeAfterSpawn = 0f;
spawnRate = Random.Range(spawnRateMin, spawnRateMax);
target = FindObjectOfType<PlayerController>().transform;
}
// Update is called once per frame
void Update()
{
timeAfterSpawn += Time.deltaTime;
if(timeAfterSpawn >= spawnRate)
{
timeAfterSpawn = 0f;
GameObject bullet
= Instantiate(bulletPrefab, transform.position, transform.rotation);
bullet.transform.LookAt(target);
spawnRate = Random.Range(spawnRateMin, spawnRateMax);
}
}
입력으로 받은 최대, 최솟값 사이 랜덤한 숫자를 출력
타겟에는 탄알이 날아갈 대상을 지정하는게 맞지만,
만약 탄알 생성기가 여러개라면 일일히 Player 게임 오브젝트를 지정하는게 귀찮음.
따라서 코드상에서 Player 게임 오브젝트의 트랜스폼 컴포넌트를 찾아서 가져옴.
target = FindObjectOfType<PlayerController>().transform;
PlayerController playerController = FindObjectOfType<PlayerController>()
target = playerController.transform;
위 두 코드는 동일함.
다만 이 FindObjectType 메서드는 씬 내 모든 옵젝을 검색하기 때문에 실행비용이 높다.
초당 프레임은 컴퓨터 성능에 따라 다르기 때문에 고정되어있지 않음
따라서 update 메서드 실행 사이 간격을 알기 위해 사용
Update 메서드에 Time.deltaTime을 계속 누적하면 특정 시점으로부터
얼마나 시간이 흘렀는지 알 수 있다.
탄알을 복제 및 생성하는데 Instantiate([원본], [위치], [회전]) 메서드를 사용.
유니티는 게임 도중 실시간으로 옵젝 생성시 이 메서드를 사용함.
따라서 기존에 만들어놓은 탄알 프리팹을 입력으로 넣어서
탄알을 실시간으로 복제 생성함.