您的位置:首页 > 产品设计 > UI/UE

关于3D物体坐标转换为UI坐标,随着鼠标拖拽等操作

2016-10-22 01:05 501 查看
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class threeto2D : MonoBehaviour,IPointerClickHandler,IDragHandler
{
public GameObject cube;
public Camera MainCarema;
public Camera uiCarema;//canvas为camera模式下的摄像机,深度值较大,depthonly
public Canvas canvas;
public RectTransform rect;
Vector2 poss;
void Start() {
// rect = transform as RectTransform;

if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, Input.mousePosition, canvas.GetComponent<Camera>(), out poss))
{
Debug.Log(poss);
}

}
// Update is called once per frame
void Update ()
{
#if true
//UnityEngine.EventSystems.EventTrigger
// unity版本用的5.3.5f. cas.planeDistance  : 找到原因了,uicarema需要设置成为正交模式,否则,则需要改变cas.planeDistance。
#region canvas 摄像机模式,两种效果相同
//Vector3 pos1 = MainCarema.WorldToScreenPoint(cube.transform.position);
//transform.position = uiCarema.ScreenToWorldPoint(pos1);

Vector3 pos = MainCarema.WorldToViewportPoint(cube.transform.position); //主摄像机将cube转为视口坐标
transform.position = uiCarema.ViewportToWorldPoint(pos); // ui摄像机再将视口坐标转为世界坐标(有疑问,后续再解释)
#endregion
#region 单独主摄像机,UI over模式
////单独一个主摄像机,可以直接将3D坐标转为UI坐标进行重叠。canvas 是over模式 Z轴坐标小于0后出现BUG
////也就是3D物体在camera后面 出现BUG,所以注意判断Z轴坐标,是否显示在camera面前。
//建议这种情况最好还是用world模式
//transform.position= MainCarema.WorldToScreenPoint(cube.transform.position);//也可以直接用世界坐标转为屏幕坐标
#endregion
canvas.planeDistance = cube.transform.position.z;//如果是两个摄像机,则需要动态改变planedistance,改变后重置为0.
pos = transform.localPosition;
//pos.x += mOffset.x;
//pos.y += mOffset.y;
pos.z = 0; // Z轴注意置为0,否则大小不对
transform.localPosition = pos;
#else
//if (Input.GetMouseButton(0))
//{
//    //拿Canvas 需要ui组件中心点和锚点都在中间,否则无法随着鼠标位置点击拖动
//    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, Input.mousePosition, uiCarema, out poss))
//    {
//        Debug.Log(poss);
//    }
//    rect.anchoredPosition = poss;
//}
#endif
}
public void OnPointerClick(PointerEventData eventData)
{

}
//根据鼠标位置拖拽图标
public void OnDrag(PointerEventData eventData)
{
//第一个参数是拖拽中心点(The RectTransform to find a point inside.),
//给的Canvas 需要ui组件中心点和锚点都在中间,否则无法随着鼠标位置点击拖动
// 第二个参数是点击位置(屏幕坐标转位UI坐标)
//,第三个参数是摄像机,canvas over模式可以直接给null,camera模式给当前uicamera。或者直接如下写。
//经过测试发现eventdata.enterEnventCamera图片会突然跑到外面去,必须按照当前carema模式给,可能是Uunity的BUG。
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, eventData.position, eventData.enterEventCamera, out poss))
{
Debug.Log(poss);
}
rect.anchoredPosition = poss;
}
}



/*之所以要这个东西,列如新手引导,就需要指引点击3D物体。还有一点

RectTransformUtility.ScreenPointToLocalPointInRectangle这个函数随着touch位置可以显示ui特效之类的。


这里在增加一个知识点,unity.engine.destroy  和object.destroy 完全不一样,写接口的时候需要注意

然后新手引导高量一个按钮,则可以使用 canvas(sortingorder需要比0大) + graphic raycaster(在被面板中高层级物体遮挡后)。 */


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: