在UI上面显示模型或者特效,是使用RenderTexture来实现的 。(自己的笔记)
- 用一个新的摄像机单独照向特效 和人物(之后用模型代替)-,可以设置摄像机的CullingMask,让相机中只能看见需要展示的模型。相机可以设置为正交模式,将size设置为能将生成的模型包含,将Clipping Planes的Far值设置小点, 使得Camera的范围为一个立方体,将展示的模型生成在这里或者拖入其中。
- 创建一张RenderTexture ( RT),在Camera的TargetTexture中引用该图片
- 在需要展示的界面上创建一个Image,去掉Image组件,挂一个RawImage,将RT引用至RawImage的Texture处。
通过拖拽旋转模型
- 可以在展示模型的Image下面创建一个Image,透明度设置为0, 设置好拖拽区域。新建这个image 主要是一般的拖拽区域都会大于展示模型的区域。然后在子物体上挂个脚本,脚本中通过拖拽判断鼠标位移,从而赋值旋转
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; public class HKEventListener:MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler { private GameObject Obj; private float axisX; private Vector3 StartRotate; private Vector3 prePos; private Vector3 nowPos; private void Start() { if (GuardCrystalLogic.Instance.HeroHead != null) { Obj = GuardCrystalLogic.Instance.HeroHead.gameObject; StartRotate = Obj.transform.localEulerAngles; prePos = Vector3.zero; } } //在fixed中是不通过UGUI做的旋转,实现的是全屏旋转 //void FixedUpdate() //{ // nowPos = Input.mousePosition; // if (Input.GetMouseButton(0)) // { // if (Mathf.Abs(nowPos.x - prePos.x) > 0) // { // axisX = -(nowPos.x - prePos.x) * Time.deltaTime * 30; // } // else // { // axisX = 0; // } // Obj.transform.Rotate(new Vector3(0, axisX, 0), Space.Self); // } // else // { // axisX = 0; // } // // 记录上次鼠标位置 // prePos = Input.mousePosition; //} public void OnBeginDrag(PointerEventData eventData) { } // 拖拽中每一帧都会判断鼠标X方向的位移,然后旋转 public void OnDrag(PointerEventData eventData) { if (Obj == null) { return; } nowPos = eventData.position; if (Mathf.Abs(nowPos.x - prePos.x) > 0) { axisX = -(nowPos.x - prePos.x) * Time.deltaTime * 30; } else { axisX = 0; } Obj.transform.Rotate(new Vector3(0, axisX, 0), Space.Self); // 记录上次鼠标位置 prePos = eventData.position; } public void OnEndDrag(PointerEventData eventData) { } /// <summary> /// 还原模型的旋转 /// </summary> public void RestoreRotate() { if (Obj != null) { Obj.transform.localEulerAngles = StartRotate; } } }