前提说明,后面自己有改了一下
网上的很多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);
}
}