Движущиеся объекты независимо друг от друга, с возможностью одновременного перемещения в Unity 2D - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть два объекта.Дело в том, что мне нужно перемещать объект вверх и вниз (удерживать и перетаскивать), и в то же время мне нужно перемещать другой объект вверх и вниз (удерживать и перетаскивать) независимо.Примерно так: Пример

После поиска в Интернете я нашел небольшой скрипт, но он работает только для одного касания за раз и перетаскивая только один объект.Кроме того, если я коснусь вторым пальцем, объект изменит свое положение на положение второго пальца:


public class Move : MonoBehaviour {
    private Vector3 offset; 

  void OnMouseDown() {
      offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(-2.527f, Input.mousePosition.y));
  }

  void OnMouseDrag() {    
      Vector3 curScreenPoint = new Vector3(-2.527f, Input.mousePosition.y);
      Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
      transform.position = curPosition;    
  }
}

Я просто не могу понять, как я могу сделать так, чтобы два объекта перетаскивались одновременно.Я новичок в единстве и, честно говоря, у меня проблемы с контроллерами

1 Ответ

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

Для сенсорных экранов я предлагаю вам использовать Touch вместо событий мыши.Класс Touch поддерживает несколько касаний одновременно и некоторую полезную информацию, такую ​​как Touch.phase (начальный, движущийся, стационарный и т. Д.).Я написал скрипт, который вы можете прикрепить к нескольким объектам с тегом «Draggable», который заставляет объекты перемещаться независимо.Перетащите другой объект, который должен двигаться, когда вы используете один палец, чтобы выставить другойObj, и он должен работать.В этой версии он работает только для 2 объектов.

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

public class PlayerActionHandler : MonoBehaviour
{
private Camera _cam;

public bool beingDragged;
public Vector3 offset;

public Vector3 currPos;

public int fingerIndex;
public GameObject otherObj;
// Start is called before the first frame update
void Start()
{
    _cam = Camera.main;
}

// Update is called once per frame
void Update()
{
    //ONLY WORKS FOR 2 OBJECTS
    if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
    {
        var raycast = _cam.ScreenPointToRay(Input.GetTouch(0).position);
        RaycastHit hit;
        if (Physics.Raycast(raycast, out hit))
        {
            //use this tag if you want only chosen objects to be draggable 
            if (hit.transform.CompareTag("Draggable"))
            {
                if(hit.transform.name == name)
                {
                    //set being dragged and finger index so we can move the object 
                    beingDragged = true;
                    offset = gameObject.transform.position - _cam.ScreenToWorldPoint(Input.GetTouch(0).position);
                    offset = new Vector3(offset.x, offset.y, 0);
                    fingerIndex = 0;
                }
            }
        }
    }else if (Input.touchCount == 1 && beingDragged)
    {
        otherObj.transform.SetParent(transform);
        if (Input.GetTouch(fingerIndex).phase == TouchPhase.Moved ){
            Vector3 pos = _cam.ScreenToWorldPoint(Input.GetTouch(fingerIndex).position);
            currPos = new Vector3(pos.x, pos.y,0) + offset;
            transform.position = currPos;

        }
    }
    //ONLY WORKS FOR 2 OBJECTS_END
    else if (beingDragged && Input.touchCount > 1)
     {
         //We tie each finger to an object so the object only moves when tied finger moves
         if (Input.GetTouch(fingerIndex).phase == TouchPhase.Moved ){
             Vector3 pos = _cam.ScreenToWorldPoint(Input.GetTouch(fingerIndex).position);
             currPos = new Vector3(pos.x, pos.y,0) + offset;
             transform.position = currPos;

         }
     }else if (Input.touchCount > 0)
       {
           for (var i = 0; i < Input.touchCount; i++)
           {
               //We find the fingers which just touched the screen
               if(Input.GetTouch(i).phase == TouchPhase.Began)
               {
                   var raycast = _cam.ScreenPointToRay(Input.GetTouch(i).position);
                   RaycastHit hit;
                   if (Physics.Raycast(raycast, out hit))
                   {
                       //use this tag if you want only chosen objects to be draggable 
                       if (hit.transform.CompareTag("Draggable"))
                       {
                           if(hit.transform.name == name)
                           {
                               //set being dragged and finger index so we can move the object 
                               beingDragged = true;
                               offset = gameObject.transform.position - _cam.ScreenToWorldPoint(Input.GetTouch(i).position);
                               offset = new Vector3(offset.x, offset.y, 0);
                               fingerIndex = i;
                           }
                       }
                   }
               }
           }

       }else if (Input.touchCount == 0)
       {
           //if all fingers are lifted no object is being dragged
           beingDragged = false;
       }
}

}

...