적 이동 제작과 충돌
💡 목표 : 적을 만들어 이동처리하고 싶다. 그리고 충돌 처리도 하고 싶다
순서
- 적 게임 오브젝트 생성
- 적 이동 스크립트를 생성 및 할당
- 이동스크립트 구현
- 다른 물체와 충돌 진행
1. 적 GameObject 생성 → cube 생성(Enemy), Position 위쪽으로
2. 이동스크립트 생성및 할당
3. 이동스크립트 구현
💡목표 : 아래로 계속 이동하고 싶다
필요속성 : 이동속소
순서 : 1. 방향구하기 2. 아래방향을 이동
- 앞서 구현한 것과 방향만 다름
- 코드
public class Enemy : MonoBehavior
{
//필요속성 : 이동속도
public float speed = 5;
void Update()
{
//1.방향을 구하고싶다
Vector3 dir = Vector3.down;
//2. P = P0 + vt
transform.position += dir * speed * Time.deltaTime();
}
}
4. 충돌설정하기
💡충돌 개념 이해하기
1. 충돌을 위한 조건 - 충돌체 vs RigidBody
- 충돌체
- 게임 오브젝트의 몸체(물리)
- 오브젝트의 Inspector의 컴포넌트 목록중 Box Colider
- 리자드 바디 (RigidBody)
- 충돌검사를 위해서는 자기자신과 남이 1:1로 충돌했는지 검사해야함
- ex) a,b,c가 있다면 a는 b 또는 c와 , b는 a또는 c와, c는 a또는 b와 검사해야함
- But 만약 10000명이 있다면? 10000 * 9999번 해야함 → 비효율적
So 게임 물리 엔진에서는 성능향상을 위해 움직이는 물체와 움직이지 않는 물체로 구분하고 움직이는 물체를 기준으로 충돌검사를 진행 → 검사해야할 물체수가 줄어듬!! - 기본적으로 움직이지 않는 물체끼리는 절대로 부딪힐 수 없다고 규정
-> 이때 구분을 위해 RigidBody를 이용한다
2. 물체끼리 충돌하기
- Add Componet를 이용해 Physics항목의 리자드바디 컴포넌트를 Enemy 객체에 추가
- 충돌은 되나 Enemy과 총알에 튕기는 것이 아닌 같이 사라져야함
- 내려오는 속도 또한 바뀜
- 리지드 바디 컴포넌트의 Use Gravity 속성을 해제 → Enemy는 스크립트를 통해 직접 이동시키기 때문에 필요없음 → 속도 조절 완료
3. 충돌한 물체 파괴하기
- Bullet과 Enemy가 충돌하면 파괴시키기
- 충돌에 관한 이벤트 함수(Unity에서 제공)
private void OnCollisionEnter(Collision other)
{
//충돌 시작
}
private void OnCollisionStay(Collision other)
{
//충돌 중
}
private void OnCollisionExit(Collsion other)
{
//충돌 끝
}
- Enemy.cs - 충돌하면 “너죽나죽”
- 우리는 구현하고 유니티에서는 물체가 부딪히면 알아서 호출.해줌 → 함수는 구현부와 호출부로 나뉨
- 이런 함수를 ‘이벤트 함수’라고 하고 접두사 ‘On’을 사용
- 3가지 충돌상태 중 충돌 시작 함수 ‘OnCollsionEnter’만 사용
//목표 : 다른 충돌체와 부딪혔다고 유니티가 알려주면 너죽고 나죽자
//필요함수 : 충돌시작(OnCollsionEnter)
//순서
//1. 너죽
//2. 나죽
public class Enemy : MonoBehavior
{
private void OnCollsionEnter(Collsion other)//Collsion other 변수는 나(Enemy)와 부딪힌 상대방 게임 오브젝트의 충돌체
{
//Destory : 게임 오브젝트를 파괴하는 함수
//너 죽고
Destroy(other.gameObject);
//나 죽자
Destroy(gameObject);
//Tip*
//Destroy 함수는 파괴를 요청할뿐
//실질적인 파괴는 object가 가지는 각 컴포넌트들의 OnDestroy함수가 호출됨으로써 이루어짐
//Destroy함수를 통해 객체의 컴포넌트들의 OnDestroy함수를 호출할 것을 요청
}
}
이제 적이 생성되면 이동하고 충돌시 물체가 서로 파괴된다
다음에는 적을 자동생성하고 생성시간을 랜덤하게 설정하는 작업을 해보도록 하자