前提说明,后面自己有改了一下

网上的很多Unity3D鼠标拖拽范例都是2D移动的,我来贴个在3D空间中拖动物体沿地面移动的代码吧,希望大家能用上~如果完全不懂脚本这块,可以看我下边的Tips,有详细的使用步骤。

因为只学了一个月的C#,编程水平很低,各位大神见笑了……

using UnityEngine;
using System.Collections;

public class mouseDrag : MonoBehaviour {

//声明从鼠标发出一条射线clickRay
Ray clickRay;

//声明clickRay与游戏物体的碰撞
RaycastHit clickPoint;

//声明clickRay与地面的碰撞
RaycastHit posPoint;
//设置地面层,我的地面层是第8层,所以是8。不会设置层的话请看下边的Tips。
LayerMask mask=1<<8;

void Start () {
}

void Update(){

clickRay=Camera.main.ScreenPointToRay(Input.mousePosition);
}
void OnMouseDown()
{
//如果射线与物体相碰,则调用OnMouseDrag()
if(Physics.Raycast (clickRay,out clickPoint))
{
OnMouseDrag();
}
}
void OnMouseDrag()
{
//取射线与地面相碰的坐标,赋给mouseMove,再把mouseMove的x坐标和z坐标赋给物体,y坐标不变(因为是贴在地面上移动)
Physics.Raycast (clickRay ,out posPoint,Mathf.Infinity,mask.value);
Vector3 mouseMove=posPoint.point;
transform.position = (new Vector3 (mouseMove.x, transform.position.y, mouseMove.z));
return;
}
}

Tips:

 

1、首先要拖拽的物体必须加上了Collider组建。然后在物体的Inspector视窗中点击Add Component-(最下边)New Script,Name填mouseDrag,Language选CSharp,点击Creat and Add。创建完双击Mouse Drag组建中的Script文件,打开以后把上边代码全部替换过去,保存。

 

2、如何设置地面层:

选中地面,在Inspector视窗最上边有Tag和Layer下拉菜单,点击Layer,选择一个层,然后点Add Layer确认你的层编号。如果是第10层,则把代码中的LayerMask mask=1<<8;改成LayerMask mask=1<<10;

 

3、假如想要拖动的是角色,并且改变角色朝向和切换行走动画,就把void OnMouseDrag()这行和后边大括号里的东西全部替换为

void OnMouseDrag()
{
//取射线与地面相碰的坐标,赋给mouseMove,再把mouseMove的x坐标和z坐标赋给物体,y坐标不变(因为是贴在地面上移动)
Physics.Raycast (clickRay ,out posPoint,Mathf.Infinity,mask.value);
Vector3 mouseMove=posPoint.point;
//令角色朝向行走方向
transform.LookAt(new Vector3 (mouseMove.x, transform.position.y, mouseMove.z));
transform.position = (new Vector3 (mouseMove.x, transform.position.y, mouseMove.z));
//播放行走动画,引号里改成你自己的动画名称
animation.CrossFade("walk");
return;
}

void OnMouseUp()
{
//鼠标松开时回到待机悬停动画,引号里改成你自己的动画名称
animation.CrossFade ("idle");
return;
}

请注意一下要把动画名称改成自己的,而且更改后大括号不要少写了。

自己改了一下功能。拖动物体不超过指定范围

using UnityEngine;
using System.Collections;

public class MosMove : MonoBehaviour
{

    //声明从鼠标发出一条射线clickRay
    Ray clickRay;

    //声明clickRay与游戏物体的碰撞
    RaycastHit clickPoint;

    //声明clickRay与地面的碰撞
    RaycastHit posPoint;
    //设置地面层,我的地面层是第8层,所以是8。不会设置层的话请看下边的Tips。
    LayerMask mask = 1 << 8;
    void Start()
    {

    }

    void Update()
    {

        clickRay = Camera.main.ScreenPointToRay(Input.mousePosition);
    }
    void OnMouseDown()
    {
        //如果射线与物体相碰,则调用OnMouseDrag()
        if (Physics.Raycast(clickRay, out clickPoint))
        {
            OnMouseDrag();
        }
    }
    void OnMouseDrag()
    {
        //取射线与地面相碰的坐标,赋给mouseMove,再把mouseMove的x坐标和z坐标赋给物体,y坐标不变(因为是贴在地面上移动)
        Physics.Raycast(clickRay, out posPoint, Mathf.Infinity, mask.value);
        Vector3 mouseMove = posPoint.point;
        if (mouseMove != Vector3.zero)
        {
            Debug.Log(mouseMove);
            //令角色朝向行走方向
            transform.LookAt(new Vector3(mouseMove.x, transform.position.y, mouseMove.z));
            transform.position = (new Vector3(mouseMove.x, transform.position.y, mouseMove.z));
        }      
        //播放行走动画,引号里改成你自己的动画名称
       //animation.SetBool("isRun", true);
        
    }

    
}