我正在尝试创建拖放功能。我有一个位于立方体上的游戏对象(如桌子)。我想让玩家将这个对象拖放到多个“热点”。同时,虽然这是一个3D游戏,但不应该允许它们将对象拖离桌面,上方,下方,等等。只需拖动桌面顶部即可。我有这种设置的方式是这样的:
在桌面上(一个有刚体的立方体)我有两架飞机。这个平面只是装饰性的,让用户可以看到放到哪里。这些平面中的每一个都有一个子平面(一个小得多的区域,以父母为中心)。这个孩子有一个Box Collider(isTrigger = true),它向上延伸到空中,就像一根伸出地面的杆子一样)
然后我有一个立方体,它有一个刚体和一个盒子对撞机(isTrigger = true)。这个立方体被实例化到一个热点上的“桌子”顶部。
HotSpotCode.cs
public class HotSpotCodeScript : MonoBehaviour {
public void OnTriggerEnter(Collider other){
DraggableObject ds = other.GetComponent<DraggableObject>();
ds.startPos = this.gameObject.transform.position;
}
}
DraggableObject.cs
public class DraggableObject : MonoBehaviour {
float lerpTime = 1f;
float currentLerpTime;
float moveDistance = 10f;
Plane plane;
public Vector3 startPos, endPos;
public bool drag;
Vector3 position;
void Start(){
startPos = transform.position;
endPos = transform.position + transform.up * moveDistance;
}
void OnMouseDown(){
plane = new Plane(Vector2.up, transform.position);
drag = true; // start dragging
}
void OnMouseUp(){
lerp();
drag = false;
}
private void lerp() {
currentLerpTime += Time.deltaTime;
if (currentLerpTime > lerpTime)
{
currentLerpTime = lerpTime;
}
float perc = currentLerpTime / lerpTime;
transform.position = Vector3.Lerp(startPos, endPos, perc);
}
public void Update()
{
position = transform.localPosition;
if (drag)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float distance;
if (plane.Raycast(ray, out distance))
{
transform.position = ray.GetPoint(distance);
}
}
}
public void OnTriggerEnter(Collider other){
endPos = other.transform.position;
}
}
这段代码大部分都有效。我可以拖动物体,它不会离开它所居住的计划,短距离。但是,我拖动对象越远,然后释放它,对象就越不会重新回到原来的起始位置,并且会被困在某个地方。我不确定这是Lerp()函数的问题,还是可能是如何创建它所拖动的平面。谁能帮我吗?如果您需要更多信息,请告诉我。我已经在这方面工作了好几个星期,而且还没有进一步说明这一点。
另一个弹出的问题是,当被拖动的物体被释放并与热点的对撞机接触时,它会使物体停在准确的位置。因此,如果立方体的一角与对撞机接触,立方体将不会以热点为中心停留。