Перетащите на сенсорный интерфейс Android - PullRequest
0 голосов
/ 22 сентября 2019

У меня проблема с изображением пользовательского интерфейса на холсте для Android в единстве, объект не следует точным координатам касания, он слегка перемещается, но не настолько, чтобы на самом деле был функционален

Я перепробовал все, включая создание новогопроект, который, очевидно, работает как задумано, но без изображения из пользовательского интерфейса, только путем перемещения спрайта на сцену

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

public class DragScript : MonoBehaviour{

//offset dotkniecia objektu
float deltaX, deltaY;

//dostep do komponentu rigibody
Rigidbody2D rb;

//bool do dostepu poruszania pilki
bool moveAllowed = false;

void Start()
{
    rb = GetComponent<Rigidbody2D>();
}

void Update(){

    /// <summary>
    /// inicjowanie zdarzenia dotykowego
    /// jezeli ma miejsce zdarzenie dotykowe czyli jest > 0
    /// </summary>
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);

        // uzyskuje pozycje dotykowe
        Vector2 touchPos = Camera.main.ScreenToWorldPoint(touch.position);

        //przetwarzanie faz dotykowych
        switch (touch.phase)
        {
            //jezeli dotykasz ekranu
            case TouchPhase.Began:
                Debug.Log("DOTKNALES PALCEM WTFF");
                // jezeli dotkniesz elementu
                if (GetComponent<BoxCollider2D>() == Physics2D.OverlapPoint(touchPos)){

                    Debug.Log("DZIALA IF");
                    /// <summary>
                    /// pobierz offset pomiedzy pozycjami ktore dotkniesz
                    /// i srodek objektu gry
                    /// </summary>
                    deltaX = touchPos.x - transform.position.x;
                    deltaY = touchPos.y - transform.position.y;

                    /// <summary>
                    /// jezeli dotyk zaczyna sie w ciagu colidera obiektu
                    /// wtedy może się poruszać
                    /// </summary>
                    moveAllowed = true;

                    /// <summary>
                    /// ogranicza troche rigibody aby sie poruszał
                    /// bardziej płynnie i poprawnie
                    /// </summary>
                    //rb.mass = 1;
                    rb.freezeRotation = true;
                    //rb.velocity = new Vector2(0, 0);
                    rb.gravityScale = 0;
                    GetComponent<PolygonCollider2D>().sharedMaterial = null;
                }
                break;
            // Gdy przesuwasz palcem po ekranie
            case TouchPhase.Moved:
                // jezeli przesuwam obiekt i moveallowed = true
                if (GetComponent<BoxCollider2D>() == Physics2D.OverlapPoint(touchPos) && moveAllowed)
                {   
                    rb.MovePosition(new Vector2(touchPos.x - deltaX, touchPos.y - deltaY));
                }
                break;

            // puszczasz palce
            case TouchPhase.Ended:
                Debug.Log("KONIEC");
                moveAllowed = false;
                //rb.mass = 17;
                rb.freezeRotation = false;
                rb.gravityScale = 45;
                break;
        }
    }
}

}

он должен перемещать изображение интерфейса пальцами без сообщений об ошибках, которые он просто не делаетдвигаться правильно

1 Ответ

0 голосов
/ 22 сентября 2019

Скрипт прикреплен к неверному объекту в Иерархии.Вам нужно прикрепить его к холсту, а не к изображению.Скрипт использует преобразование объекта, на котором он находится.Таким образом, если вы поместите его на дочерний объект, родительский объект не будет следовать.

Чтобы решить эту проблему, попробуйте добавить скрипт на холст.

...