Unity中的平移 缩放 旋转

简介: Unity中的平移 缩放 旋转 1.最近想实现Unity中的平移 缩放 旋转功能, 类似于Unity编辑器状态下的效果.尝试了好几个方式,效果都有瑕疵,网友们谁有好的实现方式,请教我. 下面是我的一种实现方式: using System.

Unity中的平移 缩放 旋转

1.最近想实现Unity中的平移 缩放 旋转功能, 类似于Unity编辑器状态下的效果.尝试了好几个方式,效果都有瑕疵,网友们谁有好的实现方式,请教我.
下面是我的一种实现方式:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 本脚本实现场景的平移,缩放,旋转功能
/// 初始状态,要求场景所有模型对象(不包括摄像机)有一个父对象,并且此父对象的坐标为世界坐标系原点
/// 初始状态,摄像机位置为(0,0,-10),并朝向世界坐标系原点。
/// 平移功能:场景对象在世界坐标系的XY平面移动。
/// 缩放功能:摄像机沿着世界坐标系的Z轴方向,前后移动。
/// 旋转功能:场景对象绕自身坐标系的X轴和Y轴旋转。
/// </summary>
public class DragRotateScale : MonoBehaviour {
    //场景对象
    public Transform scene;
    //镜头与目标距离
    public float camTarDistance = 2.0f, camTarDistanceMin = 2.0f, camTarDistanceMax = 30.0f;
    //拖拽灵敏度
    public float dragSensitive = 1.0f;
    //旋转灵敏度
    public float rotateSensitive = 10.0f;
    //缩放灵敏度
    public float scaleSensitive = 5.0f;
    //双击选中间隔系数
    public float selectedSensitive = 4.0f;
    //阻尼参数及系数
    public bool needDamping = true;
    private float dampingScale = 5.0f;
    //鼠标移动分量
    private float camEulerX, camEulerY;
    private Quaternion camRotation;
    private Vector3 camPosition;
    //鼠标右键上一次点击时间
    private float firstClickTime = 0;
    /// <summary>
    /// 双击鼠标右键,选中场景中心
    /// 使摄像机回到初始位置
    /// </summary>
    void SlectedCenter()
    {
        if (Input.GetMouseButtonDown(1))
        {
            if (firstClickTime != 0f && Time.realtimeSinceStartup - firstClickTime < 0.1f * 

selectedSensitive)
            {
                transform.position = new Vector3(0, 0, -10);
            }
            firstClickTime = Time.realtimeSinceStartup;
        }
    }
    /// <summary>
    /// 鼠标滚轮调整镜头与目标距离,实现缩放
    /// </summary>
    void ScrollWheelScale()
    {
        //调整镜头距离
        if (Mathf.Abs(Input.GetAxis("Mouse ScrollWheel")) > 0.02f)
        {
            camTarDistance = Input.GetAxis("Mouse ScrollWheel") * scaleSensitive;
            camPosition = new Vector3(transform.position.x, transform.position.y, transform.position.z 

+ camTarDistance);
            transform.position = Vector3.Lerp(transform.position, camPosition, Time.deltaTime * 

dampingScale);
        }
    }
    /// <summary>
    /// 鼠标右键旋转场景
    /// </summary>
    void RightDownRotate()
    {
        if (Input.GetMouseButton(1))
        {
            camEulerX += Input.GetAxis("Mouse X") * rotateSensitive;
            camEulerY += Input.GetAxis("Mouse Y") * rotateSensitive;

            Quaternion targetRotation = scene.rotation;

            targetRotation = Quaternion.Euler(camEulerY, -camEulerX, 0.0f);
            scene.rotation = targetRotation;
        }

    }
    /// <summary>
    /// 鼠标左键拖拽场景,实现场景平移(摄像机反向移动)
    /// </summary>
    void LeftDownDrag()
    {
        if (Input.GetMouseButton(0))
        {
            float horizontal = -Input.GetAxis("Mouse X") * dragSensitive;
            float vertical = -Input.GetAxis("Mouse Y") * dragSensitive;

            transform.Translate(new Vector3(horizontal, vertical, 0.0f));
        }
    }

    void Start()
    {
        //初始化参数
        camRotation = transform.rotation;
        camPosition = transform.position;
        Vector3 angles = transform.eulerAngles;
        camEulerX = angles.y;
        camEulerY = angles.x;
    }

    void Update()
    {
        LeftDownDrag();
        RightDownRotate();
        ScrollWheelScale();
        SlectedCenter();
    }
}
原文地址http://www.bieryun.com/2473.html
相关文章
|
3月前
|
图形学
Unity精华☀️一、从旋转到万向锁之:Unity的旋转
Unity精华☀️一、从旋转到万向锁之:Unity的旋转
|
3月前
|
图形学
小功能⭐️Unity动态更换天空盒、旋转天空盒
小功能⭐️Unity动态更换天空盒、旋转天空盒
【Unity3D--自由观察模型】模型自动旋转+触屏旋转和缩放
展示3D模型,同时实现模型自动旋转和触屏旋转和缩放
384 0
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
398 0
|
图形学
Unity 之 获取物体的旋转角正确数值
不管父物体如何设置,都能获取到物体本身旋转角度的正确数值
1060 0
|
图形学
Unity3D旋转
Unity3D旋转
133 0
鼠标控制物体旋转、移动、缩放(Unity3D)
Unity3D对于鼠标操作物体的旋转、移动、缩放的功能点使用的比较多。 今天就分享如何使用Unity实现鼠标对于物体的旋转、移动、缩放。
|
图形学
Unity在UI界面上显示3D模型/物体,控制模型旋转
Unity3D物体在UI界面的显示 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —...
5152 0
Unity-移动旋转
move CharacterController:Rigidbody:AddForce,MovePositionTranslate:不检测碰撞rotate Rotation:Rigidbody:MoveRotation示例 王者荣耀式: using System.
1108 0
|
API C#
Unity常用旋转API
Unity中的旋转通常可以用Transform 直接控制和 rotation 控制两种方式。 一、Transform控制(工程中的scene1) 1.1 Transform.Rotate 旋转某个角度 函数定义 [csharp] view plain copy public void Rotate...
11706 0