Unity如何制作鼠标拖动物体并被同类物体阻挡的功能

在unity里做了一个简单的鼠标拖动物体移动的功能,是通过将鼠标位置传给目标物体transform.position实现的
现在我想在此基础上添加一个目标物体会被同类物体阻挡的功能
但是做出来要么把同类物体挤走,要么会重叠,有什么好的解决方法吗


using UnityEngine;
using System.Collections;
 
public class DragObject : MonoBehaviour
{
    /// <summary>
    /// 将要拖动的物体
    /// </summary>
    private Transform _dragGameObject;
 
    /// <summary>
    /// 获取射线需要碰撞的层
    /// </summary>
    private LayerMask _canDrag;
 
    /// <summary>
    /// 直接从外部定义好层,简单理解
    /// </summary>
    public LayerMask canDrag2;
 
    /// <summary>
    /// 获得鼠标的位置和cube位置差
    /// </summary>
    private Vector3 _offset;
 
    /// <summary>
    /// 是否点击到cube
    /// </summary>
    private bool _isClickCube;
 
    /// <summary>
    /// 目标对象的屏幕坐标
    /// </summary>
    private Vector3 _targetScreenPoint;
 
    //限制拖动范围的最小值和最大值
    public float xMin, xMax, zMin, zMax;
 
    // Use this for initialization
    private void Start()
    {
        _canDrag = 1 << LayerMask.NameToLayer("Player");
    }
 
    // Update is called once per frame
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (CheckGameObject())
            {
                _offset = _dragGameObject.transform.position -
                          Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,
                              _targetScreenPoint.z));
            }
        }
 
        if (_isClickCube)
        {
            //当前鼠标所在的屏幕坐标
            Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _targetScreenPoint.z);
            //把当前鼠标的屏幕坐标转换成世界坐标
            Vector3 curWorldPoint = Camera.main.ScreenToWorldPoint(curScreenPoint);
            _dragGameObject.position = curWorldPoint + _offset;
 
            //限制拖动范围
            _dragGameObject.GetComponent<Rigidbody>().transform.position = new Vector3(
                Mathf.Clamp(_dragGameObject.GetComponent<Rigidbody>().transform.position.x, xMin, xMax),
                1.0f,
                Mathf.Clamp(_dragGameObject.GetComponent<Rigidbody>().transform.position.z, zMin, zMax)
            );
        }
 
        if (Input.GetMouseButtonUp(0))
        {
            _isClickCube = false;
            //恢复拖拽物体的Y轴为原点
            _dragGameObject.GetComponent<Rigidbody>().transform.position = new Vector3(
                _dragGameObject.GetComponent<Rigidbody>().transform.position.x, 0,
                _dragGameObject.GetComponent<Rigidbody>().transform.position.z);
        }
    }
 
    /// <summary>
    /// 检查是否点击到cbue
    /// </summary>
    /// <returns></returns>
    private bool CheckGameObject()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;
        if (Physics.Raycast(ray, out hitInfo, 100f, _canDrag))
        {
            _isClickCube = true;
            //得到射线碰撞到的物体
            _dragGameObject = hitInfo.collider.gameObject.transform;
            _targetScreenPoint = Camera.main.WorldToScreenPoint(_dragGameObject.position);
 
            return true;
        }
 
        return false;
    }
}

把该脚本挂到相机上,还有把需要拖动的物体的Layer修改成“Player”即可。没有Player的添加一下

最简单的方法多添加一个条件判断,如果碰撞到了同类物体,就不执行跟随鼠标走的逻辑就可以了

给你提供一下思路:
点到物体可以把刚体的重力关掉,松开鼠标打开重力
物体移动到鼠标点的代码改一下,改为朝鼠标点施加速度或者力
这样应该可以解决你的问题,
如果还是解决不了,可以私信我帮你