今天做完了项目,交给了甲方,但是甲方给出的需求调整很无语。。。之前是点击之后播放动画,现在变成了需要用鼠标移动物体到播放动画的物体上触发,例如:手术刀。。。
移动手术刀到患者身上指定位置之后,播放手术刀动画。。。。
有点坑。。。整体逻辑变了。。。。
中间比较核心的是鼠标和物体的世界坐标以及屏幕坐标的转换,这一点有点难受。。研究了一下,参考了一些大佬的文章,写了一个拖拽物体的脚本出来,触发就不列出来了,比较简单
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;
}
}
}
|