我有一个脚本,可以使用它在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?
答案 0 :(得分:1)
您可以看看RectTransform
:
发生的事情是,如果要移动UI元素,则该元素将相对于其父Canvas对象而移动。
它的位置是“画布”区域上的Vector2。
即使是放置在3D空间中,它也是2D元素。
另外,请注意以下事实:它的位置也相对于其在画布上的锚点(anchoredPosition
)来定义:
如果您想像常规场景中的其他GameObject一样操作Canvas,可以将Canvas作为其Transparent。
答案 1 :(得分:0)
如果您愿意,可以将Canvas作为常规GameObject下的父对象 像处理任何其他GameObject一样操作它的Transform 在现场
这是一个好主意,但我也必须向空对象添加3D碰撞器,2D碰撞器不起作用(并且仍然不明白为什么)