TheLudGamer 发表于 2022-3-30 13:41

Unity 实现在UI层上控制模型旋转、缩放展示功能

先来讲讲我们为何要实现这个功能。目前市面场上大部分游戏都会有的一个功能,比如王者荣耀就有英雄模型3D展示效果,我们可以通过手指滑动屏幕看到模型的每个方向,让玩家可以更加直观的感受这个英雄,那么我们要怎么实现这个效果呢?
   当然实现这种效果的方法有很多种,这里我就说下我的方法。
1.首先在场景中新建一个相机,然后相机的配置如下图所示,其他参数根据自身需要,其中Target Texture 字段需要在Assets目录下新建一个Render Texture,然后把他拖进相机里。


这个操作的目的就是让模型可以展示在UI层上,最后我们把相机的Z轴坐标改成-10,相机的基本配置就弄好了。
2.现在我们就需要新建一个脚本来控制模型旋转以及缩放。检测拖动操作的话在LateUpdate里面操作,这样看起来拖动操作会比较平滑一点。废话不多说直接上代码吧
public class UIShowCameraModer : MonoBehaviour
{
    public Transform model;      //当前需要展示的模型
    public float distance = 10.0f;   //模型距离相机的距离
    public float minDistance = 3f;    //最小距离
    public float maxDistance = 18f;    //最大距离
    public float x_Speed = 200.0f;   //X轴方向的旋转速度
    public float y_Speed = 200.0f;    //Y轴方向的旋转速度
    public float zoomSpeed = 1f;   //缩放速度
    public bool isAllowYTilt = true;    //是否允许Y轴倾斜
    public float minYLimit = -90f;//Y轴最小倾斜角度
    public float maxYLimit = 90f; //Y轴最大倾斜角度
    private float xPoint = 0.0f;   //X轴坐标
    private float yPoint = 0.0f;//Y轴坐标
    private float xTargetPoint = 0f;//目标X轴坐标
    private float yTargetPoint = 0f; //目标Y轴坐标
    private float xVelocityPoint = 1f;//X水平轴坐标
    private float yVelocityPoint = 1f; //Y水平轴坐标
    private float zoomVelocity = 1f;
    public Vector3 pivotOffset = Vector3.zero; //位置偏移
    public float targetDistance;
    private void Start()
    {
      xTargetPoint = xPoint =transform.eulerAngles.x; //赋值
      yTargetPoint = yPoint = ClampAngle(angles.y, minYLimit , maxYLimit );
      targetDistance = distance;
    }

    private void LateUpdate()
    {
      if (!model) return;
      var scroll = Input.GetAxis("Mouse ScrollWheel");//获取鼠标滚轮值
      //根据鼠标滚轮的方向来确定模型于相机的距离
      if (scroll > 0.0f) targetDistance -= zoomSpeed;
      else if (scroll < 0.0f)
            targetDistance += zoomSpeed;
       //使用这个数学函数可以限制最大最小距离
      targetDistance = Mathf.Clamp(targetDistance, minDistance, maxDistance);
      if (Input.GetMouseButton(0))
      {
            xTargetPoint += Input.GetAxis("Mouse X") * x_Speed * 0.025f;
            if (isAllowYTilt )//Y轴是否可以旋转
            {
                yTargetPoint -= Input.GetAxis("Mouse Y") * y_Speed * 0.025f;
                yTargetPoint = ClampAngle(yTargetPoint , minYLimit , maxYLimit );
            }
      }
       //Mathf.SmoothDampAngle函数可以起到一个缓冲作用,好处就是拖动旋转的时候可以更加平滑
      xPoint= Mathf.SmoothDampAngle(xPoint , xTargetPoint , ref xVelocityPoint, 0.3f);
      yPoint = isAllowYTilt ? Mathf.SmoothDampAngle(yPoint, yTargetPoint , ref yVelocityPoint, 0.3f) : yTargetPoint ;
      //旋转角度设置
      Quaternion rotation = Quaternion.Euler(yPoint, xPoint, 0);
      distance = Mathf.SmoothDamp(distance, targetDistance, ref zoomVelocity, 0.4f);
      Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + model.position + pivotOffset;
       //坐标赋值
      transform.position = position;      
      transform.rotation = rotation;
    }
///获取旋转角度
    private static float ClampAngle(float angle, float min, float max)
    {
      if (angle < -360) angle += 360;
      if (angle > 360) angle -= 360;
      return Mathf.Clamp(angle, min, max);
    }
然后我们把需要展示的模型直接赋值给pivot就可以了,如果你当前的模型Z轴坐标是0的话可能游戏场景展示的时候会出现两个模型 ,解决方法,把Z轴坐标改大一点,直到看不见了就可以了。
页: [1]
查看完整版本: Unity 实现在UI层上控制模型旋转、缩放展示功能