版权声明:记录上工作中的一些问题 https://blog.csdn.net/m0_37583098/article/details/84652417
Unity 拖拽3D物体到目标位置大体思路
1.监听鼠标的落下 拖拽 和松开 可以使用OnMouseDown OnMouseDrag OnMouseUp
2 设定目标地点 高亮显示 (使用了高亮插件)
3 拖拽物体跟随鼠标移动 在OnMouseDrag中使用 this.transform.position = new Vector3(hit.point.x, hit.point.y + height, hit.point.z);
是物体一直跟随在鼠标
上代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCube : MonoBehaviour
{
public LayerMask layerMask;//鼠标射线可移动的范围
public Camera cam;//摄像机
public Transform oldTrans; //物体原来的位置
public float moveTime;
public float height;//移动物体距离鼠标的高度
private Ray ray;
private RaycastHit hit;
void Start()
{
}
//鼠标落下
void OnMouseDown()
{
AwakeMove();
//高亮目标地点
HightOpen(this.gameObject.name);
}
//开始拖拽
void OnMouseDrag()
{
StartMove();
}
//鼠标松开
void OnMouseUp()
{
IsArrive();
HightClose(this.gameObject.name);
}
public void AwakeMove()
{
StopAllCoroutines();
}
public void StartMove()
{
ray = cam.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100, layerMask.value))
{
if (hit.collider.tag == "hightGameObject")//碰触目标物体
{
if (hit.collider.name == "离心杯")
{
this.gameObject.transform.position = hit.transform.position;
}
}
else
{
this.transform.position = new Vector3(hit.point.x, hit.point.y + height, hit.point.z);
}
}
}
/// <summary>
/// 目标物体高亮
/// </summary>
/// <param name="name"></param>
public void HightOpen(string name)
{
GameObject go = GameObject.Find("高亮物体_任务二").transform.Find(name).gameObject;
go.SetActive(true);
go.GetComponent<HighlightableObject>().FlashingOn(Color.green, new Color(0, 0, 0, 0));
}
/// <summary>
/// 关掉目标物体高亮
/// </summary>
/// <param name="name"></param>
public void HightClose(string name)
{
GameObject go = GameObject.Find("高亮物体_任务二").transform.Find(name).gameObject;
go.SetActive(false);
go.GetComponent<HighlightableObject>().FlashingOff();
}
/// <summary>
/// 返回原位置
/// </summary>
public void ReturnHomePosition()
{
if (this.gameObject.name == "离心杯")
{
this.gameObject.transform.position = oldTrans.position;
Debug.Log("返回原来位置");
}
}
/// <summary>
/// 判断是否到达目的点
/// </summary>
public void IsArrive()
{
ray = cam.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100, layerMask.value))
{
if (hit.collider.tag != "hightGameObject")
{
ReturnHomePosition();
}
}
else
{
ReturnHomePosition();
}
}
}
整体项目文件:链接:https://pan.baidu.com/s/1QhnedhlsC823FlAKtnkIew
提取码:3xkk
高亮物体插件:链接:https://pan.baidu.com/s/1RVsOYmPp3EJfUd3l06gwUg
提取码:rd76