상세 컨텐츠

본문 제목

Unity Beginner ch. 07-1] 레이캐스트 분신술! 벡터 배열

Unity Beginner

by allma 2020. 5. 5. 04:28

본문

ch.07에서 레이캐스트를 하나 사용했는데 이렇게 하나만 쓰면 감지가 잘 안될 수 있다.

(느낌상 그렇다;)

 

여기에서 레이를 원점을 기준으로 상하좌우로 해서 감지하기 더욱 쉽게 해보자.

 

1) 사방으로 레이그리기

-----------------------

    void Update() 
    { 
        Vector3 vecPo1 = new Vector3(0,1f,0); 
        Debug.DrawRay(transform.position, vecPo1, new Color(0,1,0)); 
        Vector3 vecPo2 = new Vector3(0,-1f,0); 
        Debug.DrawRay(transform.position, vecPo2, new Color(0,1,0)); 
        Vector3 vecPo3 = new Vector3(1f,0,0); 
        Debug.DrawRay(transform.position, vecPo3, new Color(0,1,0)); 
        Vector3 vecPo4 = new Vector3(-1f,0,0); 
        Debug.DrawRay(transform.position, vecPo4, new Color(0,1,0)); 
    }

-----------------------

플래이 버튼을 누르면 아래와 같이 되 있는 것을 볼 수 있다.

컴퓨터는 단순한 일을 잘한다. 컴퓨터를 사용하는 이유 중에 하나가 단순 노동을 생략하고 싶어서 컴퓨터를 사용하는데 

위와 같이 코딩하는 것은 매우 효율이 떨어진다. 그래서 반복되는 부분에, 숫자만 변하고 있는 상황이라면 우리는 for문을 사용한다. 

 

먼저 벡터와 레이부터 나열해보자.

 

Vector3 vecPo1 = new Vector3(0,1f,0); 

Vector3 vecPo2 = new Vector3(0,-1f,0); 

Vector3 vecPo3 = new Vector3(1f,0,0); 

Vector3 vecPo4 = new Vector3(-1f,0,0); 

 

벡터가 단위벡터와 같은 것을 알 수 있다. 

이레 drawray도 모아보자.

 

Debug.DrawRay(transform.position, vecPo1, new Color(0,1,0)); 

Debug.DrawRay(transform.position, vecPo2, new Color(0,1,0)); 

Debug.DrawRay(transform.position, vecPo3, new Color(0,1,0)); 

Debug.DrawRay(transform.position, vecPo4, new Color(0,1,0)); 

 

위와 같은 내용은 vecPo에 숫자 부분만 변하고 있는 것을 볼 수 있다. 

 

이를 간결하게 하기 위해서 벡터를 선언할때 배열로 선언하면 된다. 

 

 

 

 

 

 

 

 

2) 벡터 배열 선언

벡터를 배열로 선언하는 방법은 간단하다.

일반적인 벡터 선언은 아래와 같다

-----------------

public Vector3 vecPo;

-----------------

 

여기에서 []만 삽입해주면 벡터를 만들 수 있다.

-----------------

public Vector3[] vecPo;

-----------------

 

저장하고 Mouse 오브젝트로 가보면 다음과 같이 변수가 생성되어있다.

 

펼침단추를 클릭하고 사이즈를 정해준다.

벡터 4개가 필요하니까 사이즈를 4로 정해준다.

사이즈를 정하면 벡터 값이 생성된다.

각각 값을 써 넣어 주면 초기값으로 값이 지정된다. 

 

 

위와 같은 방법으로도 해도 되는데,

Element를 0으로 다 바꾸고 스크립트 안에서 초기화 해보자.

초기화 할때는 Start() 함수에 초기화 해준다.

 

---------------------------

    void Start()
    {
        vecPo[0] =new Vector3(1,0,0);
        vecPo[1] =new Vector3(-1,0,0);
        vecPo[2] =new Vector3(0,1,0);
        vecPo[3] =new Vector3(0,-1,0);
    }

---------------------------

 

 

 

 

 

 

 

3) 벡터 길이 변수 사용

여기에서 벡터를 그렸는데 길이가 너무 길거나 짧을때 수정해줘야할때가 있다 이럴때 길이를 따로 변수로 정해놓으면 수정이 용이하다. 길이도 변수로 선언해보자. 유니티에서는 int형보다 float형을 더 선호하고, 길이도 소수점으로 수정해야할 경우가 많아서 float형으로 선언해보자.

 

--------------------------

public float length;

--------------------------

 

선언한 길이는 스크립트에서 값을 변경할 수 있고

Start()함수에서 선언해줘도 된다. Start()에 선언할때는 뒤에 f를 붙여야 인식된다.(예 0.5f)

----------------

length=0.5f;

----------------

그러면 벡터 배열에 초기값을 전부 length로 변경해보자.

 

=================

    public Vector3[] vecPo;
    public float length;

    void Start()
    {
        length = 0.5f ;
        vecPo[0] =new Vector3(length,0,0);
        vecPo[1] =new Vector3(-length,0,0);
        vecPo[2] =new Vector3(0,length,0);
        vecPo[3] =new Vector3(0,-length,0);
    }

=================

 

 

 

 

 

4) for문으로 레이그리기

이제 벡터는 생성되었다 

1)에서와 같이 벡터를 그려보자. 배열을 사용하는 방법중에 하나는 for문을 사용해서 index를 증가하면서 일정한 값을 변경할 수 있다.

 

위에서 벡터에 있는 내용을 그리려면 다음과 같이 해주었다 

Debug.DrawRay(transform.position, vecPo1, new Color(0,1,0)); 

Debug.DrawRay(transform.position, vecPo2, new Color(0,1,0)); 

Debug.DrawRay(transform.position, vecPo3, new Color(0,1,0)); 

Debug.DrawRay(transform.position, vecPo4, new Color(0,1,0)); 

 

여기에서 vecPo에서 1,2,3,4 숫자가 일정하게 변하는 것을 볼 수 있다.

index라는 변수를 int형으로 선언해서 루푸를 돌리는데 한번 돌리고 index를 1씩 올리는 방법인데,

index가 1씩 올라가니 숫자가 올라가는 부분에 index를 써주면 된다.

 

=================

for(int index=0 ; index<vecPo.Length ; index++){
              Debug.DrawRay(transform.position, vecPo[index], new Color(0,1,0)); 
}

=================

 

 

위에서와 같이 나오는 것을 볼 수 있다.

여기에서 length를 변경하면 한꺼번에 길이도 변경되는 것을 볼 수 있다.

 

레이캐스트도 똑같이 넣어주면 된다.

여기에 감지했을때 이름을 가져와보자.

 

=================

for(int index=0 ; index<vecPo.Length ; index++){ 
    Debug.DrawRay(transform.position, vecPo[index], new Color(0,1,0));  

    RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo[index], 1f, LayerMask.GetMask("Water"));

    if(hit.collider != null){
            Debug.Log(hit.collider.name);
    }
}

=================

 

 

6) 함수로 모듈화하기

 

void Update()

{

    FindObject();

}

 

void FindObject()

{

    for(int index=0 ; index<vecPo.Length ; index++){ 
        Debug.DrawRay(transform.position, vecPo[index], new Color(0,1,0));  

        RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo[index], 1f, LayerMask.GetMask("Water"));

        if(hit.collider != null){
            Debug.Log(hit.collider.name);
        }
    }

}

 

 

 

 

 

 

7) 정리

 

    public Vector3[] vecPo; 
    public float length; 

    void Start() 
    { 
        length = 0.5f ;
        vecPo[0] =new Vector3(length,0,0); 
        vecPo[1] =new Vector3(-length,0,0); 
        vecPo[2] =new Vector3(0,length,0); 
        vecPo[3] =new Vector3(0,-length,0); 
    }

 

   void Update()

   {

       FindObject();

   }

 

   void FindObject()

   {

       for(int index=0 ; index<vecPo.Length ; index++){ 
          Debug.DrawRay(transform.position, vecPo[index], new Color(0,1,0));  

          RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo[index], 1f, LayerMask.GetMask("Water"));

          if(hit.collider != null){
            Debug.Log(hit.collider.name);
          }
       }

    }

 

 

8) 정리2

마우스 클릭했을때 오브젝트 감지하기

 

 

    public Vector3[] vecPo; 
    public float length; 

    void Start() 
    { 
        length = 0.5f ;
        vecPo[0] =new Vector3(length,0,0); 
        vecPo[1] =new Vector3(-length,0,0); 
        vecPo[2] =new Vector3(0,length,0); 
        vecPo[3] =new Vector3(0,-length,0); 
    }

 

   void Update()

   {

        if (Input.GetMouseButtonDown (0)) {
            FindObject();
        }

   }

 

   void FindObject()

   {

       for(int index=0 ; index<vecPo.Length ; index++){ 
           Debug.DrawRay(transform.position, vecPo[index], new Color(0,1,0));  

          RaycastHit2D hit = Physics2D.Raycast(transform.position, vecPo[index], 1f, LayerMask.GetMask("Water"));

          if(hit.collider != null){
            Debug.Log(hit.collider.name);
         }
       }

    }

 

관련글 더보기