В Unity говорят, что вам нужно обнаружить прикосновение пальца (рисунок пальцем) к чему-либо в сцене.
Единственный способ сделать это в современном Unity, очень прост:
Шаг 1 Поместите коллайдер на этот объект. ("Земля" или что бы то ни было.) 1
Шаг 2. На вашей камере на панели "Инспектор" щелкните, чтобы добавить Physics Raycaster (2D или 3D в зависимости от ситуации).
Шаг 3. Просто используйте код, как в примере A ниже.
(Совет - не забудьте убедиться в наличии EventSystem... иногда Unity добавляет ее автоматически, иногда нет!)
Фантастика, не может быть проще. Наконец, Unity правильно обрабатывает un/распространяется через уровень пользовательского интерфейса. Работает равномерно и безупречно на рабочем столе, устройствах, редакторе и т.д. И т.д. Ура Unity.
Все хорошо. Но что, если вы хотите рисовать просто "на экране"?
Таким образом, вы хотите, просто, проводите/касания/рисования от пользователя "на экране". (Например, просто для управления камерой на орбите, скажем.) Так же, как и в любой обычной 3D-игре, где камера бегает и движется.
Вы не хотите положение пальца на каком-либо объекте в мировом пространстве, вы просто хотите абстрактные "движения пальца" (то есть положение на стекле).
Какой коллайдер вы потом используете? Вы можете сделать это без коллайдера? Кажется глупым добавлять коллайдер только по этой причине.
Что мы делаем, это:
Я просто делаю плоский коллайдер и прикрепляю его к камере. Так что он просто сидит в усеченной камере и полностью закрывает экран.
(Для кода тогда нет необходимости использовать ScreenToWorldPoint, поэтому просто используйте код, как в примере B - чрезвычайно просто, работает отлично.)
Мой вопрос, кажется немного странным, что я использую описанную мной "камеру под камерой", просто чтобы прикоснуться к стеклу.
Какое дело здесь?
(Примечание. Пожалуйста, не отвечайте на вопрос о древней системе Unity "Прикосновения", которая сегодня непригодна для реальных проектов, вы не можете игнорировать .UI, используя устаревший подход.)
Пример кода А - рисование на объекте сцены. Используйте ScreenToWorldPoint.
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FingerMove:MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
public void OnPointerDown (PointerEventData data)
{
Debug.Log("FINGER DOWN");
prevPointWorldSpace =
theCam.ScreenToWorldPoint( data.position );
}
public void OnDrag (PointerEventData data)
{
thisPointWorldSpace =
theCam.ScreenToWorldPoint( data.position );
realWorldTravel =
thisPointWorldSpace - prevPointWorldSpace;
_processRealWorldtravel();
prevPointWorldSpace = thisPointWorldSpace;
}
public void OnPointerUp (PointerEventData data)
{
Debug.Log("clear finger...");
}
Пример кода B... вас интересует только то, что пользователь делает на стеклянном экране устройства. Еще проще здесь:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class FingerMove:MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
private Vector2 prevPoint;
private Vector2 newPoint;
private Vector2 screenTravel;
public void OnPointerDown (PointerEventData data)
{
Debug.Log("FINGER DOWN");
prevPoint = data.position;
}
public void OnDrag (PointerEventData data)
{
newPoint = data.position;
screenTravel = newPoint - prevPoint;
prevPoint = newPoint;
_processSwipe();
}
public void OnPointerUp (PointerEventData data)
{
Debug.Log("FINEGR UP...");
}
private void _processSwipe()
{
// your code here
Debug.Log("screenTravel left-right.. " + screenTravel.x.ToString("f2"));
}
}
1 Если вы новичок в Unity: на этом шаге, скорее всего, сделайте слой с именем "Draw"; в настройках физики заставить Ничья взаимодействовать ни с чем; на втором шаге с Raycaster просто установите слой на "Draw".