在UGUI上显示3D模型,并限制范围的拖拽

通过RenderTexture实现

显示图片

记得在用NGUI的时候,就是用这种方式实现在UI上显示模型的。

首先新建一张RenderTexture,右键点击Project窗口,Create->Render Texture;

新建一个Shader ,将刚刚新建的RenderTexture 拖入Shader中。

  

在UGUI上显示3D模型,并限制范围的拖拽

新建一个Cube 和一个相机名为ModelCamera,这个相机专门用来对准模型,并将刚刚新建的RenderTexture拖入相机的TargetTexture中。

  

在UGUI上显示3D模型,并限制范围的拖拽

新建UI,将Canvas 的 RenderMode改为Camera,将Main Camera拖入Render Camera中。

新建一个Image命名为MaskImg,并添加脚本Mask,用于遮罩,并设置Image的SourceImage为UIMask

  

在UGUI上显示3D模型,并限制范围的拖拽

在MaskImg新建子物体Image,用于展示模型。然后将新建的 Shader拖入Image上。如下图,此时就已经看到模型的一面在Image上显示出来了。

  

在UGUI上显示3D模型,并限制范围的拖拽

但是会发现,颜色不对,此时将Shader改为”UI/Default“就可以了。旋转模型会发现Image上的模型会同步旋转。

  

在UGUI上显示3D模型,并限制范围的拖拽

有限制的拖拽

   拖拽图片,通过UGUI的OnDrag函数来获取鼠标的世界坐标,赋值给图片即可。

  限制,要求Image必须在Mask中显示,拖出视野外后自动回到视野内。这就需要在Mask的上下左右设置限制位置,当图片超过限制并且松开拖拽后,计算位置自动返回到视野内。

  添加限制,在MaskImg上新建子物体 Limit ,并设置Anchor

  

在UGUI上显示3D模型,并限制范围的拖拽

  在Limit下新建四个子物体,作为上下左右的限制。Left的Anchor为Left-middle,POS为(0,0,0),其他同理,Right为Right-midle,Top为Center-Top,Bottom为center-Bottom

  

在UGUI上显示3D模型,并限制范围的拖拽

  缩放,通过获取滚轮的滑动实现缩放,添加上下限,并且注意移动限制里面需要将缩放的系数也计算其中。

  旋转,计算鼠标滑动的X轴和Y轴,给Cube赋值旋转。

  代码如下

  首先添加一个UIEventListener脚本,用于监听UI的OnDrag事件

在UGUI上显示3D模型,并限制范围的拖拽

在UGUI上显示3D模型,并限制范围的拖拽

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; public class UIEventListener : UnityEngine.EventSystems.EventTrigger { public delegate void VoidDelegate(GameObject go); public delegate void VoidEventDelegate(PointerEventData eventData); public VoidDelegate onClick; public VoidEventDelegate onDrag; public VoidEventDelegate onBeginDrag; public VoidEventDelegate onEndDrag; static public UIEventListener Get(GameObject go) { UIEventListener listener = go.GetComponent<UIEventListener>(); if (listener == null) listener = go.AddComponent<UIEventListener>(); return listener; } public override void OnPointerClick(PointerEventData eventData) { if (onClick != null) onClick(gameObject); } public override void OnDrag(PointerEventData eventData) { //if (eventData.button == PointerEventData.InputButton.Left) if (onDrag != null) onDrag(eventData); } public override void OnBeginDrag(PointerEventData eventData) { if (eventData.button == PointerEventData.InputButton.Left) if (onBeginDrag != null) onBeginDrag(eventData); } public override void OnEndDrag(PointerEventData eventData) { if (eventData.button == PointerEventData.InputButton.Left) if (onEndDrag != null) onEndDrag(eventData); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfpfp.html