在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的添加一下
最简单的方法多添加一个条件判断,如果碰撞到了同类物体,就不执行跟随鼠标走的逻辑就可以了
给你提供一下思路:
点到物体可以把刚体的重力关掉,松开鼠标打开重力
物体移动到鼠标点的代码改一下,改为朝鼠标点施加速度或者力
这样应该可以解决你的问题,
如果还是解决不了,可以私信我帮你