2016-08-19 1 views
0

사용자가 매번 BoxCollider2D가 연결된 GameObject를 터치 할 때마다 Android 장치에서 코드를 찾을 수 있도록 검색하려고합니다.사용자가 BoxCollider2D를 터치 한시기를 정확하게 알아내는 방법

필자의 경우 사용자가 GameObject를 여러 번 스 와이프하므로 필요하거나 특정 조건이 충족 될 때까지 손가락을 화면에서 들어 올리지 못합니다. 그들은 또는 특정 상태로 필요할 때까지 따라서 그들은 아마도 화면에서 손가락을 들어 올려되지 않습니다 게임 오브젝트를 여러 번에 걸쳐

Case example

답변

1

사용자 와이프 : 여기

는 예제 이미지입니다 충족되었습니다.

사용자가 화면에서 손가락을 제거하는 데 필요한되지 않기 때문에, 당신은 TouchPhase.MovedRaycastHit2D와 2D 게임 오브젝트 스 와이프를 확인할 수 있습니다. 터치 만 감지하려면 TouchPhase.Began을 사용해야합니다.

void Update() 
{ 
    //Check for Press 
    for (int i = 0; i < Input.touchCount; i++) 
    { 
     if (Input.GetTouch(i).phase == TouchPhase.Began) 
     { 
      Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position); 
      RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero); 
      if (objectHit) 
      { 
       //We hit something 
       if (objectHit.collider.name == "myGameObjectName") 
       { 
        Debug.Log("Touched Finger on GameObject: " + objectHit.collider.name); 
       } 
      } 
     } 

     //Check if we moved the finger(while press is still down) 
     if (Input.GetTouch(i).phase == TouchPhase.Moved) 
     { 
      Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position); 
      RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero); 
      if (objectHit) 
      { 
       //We hit something while moving the finger 
       if (objectHit.collider.name == "myGameObjectName") 
       { 
        Debug.Log("Moved Finger on GameObject: " + objectHit.collider.name); 
       } 
      } 
     } 

     //Check for release 
     if (Input.GetTouch(i).phase == TouchPhase.Ended) 
     { 
      Debug.Log("Released Finger!"); 
     } 
    } 
} 

편집 :

코드는 게임 오브젝트를 통해 모든 와이프를 감지하지 않습니다. 은 주변을 조금만 스쳐야 만 잘 작동합니다.

사용자 지정 이동 단계가있을 수 있습니다. if (Input.GetTouch(i).phase == TouchPhase.Moved)if (Input.GetTouch(i).deltaPosition.magnitude > validMoveMagnitude)으로 바꿉니다.

validMoveMagnitudefloat validMoveMagnitude = 1.5f;으로 정의됩니다.

EDIT 3 : 작은 움직임이 여전히 감지되지 않는

경우, 마지막 터치 pos가 다음 새 터치 POS과 비교 저장하는 변수를 만들 수 있습니다.

Vector3 lastPos; 

void Update() 
{ 
    //Check for Press 
    for (int i = 0; i < Input.touchCount; i++) 
    { 
     if (Input.GetTouch(i).phase == TouchPhase.Began) 
     { 
      lastPos = Input.GetTouch(i).position; 
      Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position); 
      RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero); 
      if (objectHit) 
      { 
       //We hit something 
       if (objectHit.collider.name == "myGameObjectName") 
       { 
        Debug.Log("Touched Finger on GameObject: " + objectHit.collider.name); 
       } 
      } 
     } 

     //Get current Pos 
     Vector3 currentPos = Input.GetTouch(i).position; 

     //Check if we moved 
     if (currentPos != lastPos) 
     { 
      //Update Last Pos 
      lastPos = currentPos; 
      Debug.Log("Finger Moved!" + lastPos); 

      Vector2 fingerRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position); 
      RaycastHit2D objectHit = Physics2D.Raycast(fingerRay, Vector2.zero); 
      if (objectHit) 
      { 
       //We hit something while moving the finger 
       if (objectHit.collider.name == "myGameObjectName") 
       { 
        Debug.Log("Moved Finger on GameObject: " + objectHit.collider.name); 
       } 
      } 
     } 

     //Check for release 
     if (Input.GetTouch(i).phase == TouchPhase.Ended) 
     { 
      // Debug.Log("Released Finger!"); 
     } 
    } 
} 
+0

코드가 GameObject를 통한 모든 스 와이프를 감지하지 못합니다. 주위를 조금만 문지르면 효과가 있습니다. – Cress

+0

@Cress 답안에서 편집 내용을 읽으십시오. – Programmer

+0

올바르게 이해하면 validMoveMagnitude가 낮을수록 실제 움직임을 감지 할 수있는 조건의 움직임이 짧아 질 수 있지만 손가락이 GameObject 위로 스 와이프 할 때마다 조건이 충족되지 않습니다. – Cress

0

상자 콜 라이더가있는이 게임 객체에이 스크립트를 연결하십시오. Android에서도 작동하는 마우스 포인터로 이벤트를 감지 할 수 있습니다. 박스 콜리더 2D에 절반 크기의 패널이 부착 된 기본 캔버스를 사용해 보았습니다.

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

public class Test : MonoBehaviour,IPointerEnterHandler 
{ 
    public void OnPointerEnter(PointerEventData eventData) 
    { 
     GameObject currentGo; 
     currentGo = eventData.pointerEnter; 
     if (currentGo.tag == "GameObjectWithCollider2D" || currentGo.GetComponent<BoxCollider2D>()) 
     { 
      Debug.Log ("This has Box Collider 2D"); 
     } 
    } 
} 
+0

이것은 UI에서만 작동합니다. 내 GameObject는 BoxCollider2D가있는 SpriteRenderer입니다. – Cress

관련 문제