똥을 맞았을때 반응하기 위해서 충돌 판정이라는 것을 배워보도록 합시다 ^^

 

 

게임을 만들때 아무런 설정을 해주지 않으면 오브젝트끼리 충돌해도 그냥 통과하게 됩니다.

 

이를 막기 위해 오브젝트끼리 충돌하는지 항상 감시하고, 충돌하면 특정한 처리를 합니다.

 

 

 

특정 처리를 둘로 나누어서, 충돌을 감지하는 부분을 충돌 판정,

 

충돌을 감지한 다음의 움직임을 정하는 부분을 충돌 반응이라고 합니다.

 

 

 

오브젝트끼리 닿았는지 엄밀히 감지하려면 오브젝트의 윤곽선이 닿았는지 검사해야 하지만,

 

계산량이 매우 많고 스크립트도 복잡합니다.

 

그래서 좀 더 간단한 방법을 사용합니다.

 

오브젝트의 형상을 단순하게 원형이라고 가정합니다.

 

원형은 오브젝트의 윤곽을 확인하지 않아도 원의 중심 좌표와 반경을 알면 충돌 판정을 간단히 할 수 있습니다.

 

 

 

기존에 만든 DongController를 더블클릭하고 스크립트를 다음과 같이 수정합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class DongController : MonoBehaviour {
    GameObject player;//캐릭터 오브젝트
 
    // Use this for initialization
    void Start () {
        this.player = GameObject.Find("iu");//캐릭터 오브젝트를 추가한다.
    }
    
    // Update is called once per frame
    void Update () {
        transform.Translate(0,-0.1f,0);//0.1f의 속도만큼 낙하시킨다.
 
        if (transform.position.y < -5.0f)//똥의 y위치가 -5.0 밑으로 간다면 즉, 화면에서 사라진다면
        {
            Destroy(gameObject);//똥오브젝트를 삭제해라
        }
 
        //충돌판정
        Vector2 p1 = transform.position; //똥의 중심 좌표
        Vector2 p2 = this.player.transform.position; //캐릭터의 중심 좌표
        Vector2 dir = p1 - p2;
        float d = dir.magnitude;
        float r1 = 0.5f; //똥 반경
        float r2 = 1.0f; //플레이어 반경
        
        if(d<r1+r2){
            //충돌하면 똥을 소멸시킨다.
            Destroy(gameObject);
        }
    }
}
cs

 

6: 캐릭터의 좌표를 구하기 위해서 캐릭터 오브젝트를 불러올겁니다.

10: 빈 게임오브젝트에 캐릭터 오브젝트를 추가했습니다.

23~24:똥과 캐릭터의 좌표를 저장했습니다.

25:캐릭터의 좌표-똥의 좌표

26:-의 결과가 담긴 dir의 길이를 구합니다(magnitude)

27~28:똥과 캐릭터의 반경을 구합니다.

30~33:똥과 캐릭터의 거리가 반경의 합(r1+r2) 이하면 충돌했다고 여겨 Destroy 메소드로 똥 오브젝트 소멸

 

 

게임을 실행해보죠.

 

 

참고도서 : 유니티5 교과서

+ Recent posts