簡體   English   中英

Unity-將Canvas作為3D GameObject移動

[英]Unity - Move Canvas as a 3D GameObject

我有一個腳本,可以使用它在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;
        }
    }
}

如果我單擊已創建的任何對象(帶有對撞機),則可以在屏幕上自由移動該對象。 不幸的是,如果對象是World Space UI(canvas),則不會發生這種情況。 任何人都可以給我一些提示,並告訴我為什么我無法移動空間UI?

您可以看一下RectTransform

發生的事情是,如果您要移動UI元素,則該元素將相對於其父Canvas對象進行移動。

它的位置是“畫布”區域上的Vector2。 即使是放置在3D空間中,它也是2D元素。 另外,請注意,它的位置也相對於其在畫布上的錨點( anchoredPosition )進行了定義:

如果要操縱畫布的“變形”,就可以像在場景中其他任何GameObject一樣將Canvas作為父對象。

您可以將Canvas作為常規GameObject下的父對象,如果要像場景中其他任何GameObject一樣操作它的Transform,

這是一個好主意,但我也必須向空對象添加3D碰撞器,2D碰撞器無法正常工作(並且仍然不明白為什么)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM