2015-08-26 88 views
1

好吧,我正在製作這個遊戲,用戶可以在屏幕上拖動一個球,但它不應該離開遊戲區域。雖然我將​​推向了碰撞體,但它會反彈回來,如果我推得太緊,它就會脫離屏幕(我需要使它不會脫離屏幕,用戶可以自由拖動它當然,但在屏幕內)。當使用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部分。

此外,您得到的transformscreenPoint,然後使用z價值,這對我來說沒有多大意義。

無論如何,我不明白爲什麼這不應該爲你工作,我還沒有測試過它。