프로그래밍 관련/게임프로그래밍

[Unity] 유니티 터치, 마우스 드래그 클릭 관련

AlrepondTech 2019. 4. 22. 20:13
반응형

 

 

 



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

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

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

 

 

 

 

 

출처: http://hb7083.blogspot.com/2016/02/blog-post_13.html

유니티 오브젝트를 마우스 드래그&드롭(터치 이동)으로 이동시키기

 

위 코드를 드래그 드롭할 오브젝트에 넣어주면 된다.

코드 설명을 하자면 마우스 버튼(터치)이 눌렸을때 x, y 좌표값을 mouseDragPosition에 저장한 다음 worldObjectPosition에 ScreenToWorldPoint함수를 이용해서 좌표값을 넣어주는데 ScreenToWorldPoint함수를 사용하는 이유는 그냥 일반적으로 스크린 좌표값으로만 이동시키면 제대로 이동이 되지 않는 경우가 발생하므로 게임 화면상의 마우스클릭(터치) 된 좌표값을 월드좌표값으로 변환해주는 작업을 해줘서 원하는 위치에 이동되로록 할 수 있다.

 

 



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

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

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

 

 

 

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

 

유니티 터치 드래그 & 마우스 드래그 카메라 회전 스크립트

 

EventSystems 는 IPointer 인터페이스 사용하려다가 남은것.

마우스 드래그 영역을 따로 정해줄거면 IPointer로 처리해야함.

 

1. 전처리문을 사용한 안드로이드, PC 플랫폼 분리 (구식방법)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class mCameraController : MonoBehaviour{
 
    Vector3 FirstPoint;
    Vector3 SecondPoint;
    float xAngle;
    float yAngle;
    float xAngleTemp;
    float yAngleTemp;
 
    public Transform Player;
 
    [HideInInspector]
    public bool isCanRotate = true;
    private bool isMouseDown = false;
 
    void Start()
    {
        xAngle = 0;
        yAngle = 50;
        transform.rotation = Quaternion.Euler(yAngle, xAngle, 0);
        transform.parent.position = Player.transform.position;
    }
    
    void Update()
    {
        transform.parent.position = Vector3.Lerp(transform.parent.position, Player.position, Time.deltaTime * 10f);
 
        if (isCanRotate != false)
        {
 
#if (UNITY_ANDROID || UNITY_IPHONE) && !UNITY_EDITOR
            if (Input.touchCount > 0)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Began)
                {
                    FirstPoint = Input.GetTouch(0).position;
                    xAngleTemp = xAngle;
                    yAngleTemp = yAngle;
                }
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    SecondPoint = Input.GetTouch(0).position;
                    xAngle = xAngleTemp + (SecondPoint.x - FirstPoint.x) * 180 / Screen.width;
                    yAngle = yAngleTemp - (SecondPoint.y - FirstPoint.y) * 90 * 3f / Screen.height; // Y값 변화가 좀 느려서 3배 곱해줌.
 
                    // 회전값을 40~85로 제한
                    if (yAngle < 40f)
                        yAngle = 40f;
                    if (yAngle > 85f)
                        yAngle = 85f;
 
                    transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
                }
            }
#else
            // 마우스가 눌림
            if (Input.GetMouseButtonDown(0))
            {
                FirstPoint = Input.mousePosition;
                xAngleTemp = xAngle;
                yAngleTemp = yAngle;
                isMouseDown = true;
            }
            
            // 마우스가 떼짐
            if (Input.GetMouseButtonUp(0))
            {
                isMouseDown = false;
            }
 
            if (isMouseDown)
            {
                SecondPoint = Input.mousePosition;
                xAngle = xAngleTemp + (SecondPoint.x - FirstPoint.x) * 180 / Screen.width;
                yAngle = yAngleTemp - (SecondPoint.y - FirstPoint.y) * 90 * 3f / Screen.height; // Y값 변화가 좀 느려서 3배 곱해줌.
 
                // 회전값을 40~85로 제한
                if (yAngle < 40f)
                    yAngle = 40f;
                if (yAngle > 85f)
                    yAngle = 85f;
 
                transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
            }
#endif
        }
    }
}

 

2. IPointer를 사용한 안드로이드, PC 플랫폼 통합방법

public class mCameraController : MonoBehaviour, IBeginDragHandler, IDragHandler
{
    Vector3 FirstPoint;
    Vector3 SecondPoint;
    public float xAngle = 0f;
    public float yAngle = 55f;
    float xAngleTemp;
    float yAngleTemp;
 
    public void BeginDrag(Vector2 a_FirstPoint)
    {
        FirstPoint = a_FirstPoint;
        xAngleTemp = xAngle;
        yAngleTemp = yAngle;
    }
 
    public void OnDrag(Vector2 a_SecondPoint)
    {
        SecondPoint = a_SecondPoint;
        xAngle = xAngleTemp + (SecondPoint.x - FirstPoint.x) * 180 / Screen.width;
        yAngle = yAngleTemp - (SecondPoint.y - FirstPoint.y) * 90 * 3f / Screen.height; // Y값 변화가 좀 느려서 3배 곱해줌.
 
        // 회전값을 40~85로 제한
        if (yAngle < 40f)
            yAngle = 40f;
        if (yAngle > 85f)
            yAngle = 85f;
 
        transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
    }
}

 

 



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

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

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

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=dunkydonk&logNo=220266644246&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

유니티 터치&마우스&드래그 인식 소스코드

Vector2 startPos, deltaPos, nowPos;
    bool isDragged;
    const float dragAccuracy = 50f;
 
 void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Application.Quit();
        }
 
        if(Input.GetMouseButton(0)) //터치했다면
        {
            nowPos = (Input.touchCount == 0) ? (Vector2)Input.mousePosition : Input.GetTouch(0).position;
 
            if (Input.GetMouseButtonDown(0)) //터치 시작인경우
                startPos = nowPos;
 
            deltaPos = startPos - nowPos;
 
            if(deltaPos.sqrMagnitude > dragAccuracy)    //정확도 계산
            {
                var speed = GameOption.instance.dragSpeed * deltaPos;
                iTween.StopByName("cameraMove");
                camMove.state = CameraState.Free;
                camMove.transform.Translate(speed);
                camMove.transform.position = new Vector3(
                    Mathf.Clamp(camMove.transform.position.x, 0, tileSystem.RowCount),
                    Mathf.Clamp(camMove.transform.position.y, -tileSystem.ColumnCount, 0),
                    0);
                startPos = nowPos;
                isDragged = true;
            }
        }
 
        if (Input.GetMouseButtonUp(0))  //터치 끝
        {
            if (!isDragged && !IsPointerOverUIObject())
            {
                Behavior_Player.instance.Clicked();
                camMove.state = CameraState.Chase;
            }
            isDragged = false;
        }

 

제 게임에서는 이렇게 쓰고 있습니다. 터치가 있는 경우에는 터치 이벤트를, 그게 아니라면 마우스 포지션을 가져옵니다. 예외처리는 안했습니다. 알고리즘 그대로 퍼왔기 때문에 군더더기가 있지만, 여하튼 이게 전부입니다.
핵심은 어느정도의 오차값을 허용해주는 dragAccuracy가 필요하며, 드래그 상태인지를 체크하는 bool값이 필요합니다.
GetMouseButton은 터치도 가능하기 때문에 에디터상으로나 빌드상으로나 모두 적절하게 돌아가는 좋은 함수더군요.

 

 



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

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

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

 

 

 

출처: http://vividmani.blogspot.com/2014/06/transform.html

 

[유니티] C# 터치 드래그와 Transform 클래스...

 

터치 드래그에 따라 카메라 위치를 이동시켜보려고 하다가... 엄청난 삽질을 하고 말았다.

바로 Transform 클래스!!!

터치 좌표(Vector2)를 가져와서 카메라 이동을 위해, Vector3으로 변환해서 넣었는데... 

뭔가 되긴 되는데 좌표가 이상하게 이동하더라는 것이다.

범인은 이 코드였다.

using UnityEngine;
using System.Collections;
public class TouchCameraMover : MonoBehaviour 
{
    public float Speed;
    public Vector2 nowPos, prePos;
    public Vector3 movePos;
    void Update()
    {
        if(Input.touchCount == 1)
        {
            Touch touch = Input.GetTouch (0);
            if(touch.phase == TouchPhase.Began)
            {
                prePos = touch.position - touch.deltaPosition;
            }
            else if(touch.phase == TouchPhase.Moved)
            {
                nowPos = touch.position - touch.deltaPosition;
                movePos = (Vector3)(prePos - nowPos) * Speed;
                camera.transform.position += movePos; // 뭐가 문제란 말이냐... ㅜ.ㅜ
                prePos = touch.position - touch.deltaPosition;
            }
            else if(touch.phase == TouchPhase.Ended)
            {
            }
        }
    }
}

position으로 값을 그냥 가져오길래... 난 더하기도 될 줄 알았네. 저렇게 하면 안되나 보다.

구글 이곳저곳 살짝 보기에, 저런식으로는 허용을 안 하는 것 같다. 

함수를 써서 값을 바꾸는게 정석인 것으로 보인다.

(동적으로 vector3을 할당해서 넣어도 되는거 같기도 한데... 정확한 내용은 나중에 알게 되면 다시 업데이트를...)

 

Vector3이면, 내가 좌측으로 이동시키면 x, y, z가 전부 바뀌어야 하는데... 어째 x, y만 바뀌더라... 흠...??? 왜죠??? 하다가 다음과 같이 바꾸어보았다.

using UnityEngine;
using System.Collections;
public class TouchCameraMover : MonoBehaviour 
{
    public float Speed;
    public Vector2 nowPos, prePos;
    public Vector3 movePos;
    void Update()
    {
        if(Input.touchCount == 1)
        {
            Touch touch = Input.GetTouch (0);
            if(touch.phase == TouchPhase.Began)
            {
                prePos = touch.position - touch.deltaPosition;
            }
            else if(touch.phase == TouchPhase.Moved)
            {
                nowPos = touch.position - touch.deltaPosition;
                movePos = (Vector3)(prePos - nowPos) * Speed;
                camera.transform.Translate(movePos); // 이럴수가 !!!!!!!
                prePos = touch.position - touch.deltaPosition;
            }
            else if(touch.phase == TouchPhase.Ended)
            {
            }
        }
    }
}

 

잘 된다... x, y, z 값도 전부 잘 바뀌고.
이것 때문에 원인을 찾으려고 엄청 고생했다. 덕분에 디버그 모드로 로그도 찍어보고 ^^;;;
대충 때려 박으면 안되는구나 ㅋㅋㅋ
C# 문법 공부의 필요성이 점점 대두되고 있다. 

 

 



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

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

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

 

 

 

출처: https://kpro.tistory.com/80

 

[Unity3D] 마우스로 객체 드래그하기 (DragGameObject)

using UnityEngine;
using System.Collections;
 
public class DragGameObject : MonoBehaviour {
     
    IEnumerator OnMouseDown()
    {
        Vector3 scrSpace = Camera.main.WorldToScreenPoint (transform.position);
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, scrSpace.z));
         
        while (Input.GetMouseButton(0))
        {
            Vector3 curScreenSpace = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, scrSpace.z);

            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            transform.position = curPosition;
            yield return null;
        }
    }
}

 



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

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

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

 

 

 

반응형

 

 

728x90

 

 

 

출처: https://sites.google.com/site/unity3dstudy/home/unity3d-curriculum/2015/part

 

Part공통 - 마우스(스마트폰) 드래그

 

[ GameObject 드래그 : Touch(마우스) Input 처리하기 ]
  • 클릭된 오브젝트가 마우스(터치) 드래그에 따라 움직일 수 있도록 함
  • [ Touch(마우스) Input 처리하기 ]
    • 마우스 입력 처리 - Input.GetMouseXXX(0) 함수는 스마트폰의 Touch와 연계되어 있음
      • Input.GetMouseButtonDown(0) : 마우스가 클릭될 때 true 값을 리턴
      • Input.GetMouseButton(0) : 마우스가 움직이고 움직이고 있을 때 true 값을 리턴
      • Input.GetMouseButtonUp(0) : 마우스가 클릭을 때는 순간 true 값을 리턴
      • 인자값으로 0이 들어가는것은 마우스 왼쪽버튼 1 오른쪽버튼2 가운데 버튼

    • GameObject Touch 처리
      • 마우스 입력 위치에 GameObject(Collider)가 있는지를 검사해야 함
  • [ 실습 ]
    • Hero (GameObject) 생성 
      • Tag : Player 설정 
      • PlayerContorls.cs를 삽입


using UnityEngine;
using System.Collections;


public class PlayerControls01 : MonoBehaviour {


void Start () 
{


}


void Update () 
{
if(Input.GetMouseButtonDown(0))
{
Debug.Log ("Mouse Down");
}
else if (Input.GetMouseButton (0)) 
{
Debug.Log("Mouse Move");


}
else if(Input.GetMouseButtonUp(0))
{
Debug.Log ("Mouse Up");
}
}
}


using UnityEngine;
using System.Collections;


public class PlayerControls02 : MonoBehaviour {
private Vector3 pos, oldpos;
public bool bMove = false;
private bool bPause = false;
void Start () 
{


}


void Update () 
{
if(Input.GetMouseButtonDown(0))
{
//Debug.Log ("Mouse Down");
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
Ray2D ray2D = new Ray2D(new Vector2(ray.origin.x, ray.origin.y), new Vector2(ray.direction.x, ray.direction.y));
RaycastHit2D[] hits = Physics2D.RaycastAll(ray2D.origin, ray2D.direction);
int i = 0;
while(i < hits.Length) {
RaycastHit2D hit = hits[i];


if(hit.collider.tag == "Player") {
if(!bPause) {
bMove = true;
pos = transform.position;
}

//Debug.Log ("Touch -> " + hit.collider.tag);
i++;
}
}
else if (Input.GetMouseButton (0)) 
{


if(bMove)
{
oldpos = pos;
pos = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, Input.mousePosition.z));
transform.position = new Vector3 (transform.position.x + (pos.x - oldpos.x),
                                  transform.position.y + (pos.y - oldpos.y),
                                  transform.position.z);
/*
transform.localPosition = new Vector3 (transform.localPosition.x + (pos.x - oldpos.x),
                                       transform.localPosition.y + (pos.y - oldpos.y),
                                       transform.localPosition.z);


*/
//Debug.Log("Mouse Move");
}


}
else if(Input.GetMouseButtonUp(0))
{
//Debug.Log ("Mouse Up");
bMove = false;
}
}
}

 

 



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

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

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

 

 

 

 

출처: https://hyunity3d.tistory.com/586

 

마우스 드래그를 사용해서 비행기를 움직여보자.

먼저 여러가지 방벙이 있다.

레이 캐스트를 사용한다던가. 유니티 내부 API인 OnMouseDown 함수를 사용한다던가.

 

필자는 후자를 선택하겠다.

 

 

 

GameManager 에 사이즈 100, 100, 1인 콜라이더를 부착시킨후 GameManager 스크립트를 할당하였다.

Mathf.Clamp를 이용해 드래곤의 이동거리를 제한하고 가로로만 움직이기 때문에 y와 z값은 0으로 초기화 시켜주었다.

마우스 좌표를 월드 좌표로도 변경시켜주었다.

일단 성능상에 문제가 없을지 걱정이된다,

Drag 함수같은경우에는 매 프레임마다 호출되는 함수라.. 추후 성능상 문제가 있으면 연구해보자.

 

using UnityEngine;
using System.Collections;
 
public class GameManager : MonoBehaviour 
{
    public GameObject _dragon;
    private Vector3 initMousePos;   
 
    //처음마우스 클릭시
    void OnMouseDown()
    {
        initMousePos = Input.mousePosition;
        initMousePos.z = 10;
        initMousePos = Camera.main.ScreenToWorldPoint(initMousePos);    
 
        //Debug.Log("mouse Down : " + initMousePos);
    }
    //마우스 드래그시
    void OnMouseDrag()
    {
        Vector3 worldPoint = Input.mousePosition;
        worldPoint.z = 10;
        worldPoint = Camera.main.ScreenToWorldPoint(worldPoint);    
 
        Vector3 diffPos = worldPoint - initMousePos;
        diffPos.z = 0;
        diffPos.y = 0;
 
        initMousePos = Input.mousePosition;
        initMousePos.z = 10;
        initMousePos = Camera.main.ScreenToWorldPoint(initMousePos);
 
        _dragon.transform.position = 
            new Vector3(Mathf.Clamp(_dragon.transform.position.x + diffPos.x, -4.5f, 4.5f),
                        _dragon.transform.position.y,
                        _dragon.transform.position.z);
 
 
    //  Debug.Log("mouse drag" + diffPos);
    }
}

 

 



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

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

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

 

 

 

출처: https://donggov.tistory.com/68

 

드래그를 이용한 오브젝트 회전

 

Collider 컴포넌트가 설정되어 있어야함

 

public float rotate_spd = 100.0f;
void OnMouseDrag() {
    float temp_x_axis = Input.GetAxis("Mouse X") * rotate_spd * Time.deltaTime;
    float temp_y_axis = Input.GetAxis("Mouse Y") * rotate_spd * Time.deltaTime;
    transform.Rotate(temp_y_axis, -temp_x_axis, 0, Space.World);
}



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

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

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

 

 

 

 

출처: https://ppost.tistory.com/entry/%EC%B9%B4%EB%A9%94%EB%9D%BC-%EB%AC%B4%EB%B9%99-%EB%B0%8F-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EA%B0%80%EB%91%90%EA%B8%B0

 

게임을 만들다보면 은근히..아니 꽤 자주 쓰이는 것이 카메라 무빙이고 카메라를 가두는 것이다.

여기서 말하는 카메라 무빙은 유니티에서 지원하는 스탠다드에셋에 있는것처럼 캐릭터를 따라다니거나 하는 무빙이 아닌 유저가 터치 드래그로 카메라를 움직이는 것을 말한다.



일단 코드부터 보자 의외로 단순하다.

int touchCount = Input.touchCount;
if(touchCount == 1)
{
Touch touch = Input.GetTouch (0);

if( touch.phase == TouchPhase.Began )
{
prePos = touch.position - touch.deltaPosition;
}
else if(touch.phase == TouchPhase.Moved)
{
nowPos = touch.position - touch.deltaPosition;
movePos = (Vector2)(prePos - nowPos) * Speed;

GetComponent().transform.Translate(movePos);

MoveLimit();

prePos = touch.position - touch.deltaPosition;
}
}


간단히 설명하자면 터치페이즈가 무브일 경우,

처음 터치한 위치와 현재위치의 거리벡터값에 속도를 곱해서 Translate시켜준다.

(prePos,nowPos,movePos는 전부 Vecter2 타입이다. 내가 2D게임을 만들고있기때문에..ㅋ)



이때 카메라의 이동범위를 제한하기 위해 Translate 시킨 뒤에 MoveLimit()함수를 호출한다

이 함수의 코드는 아래와 같다.

void MoveLimit()
{
Vector2 temp;
temp.x = Mathf.Clamp( transform.position.x , SideXY[ LeftX ] , SideXY[ RightX ] );
temp.y = Mathf.Clamp( transform.position.y , SideXY[ BottomY ] , SideXY[ TopY ] );

transform.position = temp;
}
여기서 핵심은 Clamp함수다.
Clamp함수에 현재 오브젝트의 포지션값과 어디까지 움직이게 할지 범위를 넣으면 된다.

여기서 단점이자 함정은 코드에 있는 Side값들을...씬뷰에서 카메라 오브젝트 움직여가며

단순 노가다를 통해 값을 찾아서 입력해야 한다는 점이다 ㅠㅠ

이부분까지 자동화시키기엔...내 수학적 지식이 턱없이 부족하더라..

아무튼 이상 끝!

 

 



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

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

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

 

 

 

 

출처: https://codingmania.tistory.com/173

 

짧아서 간단히 작성할 것이라 생각했는데 약 2시간동안 고생했다.

 

드래그 코드는 이미 내장된 함수가 존재한다.

 

OnMouseDrag()

 

이 함수를 호출하여 원하는 코드를 적으면 된다.

 

일단, 움직이고자 하는 게임오브젝트들에 Drag.cs 파일을 갖다 붙인뒤 Drag.cs파일에 코드를 입력한다.

 

[Drag.cs]

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

 

public class Drag : MonoBehaviour

{

 

float distance = 10;

 

void OnMouseDrag()

{

   print("Drag!!");

   Vector3 mousePosition = new Vector3(Input.mousePosition.x,

   Input.mousePosition.y, distance);

 

   Vector3 objPosition = Camera.main.ScreenToWorldPoint(mousePosition);

   transform.position = objPosition;

}

}

 

불필요한 Start() 함수와 Update() 함수를 삭제하고 OnMouseDrag()함수만 작성해 간략하게 만들었다.

 

그런데!! 아무리 해도 함수가 실행되지 않았다.

 

그래서 혹시나해서 OnMouse로 시작하는 모든 함수를 작성해보았다.

 

OnMouseEnter

OnMouseExit

OnMouseUp

OnMouseDown

..

 

모든 마우스 관련 함수가 호출되지 않았다.

 

고민끝에 혹시나해서 이미지(Sprite)에 Collider를 추가해봤더니 이런 !! 된다.

 

마우스 관련 함수를 사용하기 위해서는 반드시 

 

콜라이더를 써야만 한다는 것을 알게 되었다.

 

위와 같이 쓴 다음에 실행해보면 게임오브젝트가 마우스로 이동하는 것을 볼 수 있다.





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

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

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

 

 

 

 

출처: http://susemi99.kr/1997/

[unity] 드래그하면 옆으로만 왔다갔다하는 큐브

 

드래곤 플라이트처럼 옆으로만 왔다갔다하는 큐브를 만들어보자

 

일단 이렇게 카메라의 아래쪽 부분에 큐브를 넣는다.

 

c# 스크립트를 만들어서 큐브에 넣어준다.

public class PlayerMove : MonoBehaviour 
{
  Transform cachedTransform;
  Vector2 startingPos;
  float moveSpeed = 0.03f;

  void Start () 
  {
    cachedTransform  = transform;
    startingPos = cachedTransform.position;
  }

  void Update () 
  {
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
    {
      float dist = transform.position.y - Camera.main.transform.position.y;
      float leftLimitation = Camera.main.ViewportToWorldPoint(new Vector3(0,0,dist)).x + gameObject.renderer.bounds.size.x * 0.5f;
      float rightLimitation = Camera.main.ViewportToWorldPoint(new Vector3(1,0,dist)).x - gameObject.renderer.bounds.size.x * 0.5f;

      Vector2 deltaPosition = Input.GetTouch(0).deltaPosition;
      cachedTransform.position = new Vector2(Mathf.Clamp((deltaPosition.x * moveSpeed) + cachedTransform.position.x, leftLimitation, rightLimitation), startingPos.y);
    }
  }
}

 

도움받은 곳 :

1. http://answers.unity3d.com/questions/184258/clamp-player-to-screen-borders.html

2. youtube.com/watch?v=g9p9PvnmRXU

 

 



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

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

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

 

 

 

 

출처: https://sunghojang.tistory.com/12

[유니티] 마우스 드래그해서 게임오브젝트 끌어 이동하기

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

public class Drag : MonoBehaviour, IDragHandler
{

    float distance = 10.0f;
    public void OnDrag(PointerEventData eventData)
    { 
        Vector3 mousePosition = new Vector3(Input.mousePosition.x, 
 Input.mousePosition.y, distance);
        transform.position = mousePosition;
    }

}

1. 드래그를 하기 위해서는 OnMouseDrag() 함수도 있지만, OnDrag() 함수를 사용할 수도 있다.

2. 먼저, OnDrag()를 사용하기 위해서는 

 

using UnityEngine.EventSystems; 

을 적어줘서 이벤트 시스템을 사용하겠다는 것을 표기한다.

 

3. MonoBehaviour뒤에 콤마(,)를 쓴 뒤 IDragHandler를 작성한다. 참고로 IDragHandler 는 인터페이스이다.

 

4. 3번 IDragHandler를 적으면 에러난다. 즉, 인터페이스에 선언된 메소드를 정의해줘야한다.

형태는 다음과 같다. public void OnDrag(PointerEventData eventData)

 

5. OnDrag()안에 드래그 했을 때, 일어날 동작들을 적으면 된다. 

이 블로그에서는 마우스 드래그하는데로 오브젝트가 딸려오는 것을 구현하려고 한다.

 

위와 같이 하면 되는데,

마우스는 평면으로 움직이므로 x,y)축만 필요하다.

z축은 위와 같이 10으로 지정해줘도 되고, 그냥 오브젝트의 z축을 그냥 기입해줘도 된다.

그 다음에 transform.position에 mousePosition을 넣음으로써,

드래그할때 mousePosition이 게임오브젝트 위치에 대입되어 마우스 드래그할때 오브젝트가 딸려 움직이게 된다.

이상으로 마우스 드래그를 이용하여 게임오브젝트를 움직이는 방법을 알아보았다.

 

 



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

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

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

 

 

 

 

출처: https://dev-x.tistory.com/53

 

Object에 적용전에 Collider가 있어야 한다는걸 잊지마세요. (없다면 추가 ^^)

 

public class HomeRotate : MonoBehaviour {

 

public float rotationSpeed = 10.0f;

public float lerpSpeed = 1.0f;

 

private Vector3 speed = new Vector3();

private Vector3 avgSpeed = new Vector3();

private bool dragging = false;

 

void OnMouseDown() {

dragging = true;

}

 

void Update() {

if (Input.GetMouseButton(0) && dragging) {

speed = new Vector3(-Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"), 0);

avgSpeed = Vector3.Lerp (avgSpeed, speed, Time.deltaTime * 2);

}

else {

if (dragging) {

speed = avgSpeed;

dragging = false;

}

 

  float i = Time.deltaTime * lerpSpeed;

speed = Vector3.Lerp(speed, Vector3.zero, i);

}

 

transform.Rotate (Camera.main.transform.up * speed.x * rotationSpeed, Space.World);

transform.Rotate (Camera.main.transform.right * speed.y * rotationSpeed, Space.World);

}



출처: https://dev-x.tistory.com/53 [Developer - C/C++, Android, Cocos2D-x, Unity3D]

 

 

 



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

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

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

 

 

 

 

 

*기타관련링크

https://truecode.tistory.com/31

 

https://www.bsidesoft.com/?p=164

 

https://bluemeta.tistory.com/24

 

http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=3077

 

https://stackoverrun.com/ko/q/11777987

 

https://cosmostudio.tistory.com/entry/%EB%A7%88%EC%9A%B0%EC%8A%A4%EB%A5%BC-%ED%81%B4%EB%A6%AD%ED%95%9C-%EA%B3%B3%EC%9C%BC%EB%A1%9C-%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-%EC%9D%B4%EB%8F%99%EC%8B%9C%ED%82%A4%EA%B8%B0

 

- https://robotree.tistory.com/7

 

https://itpangpang.xyz/155

 

 



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

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

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

 

 

 

 

 

 

반응형