找回密码
 立即注册
查看: 342|回复: 0

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

[复制链接]
发表于 2022-3-30 13:41 | 显示全部楼层 |阅读模式
先来讲讲我们为何要实现这个功能。目前市面场上大部分游戏都会有的一个功能,比如王者荣耀就有英雄模型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轴坐标改大一点,直到看不见了就可以了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 15:46 , Processed in 0.089367 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表