本日プロジェクトを終了し、A社に引き渡しましたが、A社からの需要調整は非常に言葉を失います。. . 以前はクリック後にアニメーションが再生されていましたが、メスなどのアニメーションを再生しているオブジェクトにマウスでオブジェクトを移動してトリガーする必要があります。. .
メスを患者の指定された位置に移動した後、メスのアニメーションを再生します。. . .
ちょっとした落とし穴です。. . 全体的なロジックが変更されました。. . .
真ん中の核となるのは、マウスとオブジェクトのワールド座標と、画面座標の変換です。これは少し不快です。. 調べて大物の記事を参考にして、マウスを使ってオブジェクトをドラッグ&ドロップするスクリプトを書きましたが、トリガーは記載されておらず、比較的シンプルです。
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;
}
}
}