操作物体任意方向旋转的三种方法

方法一:

private Transform hitTransfrom;
          
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        RaycastHit hit;
        Ray mouseray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(mouseray, out hit))
        {
            hitTransfrom = hit.transform;
        }
    }
    else if (Input.GetMouseButtonUp(0))
    {
        hitTransfrom = null;
    }
    if (hitTransfrom)
    {
        Matrix4x4 localmatrix = hitTransfrom.worldToLocalMatrix;
        Vector3 vUp = localmatrix.MultiplyVector(new Vector3(0, 1, 0));
        Vector3 vRight = -localmatrix.MultiplyVector(new Vector3(1, 0, 0));
        float fMoveX = -Input.GetAxis("Mouse X") * Time.deltaTime * 200.0f;
        Quaternion rotation = Quaternion.AngleAxis(fMoveX, vUp);
        hitTransfrom.localRotation *= rotation;
        float fMoveY = -Input.GetAxis("Mouse Y") * Time.deltaTime * 200.0f;
        Quaternion rotoy = Quaternion.AngleAxis(fMoveY, vRight);
        hitTransfrom.localRotation *= rotoy;
    }
}

方法二:

using UnityEngine;
using System.Collections;
        
public class DragRotate : MonoBehaviour
{
    void OnMouseDrag ()
    {
        this.transform.Rotate(new Vector3(Input.GetAxis("Mouse Y"),-Input.GetAxis("Mouse X"),0)*6f,Space.World);
    }
        
}

方法三:

using UnityEngine;
using System.Collections;
    
public class DragRotate : MonoBehaviour
{
    private bool onDrag = false;
    public float speed = 6f;
    private float tempSpeed;
    private float axisX;
    private float axisY;
    void OnMouseDrag ()
    {
        onDrag = true;
        axisX=-Input.GetAxis ("Mouse X");
        axisY=Input.GetAxis ("Mouse Y");
    }
        
    float Rigid ()
    {
        if (onDrag) {
            if (tempSpeed < speed) {
                tempSpeed += speed * Time.deltaTime*5;
            }else{
                tempSpeed=speed;
            }
        } else {
            if(tempSpeed>0){
                tempSpeed-=speed * Time.deltaTime;
            }else{
                tempSpeed = 0;
            }
        }
        return tempSpeed;
    }
        
    void Update ()
    {
        this.transform.Rotate (new Vector3 (axisY, axisX, 0) * Rigid (), Space.World);
        if (!Input.GetMouseButton (0)) {
            onDrag = false;
        }
    }
}

另外加入了缩放的代码,缩放、自动旋转、拖拽物体的综合:

using UnityEngine;
using System.Collections;
 
 

public class ZoomAndDrag : MonoBehaviour {
 
 
    public Camera MainCamera;
    public float ZoomMin;      //滚轮的最小值
    public  float ZoomMax;      //滚轮的最大值
    private float normalDistance;   //设置摄像机的景深值
    private float MouseWheelSencitivity = 10.0f;    //鼠标灵敏度,就是缩放的速度的快慢
 
    private float axisX;
    private float axisY;
    public float speed = 6f;
    private float tempSpeed;
 
    private bool RoationOnly;
 
    void Start () 
    {
        normalDistance = 50.0f;
        ZoomMin = 20.0f;
        ZoomMax = 100.0f;
        RoationOnly = true;
    }
     
     
    void Update () 
    {
        Roation();
        Zoom();
        this.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World);     //物体旋转的方法
    }
 
 
    //自动旋转物体的方法,放在Update中调用
    void Roation()
    {
        if (RoationOnly)
        {
            gameObject.transform.Rotate(Vector3.up * Time.deltaTime * 10);
        }
    }
 
    /****
    *鼠标滚轮缩放物体的方法
     * 
     * **/
    void Zoom()
    {
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            if (normalDistance >= ZoomMin && normalDistance <= ZoomMax)
            {
                normalDistance -= Input.GetAxis("Mouse ScrollWheel") * MouseWheelSencitivity;
            }
            if (normalDistance < ZoomMin)
            {
                normalDistance = ZoomMin;
            }
            if (normalDistance > ZoomMax)
            {
                normalDistance = ZoomMax;
            }
 
            MainCamera.fieldOfView = normalDistance;
        }
    }
  /***
   * 
   * 鼠标左键控制物体360°旋转+惯性
   * **/
    float Rigid()
    {
        if (Input.GetMouseButton(0))
        {
            RoationOnly = false;    //当鼠标按下的时候,停止自动旋转
 
            axisX = Input.GetAxis("Mouse X");
            axisY = Input.GetAxis("Mouse Y");
            if (tempSpeed < speed)
            {
                tempSpeed += speed * Time.deltaTime * 5;
            }
            else
            {
                tempSpeed = speed;
            }
        }
        else
        {
            RoationOnly = true;     //当鼠标没有按下的时候,恢复自动旋转
            if (tempSpeed > 0)
            {
                tempSpeed -= speed * Time.deltaTime;
            }
            else
            {
                tempSpeed = 0;
            }
        }
        return tempSpeed;
    }
}


你可能感兴趣的:(鼠标拖拽,缩放物体)