【Unity】鼠标移动物体到某个物体上进行触发

今天做完了项目,交给了甲方,但是甲方给出的需求调整很无语。。。之前是点击之后播放动画,现在变成了需要用鼠标移动物体到播放动画的物体上触发,例如:手术刀。。。

移动手术刀到患者身上指定位置之后,播放手术刀动画。。。。

有点坑。。。整体逻辑变了。。。。

中间比较核心的是鼠标和物体的世界坐标以及屏幕坐标的转换,这一点有点难受。。研究了一下,参考了一些大佬的文章,写了一个使用鼠标拖拽物体的脚本出来,触发就不列出来了,比较简单

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chufa : MonoBehaviour {
	private Camera Camera_Ray;//发射射线的相机
	private GameObject go;//射线碰撞的物体
	public static string Obj_Name;//射线碰撞物体的名字 (这一块是看到一个大佬用的)

	private Vector3 Point_Obj;//物体在屏幕上的坐标
	private Vector3 offset;//差值

	private bool isDrage = false;
	// Use this for initialization
	void Start () {
		Camera_Ray = Camera.main;
	}
	
	// Update is called once per frame
	void Update () {
		DragObj();
	}
	private void DragObj()
	{
        Ray ray = Camera_Ray.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (isDrage==false)
        {
            if (Physics.Raycast(ray,out hit))
            {
				go = hit.collider.gameObject;

				//把物体的世界坐标转换为屏幕坐标
				Point_Obj = Camera_Ray.WorldToScreenPoint(go.transform.position);

				//获得物体世界坐标和鼠标在世界中坐标的差值(鼠标的坐标提前转换为世界坐标)
				offset = go.transform.position - Camera_Ray.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y,Point_Obj.z));

				//名称显示出来
				Obj_Name = go.name;
            }
            else
            {
				Obj_Name = null;
            }
        }
        if (Input.GetMouseButton(0))
        {
			Vector3 cameraScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y,Point_Obj.z);
			Vector3 objPosition = Camera_Ray.ScreenToWorldPoint(cameraScreenSpace)+offset;

            if (Obj_Name!=null)
            {
				go.transform.position = objPosition;
            }
			isDrage = true;
        }
        else
        {
			isDrage = false;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/CSDN_6954/article/details/120844849