2015-07-01 3 views
0

У меня есть 2 сферы в моей сцене. Я хочу иметь возможность перетаскивать мышью из одной сферы в другую и иметь индикатор (например, прямую линию) при перетаскивании. После отпускания кнопки мыши я хочу сохранить в первой сфере другую сферу (как GameObject).Перетаскивание между 2 gameObjects

Мне нужно это в UnityScript, но я могу принять идеи C#.

До сих пор я думал о onMouseDown событие на первой сфере, а затем onMouseEnter в другой сфере, я буду хранить данные в какой-то глобальной переменной (я Donno, как сделать еще) и в случае onMouseExit I 'просто поместите глобальную переменную как null.

Затем onMouseUp на первой сфере Я буду хранить глобальную переменную в нажатом объекте (сфере).

Любые советы и рекомендации по его использованию?

ответ

1

Click and drag functionality demonstration

Предположения/Настройка

  1. Вы работаете в 2D WorldSpace; логика перетаскивания объекта для этой части решения нуждается в изменении.

  2. Установка родительского элемента после перетаскивания клика, ссылка на установку объекта, на который вы не нажимали, чтобы быть дочерним по отношению к родительскому объекту, на который вы нажали.

  3. Камера должна быть орфографической камерой; использование перспективной камеры приведет к тому, что перетаскивание не будет совпадать с тем, что, по вашему мнению, должно быть.

  4. Для того, чтобы сделать работу по перетаскиванию, я создал квадрат, который использовался как «фон» для 2D-сцены, и помещал его на новый слой под названием «фон». Затем установите поле Layermask только для использования фонового слоя.

  5. Создание и настройка материала для линии визуализатора, (я использую Particles/Additive шейдер для приведенного выше примера), а также для параметров линии визуализатора Я использую Start Width: 0.75, End Width: 0 и убедитесь, что отмечен Use World Space.

enter image description here

Объяснение

Во-первых настроить otherSphere поле указывать на другую сферу на сцене. OnMouseDown и OnMouseUp переключить mouseDown bool, который используется для определения необходимости обновления рендеринга линии. Они также используются для включения/выключения средства визуализации линии и установки/удаления родительского преобразования двух сфер.

Чтобы получить позицию, которую нужно перетащить, я получаю лучи от положения мыши на экране, используя метод ScreenPointToRay. Если вы хотите создать добавление сглаживания к этой функции перетаскивания, вы должны включить оператор if (...) else внизу и установить значение lerpTime на значение (0.25 сработало для меня).

Примечание; когда вы отпускаете мышь, родитель сразу устанавливается, так как оба объекта в конечном итоге получают перетаскивание, но ребенок будет вернуться в прежнее положение.

[RequireComponent(typeof(LineRenderer))] 
public class ConnectedSphere : MonoBehaviour 
{ 
    [SerializeField] 
    private Transform  m_otherSphere; 
    [SerializeField] 
    private float   m_lerpTime; 
    [SerializeField] 
    private LayerMask  m_layerMask; 

    private LineRenderer m_lineRenderer; 
    private bool   m_mouseDown; 
    private Vector3   m_position; 
    private RaycastHit  m_hit; 

    public void Start() 
    { 
     m_lineRenderer   = GetComponent<LineRenderer>(); 
     m_lineRenderer.enabled = false; 
     m_position    = transform.position; 
    } 

    public void OnMouseDown() 
    { 
     //Un-parent objects 
     transform.parent  = null; 
     m_otherSphere.parent = null; 

     m_mouseDown    = true; 
     m_lineRenderer.enabled = true; 
    } 

    public void OnMouseUp() 
    { 
     //Parent other object 
     m_otherSphere.parent = transform; 

     m_mouseDown    = false; 
     m_lineRenderer.enabled = false; 
    } 

    public void Update() 
    { 
     //Update line renderer and target position whilst mouse down 
     if (m_mouseDown) 
     { 
      //Set line renderer 
      m_lineRenderer.SetPosition(0, transform.position); 
      m_lineRenderer.SetPosition(1, m_otherSphere.position); 

      //Get mouse world position 
      if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out m_hit, m_layerMask)) 
      { 
       m_position.x = m_hit.point.x; 
       m_position.y = m_hit.point.y; 
      } 
     } 

     //Set position (2D world space) 
     //if (m_lerpTime == 0f) 
      transform.position = m_position; 
     //else 
      //transform.position = Vector3.Lerp(transform.position, m_position, Time.deltaTime/m_lerpTime); 
    } 
} 

Надеюсь, это помогло кому-то.

+0

Возможно, лучший ответ, который я когда-либо получал на Stackoverflow. /челюсть отвисла –