ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 레벨 디자인, Debug.DrawRay, RayCast, RayCastHit
    유니티/유니티 메인 2024. 2. 7. 00:44

    우선 카메라와 스테이지를 넣은뒤 위치나 방향을 조절한다

     

    2D는 어떤지 모르겠는데 3D는 기왕이면 오브젝트도 깔끔한 위치에 배치하는것이 가장 베스트인것같다

     

    내가 이걸 신경안쓰고 오브젝트 아무렇게나 놓았다가 고생하고 다시 만드는중이다

     

    이렇게 깔끔하게~

    2D와 달리 3D에서는 기본적으로 라이트가 제공된다. 이번게임은 그림자가 이용되는 게임이기에 라이트를 조절해보자

     

    Light를 선택하고 바로 위에서 직빵으로 빛을 비춰야하기 때문에 Rotation X축을 90도로 맞춘뒤

    빛이 너무 강하지 않게 Intensity를 0.7로 내려주자

    그리고 바구니를 배치해주자. 혹시 바구니의 그림자가 너무 부자연스럽다면 설정창에서 조절 가능하다

    Edit - Project Setting - Quality - Shadow Distance : 30

    더 좋아진것을 확인할 수 있다

    바구니를 움직이는 스크립트를 만들기 전, Ray를 보다 더 쉽게 이해하기 위해 Debug.DrawRay를 사용해 

    마우스를 클릭하는곳마다 빨간색 선을 만들어보는 스크립트를 짜보자

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraControl : MonoBehaviour
    {
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    
                Debug.DrawRay(ray.origin, ray.direction * 20f, Color.red, 10);
            }
        }
    }

     

    우선 마우스 왼쪽 버튼을 클릭하는 순간 Ray 클래스 ray 변수를 선언한뒤

    ScreenPointToRay 메서드를 통해 카메라 좌표에서 마우스가 위치한 게임 화면 안쪽으로 방향을 향해 나가는 광선값을 넣어준다

     

    그리고 그 광선을 직접적으로 보기 위해 Debug.DrawRay를 사용한다

    Debug.DrawRay(ray.origin, ray.direction, Color.red, 10);

                                시작위치      방향             색상     보이는시간

     

    여기서 궁금한건 왜 Input.mousePosition을 그대로 사용하지 않고 왜 굳이 Ray를 만들어줘야 하는걸까?

    그 이유는 Input.mousePosition의 값은 스크린 좌표이기 때문이다. 

    하지만 여기서 필요한것은 월드좌표이기 때문에 스크린좌표인 Input.mousePosition을 월드좌표로 바꿔줄

    ScreenPointToRay 메서드를 사용하는것이다

     

    스크립트는 어느 오브젝트에 넣던 정상작동한다.

     

     

     

    이제 바구니가 움직이는 스크립트를 만들어보자. 

     

    여기서 주의할건 클릭하는 위치로로 바구니가 이동해야하고,

    정확히는 클릭한 위치의 사각형 중심으로 바구니가 이동해야 한다는 것이다.

     

    하지만 스크립트를 보기전 우선 RaycastHit라는게 무엇인지부터 찾아보자

     

    가장 첫번째줄을 보면 객체와 Ray의 충돌에 대한 결과 정보를 저장하는 구조체라고 한다

    또 스크립트 바로 밑에 Ray를 발사하면 캐스팅 결과에 따라 충돌에 대한 정보를 RaycastHit 변수에 저장한다고 한다

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BasketControl : MonoBehaviour
    {
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                //Debug.DrawRay(ray.origin, ray.direction * 20f, Color.red, 10);
                RaycastHit hit;
                if(Physics.Raycast(ray, out hit, Mathf.Infinity)) 
                {
                    float x = Mathf.RoundToInt(hit.point.x);
                    float z = Mathf.RoundToInt(hit.point.z);
                    transform.position = new Vector3(x, 0, z);
                }
            }
        }
    }

     

     

    이제 이 스크립트를 보자.

     

    마우스를 클릭하는순간,

    if (Input.GetMouseButtonDown(0))
            {           ray에 마우스를 클릭한 위치의 월드좌표를 받는다
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                       ray를 직접 선으로 볼수 있게 해주는 Debug.DrawRay

                //Debug.DrawRay(ray.origin, ray.direction * 20f, Color.red, 10);

                RaycastHit식 변수 hit 선언
                RaycastHit hit;

                     만약 ray가 무언가와 충돌했다면
                if(Physics.Raycast(ray, out hit, Mathf.Infinity)) 
                {         x변수에는 충돌한곳의 x좌표를
                    float x = Mathf.RoundToInt(hit.point.x);

                          z변수에는 충돌한곳의 z좌표를 저장한다
                    float z = Mathf.RoundToInt(hit.point.z);

                         그리고 접시를 Vector3 형식으로 받은 좌표만큼 이동한다
                    transform.position = new Vector3(x, 0, z);

     

    이렇게 스크립트를 짠뒤 Basket에 적용을 해도 실행시 움직이지 않는다

     

    바로 무대와 바구니에 콜라이더가 적용되있지 않기 때문이다

     

     

    각각 적당하게 Box 콜라이더를 맞춰서 넣어주자

     

    이제 클릭하는 위치의 사각형 정가운데로 이동하는것을 볼 수 있다

    '유니티 > 유니티 메인' 카테고리의 다른 글

    직렬화를 이용하여 저장 객체 저장  (1) 2024.02.15
    json 응용  (0) 2024.02.14
    3D(Terrian, 파티클, Ray 클래스)  (1) 2024.02.05
    물리엔진, 애니메이션, 씬변환  (2) 2024.02.05
    프리팹, 충돌판정  (2) 2024.02.04
Designed by Tistory.