c# - 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?
解决方案
你可以看看RectTransform
:
发生的情况是,如果您想移动 UI 元素,则该元素会相对于其父 Canvas 对象进行移动。
它的位置是画布区域上的 Vector2。它是一个 2D 元素,即使它被放置在 3D 空间中。另外,请注意它的位置也是相对于 Canvas 上的 Anchor ( anchoredPosition
) 定义的:
如果您想像处理场景中的任何其他游戏对象一样操作它的变换,您可以在常规游戏对象下设置 Canvas 的父级。
推荐阅读
- wordpress - 如何在 wordpress 页面上创建单独的部分
- c# - 为什么第一次 GetAccessControl 函数很慢?
- php - Opencart 3.x 为“主页搜索”和“管理页面”生成 SEO 友好的链接
- typo3 - 如何为 tx-news 中的自定义字段翻译选择框“排序依据”的标签
- java - 即使安装了 java 11,Java Runtime 也只能识别最高 52.0 的类文件版本
- python - 在 mat2py 如何修复错误 AttributeError: 'numpy.ndarray' object has no attribute 'get_svm_type'
- reactjs - 我如何将数据从这里传输到这里
- angular - 渲染列表项时显示无穷大的点
- java - 什么是在对象中只允许一个非空字段的好方法
- jvm - 将 Spring Boot 应用程序部署到 Cloud Foundry 失败并出现 JVM 内存问题