Unity 拖拽3D物体到固定位置

版权声明:记录上工作中的一些问题 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 
 

猜你喜欢

转载自blog.csdn.net/m0_37583098/article/details/84652417
今日推荐