使用 rigidbody2D 拖动对象时,它会穿过碰撞器(墙壁)
When dragging an object with rigidbody2D it passes through colliders (walls)
好的,所以我正在制作这款游戏,用户可以在屏幕上拖动一个球,但它不应该离开游戏区域。不过,我得到了 following problem,当我将它推向对撞机时,它会反弹回来,如果我用力推它,它就会离开屏幕(我需要让它不离开屏幕。用户是免费的将它拖到各处,但当然是在屏幕内)。
关于如何解决这个问题的任何提示?
这是我正在使用的拖动代码:
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;
}
}
谢谢!
您可以尝试做类似的事情,
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 );
尝试使用 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
部分。
另外,您获得了 transform
的 screenPoint
,然后稍后使用它的 z
值,这对我来说意义不大。
无论如何,我不明白为什么这不适合你,不过我还没有测试过。
好的,所以我正在制作这款游戏,用户可以在屏幕上拖动一个球,但它不应该离开游戏区域。不过,我得到了 following problem,当我将它推向对撞机时,它会反弹回来,如果我用力推它,它就会离开屏幕(我需要让它不离开屏幕。用户是免费的将它拖到各处,但当然是在屏幕内)。
关于如何解决这个问题的任何提示?
这是我正在使用的拖动代码:
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;
}
}
谢谢!
您可以尝试做类似的事情,
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 );
尝试使用 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
部分。
另外,您获得了 transform
的 screenPoint
,然后稍后使用它的 z
值,这对我来说意义不大。
无论如何,我不明白为什么这不适合你,不过我还没有测试过。