首页 > 解决方案 > Unity - 将画布作为 3D 游戏对象移动

问题描述

我有一个脚本,我可以使用它移动(在 2 轴上)任何 3D 对象,我正在使用的脚本是这个(用于鼠标和触摸屏)

using UnityEngine;
public class DragInput : MonoBehaviour {



    GameObject gObj = null;
    Plane objPlane;
    Vector3 mO;
    Camera cam;

    void Awake() {
        cam = GameObject.FindGameObjectWithTag("MyCamera").GetComponent<Camera>();
    }
    Ray GenerateMouseRay()
    {
        Vector3 mousePosFar = new Vector3(Input.mousePosition.x,Input.mousePosition.y,cam.farClipPlane);
        Vector3 mousePosNear = new Vector3(Input.mousePosition.x,Input.mousePosition.y,cam.nearClipPlane);
        Vector3 mousePosF = cam.ScreenToWorldPoint(mousePosFar);
        Vector3 mousePosN = cam.ScreenToWorldPoint(mousePosNear);

        Ray mr = new Ray(mousePosN, mousePosF-mousePosN);
        return mr;
    }

    // Update is called once per frame
    void Update () 
    {
        if(Input.GetMouseButtonDown(0))
        {
            Ray mouseRay = GenerateMouseRay();
            RaycastHit hit;

            if (Physics.Raycast(mouseRay.origin, mouseRay.direction, out hit))
            {
                gObj = hit.transform.gameObject;
                objPlane = new Plane(cam.transform.forward*-1, gObj.transform.position);

                //calc mouse offset
                Ray mRay = cam.ScreenPointToRay(Input.mousePosition);
                float rayDistance;
                objPlane.Raycast(mRay, out rayDistance);
                mO = gObj.transform.position - mRay.GetPoint(rayDistance);
            }
        }
        else if(Input.GetMouseButton(0) && gObj)
        {
            Ray mRay = cam.ScreenPointToRay(Input.mousePosition);
            float rayDistance;
            if (objPlane.Raycast(mRay, out rayDistance))
                gObj.transform.position = mRay.GetPoint(rayDistance) + mO;
        }
        else if (Input.GetMouseButtonUp(0) && gObj)
        {
            gObj = null;
        }
    }
}

如果我单击我创建的任何对象(使用盒子对撞机),我可以在屏幕上自由移动该对象。不幸的是,如果对象是世界空间 UI(画布),则不会发生这种情况。任何人都可以给我一些提示并告诉我为什么我无法移动空间 UI?

标签: c#unity3dcanvas

解决方案


你可以看看RectTransform

发生的情况是,如果您想移动 UI 元素,则该元素会相对于其父 Canvas 对象进行移动。

它的位置是画布区域上的 Vector2。它是一个 2D 元素,即使它被放置在 3D 空间中。另外,请注意它的位置也是相对于 Canvas 上的 Anchor ( anchoredPosition) 定义的:

如果您想像处理场景中的任何其他游戏对象一样操作它的变换,您可以在常规游戏对象下设置 Canvas 的父级。


推荐阅读