퍼온 자료

Unity 유니티 오브젝트 선택, 클릭, 터치, 접근, 상호작용 이벤트

ITSkeleton 2020. 6. 18. 11:38
728x90
반응형

출처: https://mentum.tistory.com/192

Unity/프로그래밍

Touch로 3d오브젝트 선택하기

 void Update()

    {

        if (Input.GetMouseButtonDown(0))

        {

            RaycastHit hit;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            Physics.Raycast(ray, out hit);

 

            if (hit.collider != null)

            {

                CurrentTouch = hit.transform.gameObject;

                EventActivate();

            }

        }

    }

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://blog.danggun.net/1833

 

이전 코드와 달라진것은 스크립이 들어있는 오브젝트와 클릭판정을 받은 오브젝트가 같은지 확인 하는 코드가 추가 됩니다.

 

using UnityEngine; 
using System.Collections; 

public class claMouseClick : MonoBehaviour 
{

Camera _mainCam = null; 

/// 
/// 마우스의 상태
/// 
private bool _mouseState;

/// 
/// 마우스가 다운된 오브젝트
/// 
private GameObject target;
/// 
/// 마우스 좌표
/// 
private Vector3 MousePos;

//4.x 버전에서는 'void Start()'로 바꿔 주세요.
void Awake() 
    {
_mainCam = Camera.main;
    } 

// Update is called once per frame 
void Update () 
    {

//마우스가 내려갔는지?
        if ( true == Input.GetMouseButtonDown(0)) 
        {
//내려갔다.

//타겟을 받아온다.
            target = GetClickedObject(); 

//타겟이 나인가?
if ( true == target.Equals(gameObject)) 
            {
//있으면 마우스 정보를 바꾼다.
_mouseState = true; 
}

        }
else if ( true == Input.GetMouseButtonUp(0)) 
        {
//마우스가 올라 갔다.
//마우스 정보를 바꾼다.
            _mouseState = false; 
        }



//마우스가 눌렸나?
//스케일을 조절하여 클릭됬음을 확인한다.
if (true == _mouseState)
{
//눌렸다!
transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
}
else
{
transform.localScale = new Vector3(1f, 1f, 1f);
}




/// 
/// 마우스가 내려간 오브젝트를 가지고 옵니다.
/// 
/// 선택된 오브젝트
    private GameObject GetClickedObject() 
    {
//충돌이 감지된 영역
RaycastHit hit;
//찾은 오브젝트
GameObject target = null; 

//마우스 포이트 근처 좌표를 만든다.
Ray ray = _mainCam.ScreenPointToRay(Input.mousePosition); 

//마우스 근처에 오브젝트가 있는지 확인
if( true == (Physics.Raycast(ray.origin, ray.direction * 10, out hit))) 
{
//있다!

//있으면 오브젝트를 저장한다.
target = hit.collider.gameObject; 


        return target; 
    } 


테스트용으로 클릭되면 스케일을 조절 했습니다.

 

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://ggilrong.tistory.com/entry/Unity-%EB%A7%88%EC%9A%B0%EC%8A%A4-%ED%81%B4%EB%A6%AD-%ED%95%9C-%EC%9C%84%EC%B9%98%EC%97%90-%EC%9E%88%EB%8A%94-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-%EC%B0%BE%EA%B8%B0-PlayMakerFSM-%EC%97%90-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%A0%84%EB%8B%AC

 

[Unity] 마우스 클릭 한 위치에 있는 오브젝트 찾기 + PlayMakerFSM 에 이벤트 전달

 

if(Input.GetMouseButton(0)) {
   ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   if (Physics.Raycast(ray, out hit, 5000)) {
    Debug.Log("name : " + hit.collider.name);
    //PlayMakerFSM fsm = hit.collider.GetComponent<PlayMakerFSM>();
    //fsm.SendEvent("이벤트명");

   }
  }



출처: https://ggilrong.tistory.com/entry/Unity-마우스-클릭-한-위치에-있는-오브젝트-찾기-PlayMakerFSM-에-이벤트-전달 [낄롱의 블로그]

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: http://blog.naver.com/ateliersera/220439790504

 

유니티 - Raycast 로 오브젝트 선택 하기. 2D, 3D 버젼  

 

기초중에 하나인, 화면 터치 -터치된 오브젝트를 선택하는 방법 입니다.

 

private GameObject target;

 

void FixedUpdate()

{

if (Input.GetMouseButtonDown (0)) {

CastRay ();

if (target == this.gameObject) {  //타겟 오브젝트가 스크립트가 붙은 오브젝트라면

// 여기에 실행할 코드를 적습니다.

}

}

 

void CastRay() // 유닛 히트처리 부분.  레이를 쏴서 처리합니다. 

{

target = null;

 

Vector2 pos = Camera.main.ScreenToWorldPoint (Input.mousePosition);

RaycastHit2D hit = Physics2D.Raycast (pos, Vector2.zero, 0f);

 

if (hit.collider != null) { //히트되었다면 여기서 실행

//Debug.Log (hit.collider.name);  //이 부분을 활성화 하면, 선택된 오브젝트의 이름이 찍혀 나옵니다. 

target = hit.collider.gameObject;  //히트 된 게임 오브젝트를 타겟으로 지정

}

}

 

2D 오브젝트라면 위와 같겠습니다.  RaycastHit2D 를 활용해야 합니다. 

 

 

아래는 3D 오브젝트일때, 3D 오브젝트를 받아서 하는 방식 입니다. 

 

private GameObject target;

 

void Update()

{

if (Input.GetMouseButtonDown (0)) 

{

target = GetClickedObject() ;

 

if(target.Equals(gameObject))  //선택된게 나라면

{

//여기에다가 코드 작성 하시면 됩니다. 

}

 

}

}

 

private GameObject GetClickedObject() 

{

        RaycastHit hit;

        GameObject target = null; 

 

        

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //마우스 포인트 근처 좌표를 만든다. 

         

 

        if( true == (Physics.Raycast(ray.origin, ray.direction * 10, out hit)))   //마우스 근처에 오브젝트가 있는지 확인

        {

            //있으면 오브젝트를 저장한다.

            target = hit.collider.gameObject; 

        } 

 

        return target; 

    } 

}

 

위와 같은 식으로 게임오브젝트로 받아도 됩니다.

[출처] 유니티 - Raycast 로 오브젝트 선택 하기. 2D, 3D 버젼|작성자 대천사

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://itpangpang.xyz/177

 

 

유니티 C# 4일차 마우스 기본

(OnMouseEnter, OnMouseUp ~)

 

 

ㆍ 3일차까지는 마우스에 대해서는 한번도 얘기가 안나왔었는데

   역시 3D게임의 꽃은 마우스이므로.. 오늘은 마우스의 기본 C# 

   코드만 보도록 하겠습니다. 

   

ㆍ오늘은 OnMouseEnter, OnMouseExit, OnMouseUp, 

   OnMouseDown 4가지를 살펴보도록 하겠습니다.

 

 

다음과 같은 경우에 함수가 호출됩니다

 

OnMouseEnter  : 마우스가 Object에 들어왔을때

OnMouseExit    : 마우스가 Object에 머물다가 빠져나왔을때

OnMouseUp     : 마우스로 오브젝트를 클릭했을때

OnMouseDown : 마우스로 오브젝트를 클릭하고 떼는순간

 

그럼 이제

위의 함수를 써보겠습니다

 

C#스크립트를 하나

생성한 후에

위에 함수 4개를

쫙 적어줍니다

 

그 다음에 확인하는 방법은

간단하게 Debug.Log("아무말이나");

이렇게 써보시고 확인해도 되나..

 

저는 뭔가 시각적인게 

좋으므로 Debug도 쓰고

 + 해당 함수가 호출되면

오브젝트를 파괴하는 코드를

적어보겠습니다.

 

요렇게 써보겠습니다.

 

그 다음 저장을

한 후에

Cube를 하나 생성한

다음에 스크립트를

드래그앤드롭해서

붙이겠습니다.

 

붙인후에 Cube에

None이라 써있는데

선택한 큐브를

요기다가 끌어놓습니다.

(하이라이커에서 대충 끌어다 놓으면 댑니다)

 

자 이렇게 만든 후에

게임을 실행시켜서

콘솔창도 같이 동시에 보면서

큐브에 마우스를 가져다 대봅니다

 

마우스가 오브젝트에 

닿는순간에 바로 큐브가

파괴되는것을 확인할 수 있습니다.

 

동시에 Debug.Log도 찍어놔서

콘솔창에 Log가 찍히는것도

확인 가능합니다

 

나머지도 뭐 

아에 똑같으므로 

생략하겠습니다.

 

Exit는 오브젝트를 벗어날때~

 

Up은 클릭하는순간~

(좌클릭 하는 동시에)

 

Down은 클릭하고 떼는순간~

(좌클릭하고 손가락 올리는순간)

 

여기까지 했으면 Cube를 

선택한후에 Ctrl+D를 눌러서

복사 한다음에 한번에 

쫙 마우스를 대보면서

파괴해 봐도 됩니다.

 



출처: https://itpangpang.xyz/177 [ITPangPang]

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

안녕하세요 유니티로 게임을 만들려고 하는데 제가  어느 특정한 오브젝트를 클릭하면  씬으로 이동할려고 합니다. 

 

그런데 여기서 제가 잘모른느점이  

 

if(Input.GetMouseButtonDown(0)){

 

Application.LoadLevel(1);

}

클릭해서 씬이동은되는데  저는 특정오브젝트를 클릭해야 만 씬이동을 하게 하고 싶습니다.  

충돌 싸이즈를 잡아야되는데 어찌 할방법 을 잘 모르겠습니다..   고수님들 도와주세요 

 

 

요약  1 유니티 클릭으로 씬이동은 지금 현재 가능

2 특정오브젝트를 클릭해서 씬이동 을 하고 싶음

3 특정오브젝트 범위내에 클릭하지 않으면 씬이동불가.. 

 

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

 

우가 두가 님 답변 감사합니다 ㅎㅎ    지금 적용 해보았는데요 ㅎㅎ 현제 Raycast hit  << 여기서  Raycast  이놈이 맞지 않는 이름이라고 나오네요 ㅎㅎ;; 한번만 더 부탁드려도될까요?? ㅜㅜ 그리고 rayDistance <<이놈에 대한설명좀 ㅠㅠ 부탁드려요

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

RaycastHit hit; 
if(Physics.Raycast(Camera.mainCamera.ScreenPointToRay(Input.mousePosition),out hit,10.0f)){ 
if(hit.collider.gameObject.tag == "클릭할 오브젝트 태그명" ){ 

Application.LoadLevel("씬이름"); } 

} 
RaycastHit hit 으로 해보셔요~ 저는 이렇게 하니 되네요

 

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

그냥 생각나는대로 이론만으로 쓴거라 안된게 있었네요 ㅎㅎ 
RaycastHit hit;으로 선언해야하는게 맞고... 

그 다음에 rayDistance라는 것은 카메라로부터 쏘아지는 ray의 길이를 명시하는 뜻에서 쓴것입니다 ㅎㅎ 
저 코드를 전부다 해서 정확히 쓰시려면 

if(Input.GetMouseButtonDown(0)) { 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
    RaycastHit hit; 

    if(Physics.Raycast(ray, out hit, 10.0f)) { 
        if(hit.collider.name == "특정오브젝트의 이름") { 
            Application.LoadLevel(1); 
        } 
    } 
} 

이렇게 쓰셔야 합니다

 

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

그리고 ray에 선언한 카메라는 어디까지나 메인 카메라이기 때문에 혹시나 다른 카메라를 쓰시는 경우에는 저 코드가 먹히지 않구요 
만약 메인카메라를 쓰시는대도 안된다면 카메라와 오브젝트의 거리가 ray를 쏘는 길이보다 멀진 않은지, 혹은 메인카메라의 태그에 MainCamera 태그가 설정이 안되어있지는 않은지 확인해보세요

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

RaycastHit hit; 
if(Physics.Raycast(Camera.mainCamera.ScreenPointToRay(Input.mousePosition),out hit,1000.0f)){ 
if(hit.collider.gameObject.tag == "Player" ){ 
if(Input.GetMouseButton(0)){ 
Application.LoadLevel("maintitle"); 
} 
} 

} 
위에 우가두가님이 하신말데로 하면 잘되네요.. 
클릭할 오브젝트에서 Colider을 입혀주셔야하고 Tag를 제대로 설정해주셔야하고요!! 
저같은경우는 메인카메라에다가 스크립트를 붙힌거라 거리가 꽤 되서 길게 잡아주엇고요!! 
Build & setting 에다가 실행할 씬 넣어주시고요!!

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://docs.unity3d.com/kr/current/Manual/nav-MoveToClickPoint.html

마우스로 클릭한 포지션으로 에이전트 이동

이 스크립트에서는 오브젝트의 표면을 마우스로 클릭하여 내비메시의 목표 포인트로 선택합니다. 클릭 포지션은 레이저 빔을 오브젝트에 쏴서 어디에 광선이 닿는지 확인하는 것처럼 레이캐스트 로 결정됩니다. 이 기법에 대한 자세한 설명은 카메라에서 나오는 레이 페이지를 참조하십시오. GetComponent 함수는 실행 속도가 매우 느리므로 스크립트는 결과를 업데이트 시에 반복적으로 호출하지 많고 Start 함수 실행 중에 결과를 변수 안에 저장합니다.

// MoveToClickPoint.cs
        using UnityEngine;
        using UnityEngine.AI;
    
        public class MoveToClickPoint : MonoBehaviour {
            NavMeshAgent agent;
        
            void Start() {
                agent = GetComponent();
            }
        
            void Update() {
                if (Input.GetMouseButtonDown(0)) {
                    RaycastHit hit;
                
                    if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
                        agent.destination = hit.point;
                    }
                }
            }
        }

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

 

 //MoveToClickPoint.js
        var agent: NavMeshAgent;
    
        function Start() {
            agent = GetComponent.();
        }

        function Update() {
            if (Input.GetMouseButtonDown(0)) {
                var hit: RaycastHit;
        
                if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), hit, 100)) {
                    agent.destination = hit.point;
                }
            }
        }

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: http://m.todayhumor.co.kr/view.php?table=programmer&no=14637

 

혼자서 일주일정도 유니티를 만지작거리고 있습니다.
대학교 시절 C, C++ 수업을 들어본 정도밖에 없는 완전 초보자입니다.
인터넷에서 이것저것 찾아보면서 배우고 있습니다.

이번에 ray를 사용해서 오브젝트를 클릭하고, 클릭이벤트를 걸어주는 것을 배웠습니다.



그런데 한가지 궁금한 점이 생겼는데요....




[타겟], [A], [B], [C] 라는 오브젝트가 있습니다.

[A], [B], [C] 오브젝트를 클릭하면 [타겟]오브젝트의 색상이라던가 스프라이트 같은 컴포넌트들을 바꾸려고 합니다.

이 경우, 스크립트를 짤 때,




첫번째.....................


이렇게 각 오브젝트마다 스크립트를 만들어서 달아주는 것을 생각해봤고,







두번째......................................

한개의 오브젝트의 스크립트에 배열을 사용해서 몰아주는 방법을 생각해 봤습니다.



짧지만 다시한번 요약하자면

첫번째: 각각의 오브젝트에 각각의 스크립트를 달아서 클릭이벤트를 수행한다.
두번째: 한개의 오브젝트의 스크립트에 배열을 선언하고, 배열에 오브젝트를 몰아넣어 클릭이벤트를 수행한다.



어느것이 더 나은 방법인가요??

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

 


첫 번째, 두 번째 다 좋은 방법은 아닌것 같아요
첫 번째는 파일이 너무 많아지고
두 번째는 오브젝트가 엄청많다면 조건 분기 연산하는데 자원을 소모합니다.

괜찮다면 다른 방법을 제안해볼게요
큐브 색상을 제어하는 스크립트를 만들고, 변경할 색상 또는 스프라이트를 public 변수로 만듭니다.
그리고  위 변수로 색상이나 스프라이트로 바꿔주는 public 함수를 만들어 주시구요.
큐브에 스크립트를 추가하면  public 변수는 에디터 Inspector 창에서 변경이 가능합니다.

그리고 터치 이벤트를 감지하는 스크립트를 만들어 Update 함수에 사진과 같이 작성합니다.
큐브에 태그를 추가해 주세요
레이캐스트를 사진과 같이 사용하시면 레이캐스트에 적중한 GameObject 를 바로 가져오실 수 있습니다.
빨간줄은 제가 클래스를 만들지 않아서 생기는거라 신경쓰지 말아주세요

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://young-duck.tistory.com/46

 

이번에는 마우스 왼쪽 버튼을 클릭을 했을 때 적들을 쏴 없애버리는 기능을 만들겠습니다~!

 

우선 마우스 왼쪽클릭버튼을 누르는 동작은

언제든 사용이 가능해야 하기에

Update 함수 안에 넣겠습니다. 

 

다만 이 기능은 GunFire() 이라는 함수 안에서 만들어 보겠습니다.

왜냐하면 Update 함수 안에 너무 많은 기능들이 함께 있으면 

나중에 정리하거나 다시 찾아볼때 너무 복잡해지기 때문이죠

 

 

그럼 아래와 같이 GunFire 이라는 이름으로 함수를 선언했습니다!

    private void GunFire()

    {

 

마우스 왼쪽 버튼을 누르면? 이라는 IF 문으로 시작되겠네요.

        if (Input.GetButton("Fire1"))

        {

 

이번에는 Raycast 라는 기능을 사용해보았습니다.

Raycast의 기능은.. 내가 원하는 위치에서 레이저를 쏴 레이저가 맞은 위치의 정보를 가져오거나

레이저를 맞았을때 원하는 동작을 하도록 하거나... 하는 아주 유용한 기능입니다.

자주 사용하니 꼭 따로 정리해둘 필요가 있습니다! (걱정마세요 다음페이지에 따로 정리해 볼께요 ㅎㅎ)

 

우선 다른 기능과 마찮가지로 Ray 라는 기능을 사용하기 위해서 ray라는 레이저를 하나 만들었습니다.

그리고 new Ray(시작위치, 방향) 을 선언해야 하는데, 레이저를 어디서 부터 쏘고 어느 방향으로 쏠 것인지 선언하는 부분입니다!

 

            Ray ray = new Ray(transform.position, transform.forward);

          

 

실행했을때 레이저가 따로 나오지 않기에 Scene창에서 가상으로 레이저를 만들어 

개발자가 직접 보면서 어느부분으로 레이저를 쏘고있는지

확인하기위해 Debug 라는 기능을 사용합니다. 

DrawRay 기능은 어떤 ray를 쏠 것인지, 방향 그리고 색상을 지정할 수 있습니다.

 

 

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

 

또한 RaycastHit 을 만들어 레이저에 닿은 물체(오브젝트)가 무엇인지, 거리는 얼마나 먼지 등등 정보를 가져올 수 있습니다

 

            RaycastHit hitInfo;

 

Raycast 는 대부분 3단계로 진행되는데

1. 레이를 선언한다 -> Ray ray = new Ray(transform.position, transform.forward);

2. RaycastHit 을 선언한다 - > RaycastHit hitInfo;

3. 아래와 같이 if 문으로 Ray 정보를 가져와 원하는 동작을 하도록 한다!

 

아래와 같이 Raycast 정보를 가져와 그것의 레이어 이름이 Enemy라면 동작하라는 If문은 작성했습니다.

우선 ( ) 안에 들어갈 정보는 

(선언한 ray이름, out + 선언한 RaycastHit 이름, 레이저를 얼마나 멀리 쏠것인지, 레이저를 쐈을때 원하는 물체에 닿았을때만 실행시킬지) 

그럼 제가 선언한 if 문을 보시면 ray와 hitInfo를 가져오고 5미터거리만 쏘면서, 

레이저를 맞은 물체가 Enemy 일때만 if 문을 실행시키라고 작성했습니다.

 

 

            if (Physics.Raycast(ray, out hitInfo, 5, 1 << LayerMask.NameToLayer("Enemy")))

            {

 

그리고 이렇게 Destroy 기능을 넣어 레이저가 가져온 정보의 물체를 파괴시키도록 했습니다.

 

                Destroy(hitInfo.transform.gameObject);

 

            }

        }

    }

 

 

 

많이 복잡했나요?

Ray 는 정말 많이 사용하기때문에 복잡하더라도 여러번 이해하면서 사용해야됩니다.

처음에만 어렵지 두번 세번사용하면 조금 쉬워질꺼에요 물론 저는 한번에 이해했지만요...

ㅎㅎ

물론 사용하면 할수록 이해하는 깊이가 달라져서 인지 계속 새로보는 기분..

짧은 개소리였습니다.

 

그럼 실행시켜보겠습니다~~!

 

 

아래 플레이 화면에서는 빨간 레이저가 보이질 않지만 

씬 화면에선 Debug 로 레이저가 보이도록 만들어서 그런지

플레이어 오브젝트가 레이저를 쏘는것을 확인할 수 있습니다!

 

그리고 왼쪽 버튼을 클릭하며 레이어 이름을 Enemy 로 만든 큐브에 접근하니 

Destroy 기능으로 제거되는것을 볼 수 있습니다 ㅎㅎ

 

그런데 왜 멀리서 쐈을때는 멀쩡하고 가까이 다가가야 제거될까요?

바로 

if (Physics.Raycast(ray, out hitInfo, 5, 1 << LayerMask.NameToLayer("Enemy")))

이 부분에서 레이저를 쏘는 범위를 5로 지정했기 때문입니다~

 

그럼 다음 포스팅에는

다음 Enemy가 자동으로 움직이며 플레이어한테 접근하고

플레이어는 접근하는 Enemy를 제거하는

기능을 넣어보겠습니다~~!

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://uheeworld.tistory.com/11

 

UI를 게임오브젝트, 프리팹으로 만들어서 설정한 경우,

참조할 경우 보통 프로젝트 뷰에서 참조를 했었는데, 하이라키뷰에 있는 프리팹을 참조해야 된다.

 

 

public Gameobject Panel;

여기서 판넬이 ui 이름이다. 

이렇게 설정을 했다면, 프로젝트 뷰에 생성된 프리팹 panel이 아닌, 하이라키뷰에 있는 판넬을 적용해야

게임 실행에서 오브젝트 클릭시 ui가 생성되더라.

 

 

 

오브젝트 클릭시 ui 생성

 

-> start 함수에서 먼저

 

 

// 유아이 기능 비활성화

 <gameobject>.SetActive(false);

유아이 기능 비활성화에 대한 정보는

 

http://hyunity3d.tistory.com/381

에서 참조했다.

 

 

요약하자면,

오브젝트를 안보이게 하는 방법이 2가지가 있는데,

1.  gameobject.Setactive(false);

오브젝트를 비활성화시킨다.

 

: 인스펙터에서 체크박스를 해제한 효과로, 오브젝트 자체를 비활성화 시킨다. 오브젝트를 일시적으로 화면에서 사라지게 하는 것이다.

 

2. gameobject.renderer.enabled = false;

오브젝트의 화면 표시를 금지한다.

 랜더러를 enabled한다는 뜻으로, 오브젝트의 랜더러를 끄는 것을 의미한다. 

 

 

-> Update 함수에서

 

카메라에 마우스가 댄 곳에 레이를 설정하고,

 

Ray 변수를 생성하고,

ScreenPointToRay(Input.mousePosition); 으로 마우스 댄 곳에 레이를 설정한다.

 

 

 

 

if문으로 클릭시 오브젝트와 충돌하여 ui 생성 스크립트를 생성한다.

 

//왼쪽 버튼을 눌렀을 때,

 if (Input.GetMouseButton(0)

 

레이캐스트가 특정오브젝트와 충돌할때 UI 생성

// 특정 오브젝트에 태크를 붙여서, collider.tag == "" 로 해결했다.

 

그리고 이때  <gameobject>.SetActive(true); 로 바꿔준다.



출처: https://uheeworld.tistory.com/11 [유희월드]

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://cookzy.tistory.com/817

 

private RaycastHit hit;

private LayerMask layerMask =(1 << 8) | (1 << 2);

void start()

layerMask =~ layerMask; 



void Update () 

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Input.GetMouseButtonUp (0))
{

 

 

if(Physics.Raycast(ray, out hit, 50, layerMask))

{
      GameObject[] GOjct =

      GameObject.FindGameObjectsWithTag("IslandMonster_Sim"); 

 

      for(int i=0;i<GOjct.Length;i++)

     {

    if(GOjct[i].transform==hit.transform)

     selectedMonster = GOjct[i];

     }

}



일단 여기저기서 잘 설명된 소스들이 많이 있습니다.
위 소스는 이번에 게임을 만들다 보니 필요에 의해서 작성한 소스의 일부입니다.

PC와 갤럭시탭에서 모두 정상적으로 작동합니다.
선택된 Object를 여기저기로 이동가능합니다.
이번에 만들고있는 게임의 경우 터치로 드래그 할 필요까지는 없는 게임이라 UI에 단추를 이용해서 선택된 Object를 이동하는데 사용하고 있습니다.

선택한 Object를 Drag할 경우 이동중 다른 Object가 선택되는 문제가 발생될 수 있을것 같습니다.

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

출처: https://cosmostudio.tistory.com/entry/RayCast%EB%A1%9C-%ED%81%B4%EB%A6%AD%ED%95%9C-%EA%B3%B3%EC%9D%98-%EC%A2%8C%ED%91%9C-%EA%B5%AC%ED%95%98%EA%B8%B0

 

마우스로 터치하여 클릭된 곳의 좌표를 구해보자.

 

using UnityEngine;

using System.Collections;

 

public class ScreenRay : MonoBehaviour {

 

    public int clickLayer = 8;

    public int blockLayer = 9;

     

    // Update is called once per frame

    void Update () {

     

        if (Input.GetMouseButtonUp (0))

        {

            Debug.Log("hit !!");

 

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

 

            RaycastHit hitInfo;

 

            if( Physics.Raycast(ray,out hitInfo, 100f) )

            {

                Debug.Log("hit point : " + hitInfo.point);

 

                int l = hitInfo.transform.gameObject.layer;

 

                if( l == clickLayer )

                {

                    Debug.Log(" hit object : " + hitInfo.collider.name);

                }

                  

            }

        }

 

    }

}

해당 소스를 빈 게임오브젝트나 메인카메라 같은곳에 붙여두고 테스트 했다.

각각 레이어를 구분하여 Ray를 지나가게 할 레이어와 아닌 레이어를 구분해두었다.

 


출처: https://202psj.tistory.com/1284?category=640054 [알레폰드의 IT 이모저모]

728x90
반응형