공부 좀 하자/Unity

Unity 또 하나의 충돌체크 Debug.DrawRay, Physics.Raycast 에 대해

개발성문 2018. 4. 2. 14:13

Unity 에서는 보통  충동 체크에 Collider, 


Box, Sphere, Capsule 등을 주로 사용합니다.



Debug 는 게임을 개발하는 동안 쉽게 디버깅하기 위해 목적의 클래스입니다.



public static void DrawRay(Vector3 startVector3 dirColor color = Color.white, float duration = 0.0f, bool depthTest = true);



DrawRay 는 색상과 함께  Start 지점부터 Start 지점 + dir(방향과 길이) 까지 선을 그리는 역할을 합니다.


Start는 시작 지점, dirRay의 방향과 길이, Color 는 라인의 색상, duration 은 라인의 표시 시간,  depthTest 는 라인이 


카메라에서 가까운 오브젝트에 의해 숨겨진 경우에 라인을 숨길지의 여부를 나타냅니다.



우선, 이정도 설명에서 소스를 보도록 하죠.


    private int speed = 10;
    private int rotateSpeed = 100;
    private int power = 7;

    private Transform swanPoint;
    public Transform bullet;

    private float raySpeed = 0;

    void Start () {
        swanPoint = transform.Find("SwanPoint");
    }
	
	
   void Update () {
        Move();
        Attack();
    }

    private void Move()
    {
        float moveSpeed = speed * Time.deltaTime;
        float rMoveSpeed = rotateSpeed * Time.deltaTime;

        float keyVertical = Input.GetAxis("Vertical");
        float keyHorizontal = Input.GetAxis("Horizontal");

        transform.Translate(Vector3.forward * keyVertical * moveSpeed);
        transform.Rotate(Vector3.up * keyHorizontal * rMoveSpeed);
    }

    void Attack()
    {
        // 1.
        Debug.DrawRay(swanPoint.position, swanPoint.forward * 15, Color.red);
    }

위 소스에서 1번에 DrawRay 를 사용하고 있습니다.


swanPoint의 시작점 부터 정면 방향으로 15 만큼의 길이까지, 빨간색의 라인을 그리도록 되어있습니다.



위의 그림과 같이 빨간색 선이 그려졌네요.


이제 저 라인에 적 Object 가 닿을 경우에 미사일을 발사하도록 처리하겠습니다.


void Attack() { Debug.DrawRay(swanPoint.position, swanPoint.forward * 15, Color.red); // 2. RaycastHit hit; // 3. if (Physics.Raycast(swanPoint.position, swanPoint.forward, out hit, 15)) { // Debug - 1 Debug.Log(hit.collider.name + "1"); // 4. if(hit.collider.name == "Enemy"){ // Debug - 2 Debug.Log(hit.collider.name + "2"); Transform obj = Instantiate(bullet, swanPoint.position, swanPoint.rotation); obj.GetComponent

().velocity = swanPoint.forward * power; } } }


RaycastHit 는 Raycast에서 정보를 다시 얻는데 사용합니다. 

3번의 조건 문에서 Physics.Raycast()를 사용했습니다.


public static bool Raycast (Vector3 originVector3 direction, RaycastHit hitInfo, float maxDistance= Mathf.Infinity);

origin : 광선의 시작점,

direction : 광선의 방향,

hitInfo :  RaycastHit 변수,

maxDistance : 광선의 충돌을 확인해야 하는 최대 거리

이상의 매개 변수를 사용 합니다.


Physics.Raycast(swanPoint.position, swanPoint.forward, out hit, 15) 는

광선에 충돌한 오브젝트를 RaycastHit 변수에 할당 처리하고, bool 값을 반환합니다.

4.
RaycastHit 변수를 통해 Object 의 이름을 확인합니다.

Enemy Object에 충돌하면 미사일을 생성해서 발사하도록 처리 했습니다.



그림을 클릭하면 할 수 있습니다.


Debug -1 , Debug -2 의 로그를 한번 확인해보겠습니다.



Enemy1 과 Enemy2 가 일정하게 찍히는 걸 확인 할 수 있습니다.


반면 Bullet1 은 찍히는 숫자가 크게 차이가 나는데, 처음에는 원인을 알 수 없었습니다.


하지만 잘 생각해보면 간단한 문제였죠.


미사일이 생성되서 발사되는데 Ray 광선 상에서 광성의 maxDistance 까지 이동 되기때문에 그 사이에 호출되는 것입니다.


이번 포스팅은 여기서 마치겠습니다.