2015-08-26 6 views
1

Итак, я делаю эту игру, где пользователь может перетаскивать мяч по экрану, но он не должен покидать игровое поле. Я получаю following problem, хотя, когда я подталкиваю его к коллайдерам, он отскакивает назад, и если я слишком сильно нажимаю, он просто отключается от экрана (мне нужно заставить его не уходить с экрана. Пользователь может перетащить все это по месту, но в пределах экрана, конечно).При перетаскивании объекта с rigidbody2D он проходит через коллайдеры (стены)

любые советы о том, как я могу решить эту проблему?

Вот код для волочения, который я использую:

using UnityEngine; 
using System.Collections; 

public class CircleManager : MonoBehaviour { 


     private bool dragging = false; 

     private Vector3 screenPoint; 
     private Vector3 offset; 

     // Pressionando 
     void OnMouseDown() 
     { 
       dragging = true; 
       screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position); 
       offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); 
     } 

     // Arrastando 
     void OnMouseDrag() 
     { 
       Vector3 cursorPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); 
       Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset; 

       //i tried with both below. 
       //transform.position = cursorPosition; 
       transform.GetComponent<Rigidbody2D>().MovePosition(cursorPosition); 
     } 

     // Soltando 
     void OnMouseUp() 
     { 
       dragging = false; 
     } 


} 

Спасибо!

+0

* «Когда я нажимаю его на коллайдеры, он отскакивает назад» *, что именно вы ожидаете от него? – maksymiuk

+0

Я ожидаю, что это просто не пройдет через стену, извините за отсутствие ясности! Мне нужно, чтобы он просто столкнулся и остался там, не позволяя игроку тащить его с экрана. – PossessWithin

ответ

1

Вы могли бы попытаться сделать что-то подобное,

if(transform.position.x > xMaxPos) 
{ 
    transform.position.x = new Vector3(xMaxPos, transform.position.y, transform.position.z); 
} 

Вы можете настроить для каждого мин и макс. Затем, когда вы создаете переменные xMaxPos, создать им нравится:

[serializeField] 
private float xMaxPos; 

Таким образом, они будут отображаться в инспекторе, и вы можете настроить их значения, как вам угодно. Вы также можете бросить в смещение, это ширина шара т.е.

transform.position.x = new Vector3(xMaxPos - transform.localscale.x/2, transform.position.y, transform.position.z); 
+0

Он работал почти отлично! Мне пришлось использовать transform.position (без .x) и сделать несколько других вычислений, например, получить радиус круга и прочее, но теперь это здорово. Спасибо! – PossessWithin

1

Попробуйте использовать velocity

public class CircleManager : MonoBehaviour { 


    private bool dragging = false; 

    private Vector3 screenPoint; 
    private Vector3 offset; 

    public float speed = 5.0f; 

    // Pressionando 
    void OnMouseDown() 
    { 
     dragging = true; 

     Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(ToDepth(Input.mousePosition, transform.position.z)); 

     offset = gameObject.transform.position - cursorPosition; 
    } 

    // Arrastando 
    void OnMouseDrag() 
    { 
     Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(ToDepth(Input.mousePosition, transform.position.z)) + offset; 

     Vector3 direction = (transform.position - cursorPosition).normalized; 
     transform.GetComponent<Rigidbody2D>().velocity = direction * speed * Time.deltaTime; 
    } 

    // Soltando 
    void OnMouseUp() 
    { 
     dragging = false; 
    } 

    Vector3 ToDepth(Vector3 value, float depth) 
    { 
     return new Vector3(value.x, value.y, depth); 
    } 
} 

Несколько вещей отметить: Вы не должны выписывать gameObject.transform.position я вижу, что вы сделали это несколько раз, а также напрямую позвонить transform.... Это то же самое, поэтому вам не нужна часть gameObject.

Также вы получаете screenPointtransform, а затем используя значение z, которое позже не имеет для меня никакого смысла.

В любом случае, я не понимаю, почему это не должно работать для вас, но я его не проверял.

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

  • Нет связанных вопросов^_^