之前做过一个在Unity中实现二维(X,Z轴)拖动的效果,思路是直接获取鼠标坐标并且将其赋给GameObject。然而在三维(X,Y轴)的移动中,因为鼠标对于Scene中并没有Z轴的概念,因此无法使用直接赋值的方法来移动GameObject。所以在此引用了Unity中射线的概念来实现物体的三维移动,但是在物体的移动方面,因为物体也是通过射线碰撞位置去改变物体的坐标,因此会出现两个物体无法完成碰撞并且重叠的现象,因此想到了可以通过记录前一帧物体位置的方法,并结合碰撞器,当检测到碰撞时即返回上一帧的位置来解决碰撞的问题。具体代码如下所示:
using UnityEngine;
using System.Collections;
//通过射线控制物体贴地面移动
public class mouseDrag : MonoBehaviour {
//声明从鼠标发出一条射线clickRay
Ray clickRay;
//声明clickRay与游戏物体的碰撞
RaycastHit clickPoint;
//声明isCollided变量和canMove变量,记录是否碰撞和是否可以移动
private bool isCollided = false;
private bool canMove = true;
//声明clickRay与地面的碰撞
RaycastHit posPoint;
//设置地面层,我的地面层是第8层,所以是8。
LayerMask mask=1<<8;
//初始化父物体和速度变量
GameObject parent=null;
public float speed=10f;
//初始化位置信息
public Vector3 old;
void Start () {
}
void Update(){
clickRay=Camera.main.ScreenPointToRay(Input.mou