2015-06-26 1 views
1

Я только начал изучать Unity (используя C#), и я пытаюсь создать скрипт, который сделает объект, к которому прикреплен скрипт, следовать моим сенсорным входам (в основном, следуйте моему пальцу, когда Я перемещаю его).Unity для Android - объект не следующие сенсорные входы

То, что я пытался сделать, это:

EDIT: это обновилась версия, что у меня сейчас.

using UnityEngine; 
using System.Collections; 
using System; 

public class PlayerMovement : MonoBehaviour { 


    private Vector3 fingerEnd; 

    void Start() { 

    } 

    void Update() { 

     foreach(Touch touch in Input.touches) 
     { 

      if (touch.phase == TouchPhase.Began) 
      { 
       fingerEnd = touch.position; 
      } 
      if (touch.phase == TouchPhase.Moved && (Math.Sqrt(Math.Pow(fingerEnd.x,2) + Math.Pow(fingerEnd.y,2)) - Math.Sqrt(Math.Pow(transform.position.x,2) + Math.Pow(transform.position.y,2))<100)) 
      { 
       fingerEnd = touch.position; 
       Vector3 worldCoordinates = Camera.main.ScreenToWorldPoint(fingerEnd); 
       transform.Translate(worldCoordinates); 
      } 
     } 

    } 
} 

Я также попытался с помощью Vector2.Lerp, но все-таки мой объект не движется. Вероятно, это очень простая ошибка, но я не вижу, что здесь не работает.

Я также попытался изменить

fingerEnd = touch.position; 
Vector3 worldCoordinates = Camera.main.ScreenToWorldPoint(fingerEnd); 
transform.Translate(worldCoordinates); 

в

fingerEnd = touch.position; 
transform.Translate(fingerEnd); 

или

fingerEnd = touch.position; 
Vector3 worldCoordinates = Camera.main.ScreenToWorldPoint(fingerEnd); 
transform.position = worldCoordinates; 

или

fingerEnd = touch.position; 
transform.position = fingerEnd ; 

без эффекта.

EDIT: Хорошо, я решил. Это была моя ошибка. В предложении IF я использовал значения touch.position (fingerEnd), прежде чем я понял, что это позиция в пикселях на экране. Я сравнил его с transform.position, который был в единицах координат. Он работал, когда я отделил эти 2 условия от IF.

End версия кода:

using UnityEngine; 
using System.Collections; 
using System; 

public class PlayerMovement : MonoBehaviour { 

    Vector3 worldCoordinates; 

    void Start() { 

    } 

    void Update() { 

     foreach(Touch touch in Input.touches) 
     { 

      if (touch.phase == TouchPhase.Began) 
      { 
       Debug.Log("Touch: " + touch.position); 
      } 
      if (touch.phase == TouchPhase.Moved) 
      { 
       worldCoordinates = Camera.main.ScreenToWorldPoint(touch.position); 

       if ((Math.Sqrt(Math.Pow(worldCoordinates.x,2) + Math.Pow(worldCoordinates.y,2)) - Math.Sqrt(Math.Pow(transform.position.x,2) + Math.Pow(transform.position.y,2))<0.2)) 
       { 
        Debug.Log("Touch: " + touch.position); 
        Debug.Log("Transform: " + transform.position); 
        Debug.Log("WorldCoordinates: " + worldCoordinates); 
        //transform.Translate(worldCoordinates); 
        transform.position = new Vector3(worldCoordinates.x,worldCoordinates.y); 
        //transform.Translate(touch.position); 
        Debug.Log("Transform 2: " + transform.position); 
       } 
      } 
     } 
    } 
} 

Объект следует теперь мой палец. Это немного медленное (оставаясь все время, пока я не остановлюсь), но это еще одна проблема для решения. Большое спасибо за помощь.

ответ

2

touch.position Положение прикосновения в пиксельных координатах.

Итак, прежде всего, вам нужно преобразовать положение в мир (единство мира).

Вы должны использовать Camera.ScreenToWorldPoint к вашему коду (возможно, основную камеру).

Например:

Vector3 worldCoordinates = yourCamera.ScreenToWorldPoint(fingerEnd); 
transform.Translate(worldCoordinates); 
+0

Я чувствую, что это правильное направление, но у меня проблема с камерой.Я также попытался установить новый параметр (private Camera mainCamera;) и ​​инициализировал его «mainCamera = GetComponent ()». Затем я использую две строки, которые вы указали (с mainCamera вместо yourCamera, конечно). Тем не менее, ничего не работает. Я предполагаю, что вместо нового параметра Camera я должен использовать тот, который уже был в проекте с самого начала, но я не уверен, как (пытался использовать gameobject.getobjectwithtag, но он не работал). – Hisu

+0

Вы попробовали Camera.main.ScreenToWorldPoint? –

+0

Я пробовал это сейчас, но, похоже, проблема остается такой же, как и без ScreenToWorlPoint. Мой объект начинается в середине экрана, но он реагирует, когда я прокручиваю свой тон в верхней части экрана (сверху слева вверху справа). Он также не следует моему прикосновению и очень быстро движется (я сразу его теряю) в верхнем левом углу. Я явно что-то не так с координатами. Я использую телефон в ландшафтном положении. Я добавил обновленный код к основному сообщению. – Hisu

1

вам нужно изменить

transform.position = fingerEnd; 

к

transform.Translate(fingerEnd); 
+0

Это частично хорошо, мой объект начал реагировать на что-то, но не так, как я хотел. После одного конкретного перемещения он перемещается в далеко отдаленные координаты (например, x = 6000+ и y = 4000+). Я предполагаю, что это имеет какое-то отношение к ScreenToWorldPoint, упомянутому в другом ответе – Hisu

Смежные вопросы