unity怎么实现拖拽3D物体并能放到指定位置

请问unity怎么实现鼠标左键拖着一个3D物体,并且角色在场景中移动的时候3D物体与角色的位置要始终保持正常,不能跑着跑着3D物体就从视野中丢失了,当我松手时还能放到指定位置,如果没放对就会弹回最开始拿起他的位置

引用 皆我百晓生 小程序回复内容作答:

要实现拖拽3D物体并能放到指定位置,可以按照以下步骤进行操作:

  1. 首先,给需要拖拽的物体添加一个刚体组件 Rigidbody,并将刚体的属性设置为 Kinematic,这样可以使物体不受物理引擎的影响。

  2. 在脚本中添加以下代码,用于实现物体的拖拽功能:

using UnityEngine;

public class DragObject : MonoBehaviour
{
    private bool isDragging = false;
    private Vector3 offset;

    private void OnMouseDown()
    {
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f));
        isDragging = true;
    }

    private void OnMouseUp()
    {
        isDragging = false;
    }

    private void Update()
    {
        if (isDragging)
        {
            Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10.0f);
            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
            transform.position = curPosition;
        }
    }
}
  1. 创建一个空对象,作为指定位置的点,将其命名为 TargetPoint,并调整其位置到需要的位置。

  2. 添加以下代码,用于判断拖拽物体是否放置到目标位置,并实现弹回效果:

using UnityEngine;

public class DropToTarget : MonoBehaviour
{
    public Transform targetPoint;
    private Vector3 defaultPosition;

    private void Start()
    {
        defaultPosition = transform.position;
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("DragObject"))
        {
            if (Vector3.Distance(transform.position, targetPoint.position) < 0.5f)
            {
                collision.gameObject.transform.position = targetPoint.position;
            }
            else
            {
                collision.gameObject.transform.position = defaultPosition;
            }
        }
    }
}
  1. 在场景中创建一个空对象,将上述 DragObject 和 DropToTarget 脚本分别添加到需要拖拽和放置的物体上。

注意:需要将拖拽物体的 Tag 设置为 "DragObject",以便 DropToTarget 脚本正确识别。

这样,当拖拽物体移动时,其位置会始终保持在视野中;当松开鼠标时,如果拖拽物体放置到了指定位置,它将停留在目标位置上,否则会弹回到最开始拿起它的位置。