天天看点

UGUI在UI上显示模型和特效,并可以通过拖拽旋转模型

在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;
               
            }
        }
    
    
    
    }
               

继续阅读