Перетаскивание 2D-игрыObject

так как мои предыдущие темы показывают, я создаюgameObject из изображений спрайтов во время выполнения, используя этот код:

 tex = Resources.Load<Texture2D>("pig") as Texture2D;
 Sprite sprite = new Sprite();
 sprite = Sprite.Create(tex, new Rect(0, 0, 250, 150), new Vector2(0.5f, 0.5f));
 GameObject newSprite = new GameObject();
 newSprite.AddComponent<Rigidbody2D>();
 newSprite.GetComponent<Rigidbody2D>().gravityScale = 0f;
 newSprite.AddComponent<ObjectMovement>();
 newSprite.AddComponent<SpriteRenderer>();
 SR = newSprite.GetComponent<SpriteRenderer>();
 SR.sprite = sprite;

Как видите, я добавил скриптObjectMovement"Я хочу проверить в этом скрипте, если кто-то перетаскивает этот конкретныйgameObject и если так, сделайте так, чтобы он следовал позиции касания, просто чтобы упомянуть - эта игра 2D. Я никогда не пользоваласьRaysили жеRaycast поэтому я не уверен, где я ошибся. В любом случае вот мой код скрипта:

public SpriteRenderer selection=null;
    void Update()
    {
        if (Input.touchCount >= 1)
        {
            foreach (Touch touch in Input.touches)
            {
                Ray ray = Camera.main.ScreenPointToRay(touch.position);
                RaycastHit hit;
                switch (touch.phase)
                {
                    case TouchPhase.Began:
                        if (Physics.Raycast(ray, out hit, 100))
                            selection = hit.transform.gameObject.GetComponent<SpriteRenderer>();
                        break;
                    case TouchPhase.Moved:
                        selection.transform.position = new Vector2(selection.transform.position.x + touch.position.x / 10, selection.transform.position.y + touch.position.y / 10);
                        break;
                    case TouchPhase.Ended:
                        selection = null;
                        break;
                }
            }
        }
    }

Так что в основном - при касании экрана, запуститьray и проверить, какиеgameObject находится в этом положении, когда двигаете пальцем, следуйте за ним. Перетащите. Благодарю.

РЕДАКТИРОВАТЬ: Я заметил, что скрипт прикреплен к каждомуgameObject что не эффективно, есть идеи?

 Fattie15 июн. 2016 г., 15:19
обязательно отметьте щедрый ответ ниже
 DAVIDBALAS115 июн. 2016 г., 15:32
@JoeBlow Конечно, он мне очень помогает ... Я жду его комментария.

Ответы на вопрос(1)

Решение Вопроса

Для 2D вы используетеRaycastHit2D а такжеPhysics2D.Raycast вместоRaycastHit а такжеPhysics.Raycast, Это для 3D. Во-вторых, обязательно прикрепите коллайдер кSprite, Так как это 2D игра, коллайдер должен иметь слово2D"в нем. Например,Box Colider 2D от редактора. Вы также можете использоватьCircle Collider 2D.

Я заметил, что скрипт прикреплен к каждому игровому объекту, который не эффективен, есть идеи?

Просто создайте пустой GameObject и присоедините к нему этот скрипт. Вот и все.

Вот исправленная версия вашего кода:

float tempZAxis;
public SpriteRenderer selection;
void Update()
{
    Touch[] touch = Input.touches;
    for (int i = 0; i < touch.Length; i++)
    {
        Vector2 ray = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
        RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.zero);
        switch (touch[i].phase)
        {
            case TouchPhase.Began:
                if (hit)
                {
                    selection = hit.transform.gameObject.GetComponent<SpriteRenderer>();
                    if (selection != null)
                    {
                        tempZAxis = selection.transform.position.z;
                    }
                }
                break;
            case TouchPhase.Moved:
                Vector3 tempVec = Camera.main.ScreenToWorldPoint(touch[i].position);
                tempVec.z = tempZAxis; //Make sure that the z zxis never change
                if (selection != null)
                {
                    selection.transform.position = tempVec;
                }
                break;
            case TouchPhase.Ended:
                selection = null;
                break;
        }

    }
}

Это будет работать только на мобильных устройствах, но не на Desktop Build. Я предлагаю вам реализоватьIBeginDragHandler, IDragHandler, IEndDragHandler и переопределить функции, которые идут с ними. Теперь он будет работать как с мобильной, так и с настольной платформой.

Замечания: Для второго решения вы должны прикрепить скрипт ниже ко всем спрайтам, которые вы хотите перетащить в отличие от первого скрипта выше.

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

public class Dragger : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{

    Camera mainCamera;
    float zAxis = 0;
    Vector3 clickOffset = Vector3.zero;

    // Use this for initialization
    void Start()
    {
        //Comment this Section if EventSystem system is already in the Scene
        addEventSystem();


        mainCamera = Camera.main;
        mainCamera.gameObject.AddComponent<Physics2DRaycaster>();

        zAxis = transform.position.z;
    }

    public void OnBeginDrag(PointerEventData eventData)
    {
        clickOffset = transform.position - mainCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, zAxis));
    }

    public void OnDrag(PointerEventData eventData)
    {
        //Use Offset To Prevent Sprite from Jumping to where the finger is
        Vector3 tempVec = mainCamera.ScreenToWorldPoint(eventData.position) + clickOffset;
        tempVec.z = zAxis; //Make sure that the z zxis never change

        transform.position = tempVec;
    }

    public void OnEndDrag(PointerEventData eventData)
    {

    }

    //Add Event Syste to the Camera
    void addEventSystem()
    {
        GameObject eventSystem = new GameObject("EventSystem");
        eventSystem.AddComponent<EventSystem>();
        eventSystem.AddComponent<StandaloneInputModule>();
    }
}
 DAVIDBALAS115 июн. 2016 г., 15:29
Комментируя этот раздел, вы имели ввиду окружение оператором if?
 Programmer15 июн. 2016 г., 16:13
@ DAVIDBALAS1 Ты никогда не говорил мне, что случилось ... проект, который я послал тебе, работал?
 DAVIDBALAS115 июн. 2016 г., 16:13
Да, это заставляет меня задуматься, что я сделал неправильно в моем ..
 DAVIDBALAS115 июн. 2016 г., 22:05
Когда я добавляю какой-либо объект в инспектор, а не во время выполнения, когда я перетаскиваю его на другие объекты, они тоже перемещаются, поэтому они не соприкасаются друг с другом - это означает, что у них действительно есть коллайдер ... но я не могу их перетащить.
 Programmer15 июн. 2016 г., 16:37
@ DAVIDBALAS1 Думаю, проблема в коллайдере. Когда вы добавляете его из кода, проверьте в редакторе и убедитесь, что коллайдер создан во время выполнения, когда вы нажимаете кнопку воспроизведения. Если он создан, вы должны нажать кнопку «Изменить коллайдер» на коллайдере, а затем перейти к просмотру сцены вместо просмотра игры. Проверьте, покрывает ли Колдер Спрайт. Может быть, это проблема.
 Programmer15 июн. 2016 г., 16:01
@ DAVIDBALAS1 Вот, пожалуйстаwikisend.com/download/976582/DAVIDBALAS1.rar Скачайте и запустите его, затем перетащите Sprite. Если это не сработает, вы должны обновить версию Unity до версии 5.4.0.13, которую я использую. Я рекомендую вам использовать второе решение и заставить его работать.
 Programmer15 июн. 2016 г., 16:19
@ DAVIDBALAS1 Вы прикрепили коллайдер к Спрайту? 2D коллайдер? Можете ли вы закрыть Unity, молнии, чтоОБРАЗЕЦ проект, который вы только что создали, и загрузите его на тот же сайт, который я загрузил мой. Я посмотрю на это. Это должно работать.
 DAVIDBALAS115 июн. 2016 г., 16:25
При добавлении коллайдера в инспекторе он теперь работает нормально, но когда я добавил его программно (newSprite.AddComponent <BoxCollider2D> ();), он не работает ...
 DAVIDBALAS115 июн. 2016 г., 16:16
Я уверен, что я выбрал 2D при создании проекта, однако, когда я создал новый проект и скопировал ваш скрипт, он все равно не работал для меня. :(
 DAVIDBALAS115 июн. 2016 г., 15:28
Для второго сценария я получаю сообщение об ошибке - Несколько событий в сцене ...
 Programmer15 июн. 2016 г., 15:41
@ DAVIDBALAS1 Это работает для меня как на мобильном телефоне, так и на компьютере. Просто ничего не меняйте, кроме комментариев, о которых я говорил. Он должен работать, и вы должны прикрепить его к Sprite, на который вы нажимаете.
 DAVIDBALAS115 июн. 2016 г., 15:43
Я приложил это, как я показал в вопросе, Интересно, почему это не работает для меня.
 DAVIDBALAS115 июн. 2016 г., 15:38
О, конечно, я не знал, что это называется комментирование строки ... Второй скрипт не работает для меня как на телефоне, так и на компьютере ...
 Programmer15 июн. 2016 г., 15:44
@ DAVIDBALAS1 Помните, что это для 2D проекта, а не 3D, поэтому убедитесь, что ваш проект 2D. Вы можете убедиться в этом, создав новый проект, создав простой 2D Sprite. Прикрепите скрипт к нему. Обязательно откомментируйтеaddEventSystem(), Дай мне знать, если это работает. Перетащите Спрайт вокруг. Это должно работать.
 DAVIDBALAS115 июн. 2016 г., 16:11
Все мои объекты на спрайте, фоновый спрайт, может быть, это вызвало ошибки?
 Programmer15 июн. 2016 г., 15:35
@ DAVIDBALAS1 Нет. Это значит ставить// спередиaddEventSystem(); или просто удаляяaddEventSystem(); отStart() функция. Добавление// скажет компилятору не компилировать эту строку кода. Итак, замениaddEventSystem(); с//addEventSystem(); или удали это.
 Programmer15 июн. 2016 г., 16:14
@ DAVIDBALAS1 Вы должны выбрать 2D при создании нового проекта. Сделайте это, но выберите 2D вместо 3D при создании проекта.
 DAVIDBALAS115 июн. 2016 г., 15:50
На самом деле, в новом проекте я просто перетащил изображение, чтобы создать спрайт, и прикрепил скрипт, я также откомментировал функцию, и она тоже не сработала ... Думаю, я просто буду придерживаться первого примера ...

Ваш ответ на вопрос