2015-08-26 57 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价值,这对我来说没有多大意义。

无论如何,我不明白为什么这不应该为你工作,我还没有测试过它。