关于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(在被面板中高层级物体遮挡后)。 */
相关文章推荐
- Unity 鼠标点击位置转换成UI坐标
- Unity中UGUI中获取鼠标点击位置以及UI物体的屏幕坐标
- Unity 3D鼠标操作实现旋转、缩放观察物体
- 当鼠标进入3D物体 弹出UI 跟随鼠标
- 关于“绕坐标轴的旋转”和“鼠标控制物体的旋转”(二)
- Unity简单利用屏幕坐标转换实现鼠标控制物体移动
- UGUI--------UI以及3D物体显示在鼠标点击位置
- Unity 3D物体的点击事件响应以及NGUI坐标和世界坐标的互相转换
- #713 – 在拖拽操作中使用控件预览图作为鼠标(Setting the Cursor to an Image of an UIElement While Dragging)
- 关于“绕坐标轴的旋转”和“鼠标控制物体的旋转”(一)
- 关于线的操作,这个做个记录 返回点坐标。
- 跟踪球 鼠标旋转3D物体
- 关于经纬度坐标转换的方法
- 的在opengl下从鼠标坐标转换到三维坐标的方法
- 关于逻辑坐标和设备坐标的转换
- android使用遥控器模拟鼠标拖拽操作
- WPF 3D 获取鼠标在场景的3d坐标
- 关于鼠标事件坐标位置的几个概念
- 关于内存和指针操作,数据类型转换本质的理解
- 实现一个类似3dmax那样的鼠标移动物体操作