상세 컨텐츠

본문 제목

붕어빵 게임 04] 스크립팅_ 마우스로 클릭한 오브젝트 따라다니기

본문

지난 시간에 마우스로 오브젝트를 클릭했을대 오브젝트의 이름을 가져오는 것까지 했다.

 

이번에는 오브젝트를 클릭했을때 클릭한 오브젝트를 마우스가 따라 오도록 하는 코딩을 해보겠습니다.

 

오브젝트에 따라 각각의 경우가 있다.

1. 장갑을 클릭했을 때  => 0

2. 주전자를 클릭했을 때 => 1 

3. 팥이나 팥스푼을 클릭했을 때 => 2

4. 붕어빵을 클릭했을 때 => true/false

5. 봉투를 클릭했을 때 => true/false

 

클릭했을때 데이터를 저장하는 변수를 선언해보겠습니다. 

장갑, 주전자, 팥/팥스푼을 클릭하는 경우는 중복이 될 수 없습니다. 그래서 int형으로 선언해서 번호를 부여해주겠습니다.

붕어빵, 봉투를 클릭했을 때는 장갑을 끼고 붕어빵이나 봉투를 클릭할 수 있기 때문에 각각 변수로 따로 주겠습니다. 클릭했나 안했나만 구분하기 때문에 bool 형으로 true, false값만 줄 수 있도록 하겠습니다.

 

모든 변수는 퍼블릭으로 선언을 해주겠습니다.

 

1) 변수 선언, 초기화 하기

각각 변수를 선언해보자.

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

public int ClickNum;      // 장갑,주전자,팥/팥스푼을 선택할때 설정할 변수

public bool isBongtooit; // 봉투 클릭 여부 저장하는 변수
public bool isBoogit;     // 붕어빵 클릭여부 저장하는 변수

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

 

변수는 Start()에서 초기화해보자.

처음에 ClickNum은 0,1,2 값이 아닌 값이 있어야한다. 

봉투나 붕어빵 변수는 선택이 안된 경우로 초기화 해준다.

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

Start(){

isBongtooit = false;
isBoogit = false;

ClickNum = -1;

}

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

 

2) 감지한 오브젝트 값을 입력받아 클릭했을때 변수 설정하기

 

FindObject()함수에서 

충돌된 오브젝트의 이름을 가져왔다.

이때 오브젝트의 이름을 매개변수로 받아서 위에 선언한 변수에 경우에 따라서 값을 설정해보자.

 

 

- FindObject()안에 함수 실행

void FindObjec()
    {
        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], leng, 

                                     LayerMask.GetMask("boongObject")); 

            //감지한 오브젝트별 ClickNum으로 매칭
            if(hit.collider != null){
                Debug.Log(hit.colldier.name);
                isObject(hit.collider.name);
            }
         }
    }

 

- isObject() 함수 선언

 

오브젝트 이름 변수설정
janggab ClickNum = 0
jujeonja ClickNum = 1
potThe 이나 pot ClickNum = 2

 

오브젝트 이름 변수설정
bongtoo, bongto, bongto1, bongto2, bongto3, bongto4, bongto5 isBongtooit = true
boong, pot, boong1, boong2, boong3, boong4, boong5 isBoogit =true

 

 

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

   void isObject(string str)
   {
        if(str == "janggab"){
            ClickNum =0;
        }else if(str == "jujeonja"){
            ClickNum =1;
        }else if( str == "potThe" || str == "potpot"){
            ClickNum =2;
        } 

        if(str == "bongtoo" || str == "bongto" || str == "bongto1" || str == "bongto2" || str == "bongto3" || str == "bongto4" || str == "bongto5")
            isBongtooit = true;

        if( str == "boong" || str == "pot" || str == "boong1" || str == "boong2" || str == "boong3" || str == "boong4" || str == "boong5" )
            isBoogit =true;
    }

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

 

 

위와 같이 코딩 후, 

플레이 버튼을 누르고 마우스로 오브젝트를 클릭하고,

변수 값을 확인해 보면서 맞게 값이 매칭이 되는지 확인해 보자.

 

jujeonja를 클릭하면 Click Num =0;

위에서 매칭한 값대로 되는 것을 확인할 수 있다.

 

 

 

 

 

3) 클릭한 오브젝트 마우스 따라다니게 하기

ClickNum 값이 클릭한 마우스를 기억하고 있기 때문에

이 변수를 사용해서 값에 따라서 마우스가 따라다니게 해보자.

 

*로직*

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

만약 ClickNum이 0이면 janggab오브젝트 팔로잉

아니면 만약 ClickNum이 1이면  jujeonja오브젝트 팔로잉

아니면 만약 ClickNum이 2이면 potThe오브젝트 팔로잉해라

=>

if(ClickNum==0){
            objectMove(janggab);
}else if(ClickNum==1){
            objectMove(jooObject);
}else if(ClickNum==2){
            objectMove(potscopeObject);
}

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

 

함수로 만들어서 Update에서 실행하게 해보자.

 

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

Update()

{

      ObjectFollowing();

}

 

void ObjectFollowing()
{
        if(ClickNum==0){ 
            objectMove(janggab);
        }else if(ClickNum==1){ 
            objectMove(jooObject);
        }else if(ClickNum==2){ 
            objectMove(potscopeObject);
        }
}

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

 

이제 플레이해보면, 

 

스푼을 클릭했을 때, 주전자가 잘 클릭 안되거나

주전자를 클릭했을 때, 장갑이 잘 클릭이 안되는 경우가 있다.

이유는 레이캐스트히트가 boongObject에서 감지가 되기 때문이다.

 

그래서 선택되서 움직이고 있는 오브젝트는 레이어를 변경해줘야 클릭했을때 감지가 안된다.

오브젝트가 선택이 되었을때 다른 레이어로 변경해주는 함수를 만들어보자.

 

 

4) 레이어 매니저 함수 만들기

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

*로직*

만약 ClickNum이 0이면, 장갑 레이어는 Water레이어로 변경해라, 나머지 레이어는 boongObject로 변경

아니면 만약 ClickNum이 1이면, 주전자 레이어는 Water레이어로 변경해라, 나머지 레이어는 boongObject로 변경

아니면 만약 ClickNum이 2이면, 팟스푼 레이어는 Water레이어로 변경해라, 나머지 레이어는 boongObject로 변경

=>

if(ClickNum ==0){
              janggab.layer = LayerMask.NameToLayer("Water");
              jooObject.layer = LayerMask.NameToLayer("boongObject");
              potscopeObject.layer = LayerMask.NameToLayer("boongObject");
}else if(ClickNum == 1){
              janggab.layer = LayerMask.NameToLayer("boongObject");
              jooObject.layer = LayerMask.NameToLayer("Water");
              potscopeObject.layer = LayerMask.NameToLayer("boongObject");
}else if(ClickNum == 2){
              janggab.layer = LayerMask.NameToLayer("boongObject");
              jooObject.layer = LayerMask.NameToLayer("boongObject");
              potscopeObject.layer = LayerMask.NameToLayer("Water");
}

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

 

레이어 매니저라고 함수 이름을 변경하고, 

오브젝트가 움직이기전에 레이어를 바꿔 주도록 해보자.

 

void objectMove(GameObject obj) 함수 앞줄에서 한번 실행해주도록 해보자.

함수가 선언이 되었어도 항상 작동하는 것이 아니라 실행할 수 있도록 실행문을 넣어 주어야 실행이 되기 때문에

함수를 만들고 꼭 실행을 해주도록 하자!

 

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

void objectMove(GameObject obj)
{
        LayerManager();
        Vector3 mousePosition Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3 vec = new Vector3(mousePosition.x, mousePosition.y, 0);
        obj.transform.position = vec;
}

 

 void LayerManager()
{
        if(ClickNum ==0){ 
              janggab.layer = LayerMask.NameToLayer("Water"); 
              jooObject.layer = LayerMask.NameToLayer("boongObject"); 
              potscopeObject.layer = LayerMask.NameToLayer("boongObject"); 
        }else if(ClickNum == 1){ 
              janggab.layer = LayerMask.NameToLayer("boongObject"); 
              jooObject.layer = LayerMask.NameToLayer("Water"); 
              potscopeObject.layer = LayerMask.NameToLayer("boongObject"); 
        }else if(ClickNum == 2){ 
              janggab.layer = LayerMask.NameToLayer("boongObject"); 
              jooObject.layer = LayerMask.NameToLayer("boongObject"); 
              potscopeObject.layer = LayerMask.NameToLayer("Water"); 
        }
}

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

 

 

플레이 버튼을 클릭하고 다른 오브젝트가 잘 클릭이 되는지 확인해보자.

 

클릭이 잘 되는 것을 볼 수 있다. 

 

 

 

 

 

 

 

5) 정리

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseObject : MonoBehaviour
{
    public GameObject janggab;          //장갑
    public GameObject jooObject;        //주전자
    public GameObject potscopeObject;   //팟스푼
    public GameObject[] bongtoo;        //봉투
    public GameObject[] boonga;         //붕어

    public Vector3[] vecPo; 
    public float length; 

    public int ClickNum;      // 장갑,주전자,팥/팥스푼을 선택할때 설정할 변수
    public bool isBongtooit; // 봉투 클릭 여부 저장하는 변수
    public bool isBoogit;     // 붕어빵 클릭여부 저장하는 변수


    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); 

        isBongtooit = false; 
        isBoogit = false;
        ClickNum = -1;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown (0)) {
            FindObject();
        }
        objectMove(gameObject);
        ObjectFollowing();
    }
    
    void objectMove(GameObject obj)
    {
        LayerManager();
        Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3 vec = new Vector3(mousePosition.x, mousePosition.y, 0);
        obj.transform.position = vec;
    }

   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("boongObject"));
           if(hit.collider != null){
                Debug.Log(hit.collider.name);
                isObject(hit.collider.name);
           }
       }
   }

   void isObject(string str)
   {
        if(str == "janggab"){
            ClickNum =0;
        }else if(str == "jujeonja"){
            ClickNum =1;
        }else if( str == "potThe" || str == "potpot"){
            ClickNum =2;
        } 

        if(str == "bongtoo" || str == "bongto" || str == "bongto1" || str == "bongto2" || str == "bongto3" || str == "bongto4" || str == "bongto5")
            isBongtooit = true;

        if( str == "boong" || str == "pot" || str == "boong1" || str == "boong2" || str == "boong3" || str == "boong4" || str == "boong5" )
            isBoogit =true;
    }

    void ObjectFollowing()
    {
        if(ClickNum==0){ 
            objectMove(janggab);
        }else if(ClickNum==1){ 
            objectMove(jooObject);
        }else if(ClickNum==2){ 
            objectMove(potscopeObject);
        }
    }

    void LayerManager()
    {
        if(ClickNum ==0){ 
              janggab.layer = LayerMask.NameToLayer("Water"); 
              jooObject.layer = LayerMask.NameToLayer("boongObject"); 
              potscopeObject.layer = LayerMask.NameToLayer("boongObject"); 
        }else if(ClickNum == 1){ 
              janggab.layer = LayerMask.NameToLayer("boongObject"); 
              jooObject.layer = LayerMask.NameToLayer("Water"); 
              potscopeObject.layer = LayerMask.NameToLayer("boongObject"); 
        }else if(ClickNum == 2){ 
              janggab.layer = LayerMask.NameToLayer("boongObject"); 
              jooObject.layer = LayerMask.NameToLayer("boongObject"); 
              potscopeObject.layer = LayerMask.NameToLayer("Water"); 
        }
    }

}

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

 

여기에서 문제가, 오브젝트를 클릭했을때 다른 오브젝트는 원래 자리로 이동해야한다.

다음시간에는 오브젝트 위치를 제어해보자!

관련글 더보기