2019-12-21 15:38:04 zhunju0089 阅读数 149

需求:制作一个鼠标中键移动缩放和鼠标右键旋转的功能(鼠标右键旋转可以自行改成鼠标左键旋转)

效果图:

1.新建一个名为Target的立方体cube

2.新建一个材质球 Yellow颜色的并挂载到Target立方体上

 

3.新建一个脚本 MatrixAction.cs

4.MatrixAction.cs代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MatrixAction : MonoBehaviour
{
    [Header("操作对象")]
    /// <summary>
    /// 操作对象
    /// </summary>
    public Transform m_target;
    void Start()
    {
        isDown1 = false;
        isDown2 = false;
    }
    /// <summary>
    /// 右键是否按下 
    /// </summary>
    private bool isDown1;

    /// <summary>
    /// 中键是否按下
    /// </summary>
    private bool isDown2;
    void Update()
    {
        // 按下了鼠标中键
        if (Input.GetMouseButtonDown(1))
            isDown1 = true;
        // 抬起了鼠标中键
        if (Input.GetMouseButtonUp(1))
            isDown1 = false;
        // 按下鼠标右键
        if (Input.GetMouseButtonDown(2))
            isDown2 = true;
        // 抬起了鼠标右键
        if (Input.GetMouseButtonUp(2))
            isDown2 = false;
        // 缩放 Input.mouseScrollDelta.y
        m_target.localScale += Time.deltaTime * m_target.localScale * Input.mouseScrollDelta.y;
    }
    private void LateUpdate()
    {
        if (isDown1)
        {
            // 计算单位时间内鼠标的偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            Vector3 rot = new Vector3(y, -x, 0);
            float spd = 10; //速度
            m_target.Rotate(spd * rot, Space.World);
        }
        if (isDown2)
        {
            // 计算单位时间内鼠标的偏移量
            float x = Input.GetAxis("Mouse X");
            float y = Input.GetAxis("Mouse Y");
            float spd = 0.4f;   //速度
            m_target.Translate(spd * new Vector3(x, y), Space.World);
        }
    }
}

5.新建一个Script空物体并将脚本MatrixAction.cs挂载上去,然后将Target拖拽到脚本上

6.为了Hierarchy层次更加清晰,新建几个空物体分隔各个组件 (可忽略)

2017-01-04 17:00:34 dickysun1987 阅读数 2282
using UnityEngine;  
using System.Collections;  

public class CubeRotate : MonoBehaviour  
{  

    Vector3 StartPosition;  
    Vector3 previousPosition;  
    Vector3 offset;  
    Vector3 finalOffset;  
    Vector3 eulerAngle;  

    bool isSlide;  
    float angle;  

    void Start()  
    {  

    }  


    void Update()  
    {
        if (Input.GetMouseButtonDown(0))  
        {  
            StartPosition = Input.mousePosition;  
            previousPosition = Input.mousePosition;  
        }  
        if (Input.GetMouseButton(0))  
        {  
            offset = Input.mousePosition - previousPosition;  
            previousPosition = Input.mousePosition;  
            transform.Rotate(Vector3.Cross(offset, Vector3.forward).normalized, offset.magnitude, Space.World);  
        }  
        if (Input.GetMouseButtonUp(0))  
        {  
            finalOffset = Input.mousePosition - StartPosition;  
            isSlide = true;  
            angle = finalOffset.magnitude;  
        }  
        if (isSlide)  
        {  
            transform.Rotate(Vector3.Cross(finalOffset, Vector3.forward).normalized, angle * 2 * Time.deltaTime, Space.World);  
            if (angle > 0)  
            {  
                angle -= 5;  
            }  
            else  
            {  
                angle = 0;  
            }  
        }  
    }  
}  
2014-11-28 16:21:34 z5976749 阅读数 1440

1.旋转部分

u3d中的一般旋转:
transform.Rotate(Vector3.back, 10f, Space.Self); 这是根据自身坐标轴做旋转,10f是旋转单位,同时这里的Space可以改成Space.World,变为根据世界坐标轴旋转
另外一种围绕旋转:
transform.RotateAround(GameObject.Find("Cube1").transform.position, Vector3.right, 5f);  在这里根据“Cube1" 物体的坐标进行围绕旋转,vector3.right是方向。

2.鼠标移动:

根据鼠标旋转,就是判断鼠标的移动方向与距离:
鼠标的位置:Vector3 vM1 = Input.mousePosition; 记录第一次的鼠标位置,第二次的鼠标位置减去第一次的位置就是移动的位置。
获取鼠标移动的X轴长度: float fLeft = vM2.x - vM1.x;
fLeft  > 0 则表示往世界坐标轴的X方向移动。

3.缓动效果:

给物体添加一个旋转,比如 transform.Rotate(Vector3.back, fSpeed, Space.Self); 
fSpeed初始值为0.5f,每一帧减去0.01f,则会出现旋转速度慢慢降低的效果。主要是在判断何时让他缓动比较麻烦。

4.其他:

物体隐藏方法:gameObject.SetActive(false);  在物体Active设置为false之后就不能通过GameObject.Find方法找到该物体了,以下方法可以解决:
GameObject go; 
 go = GameObject.Find("wuti");
这样就可以根据go对象来设置SetActive(false)之后再设置成true。如果根据这种方法给自身设置false则无用,因为设置为false之后脚本也停止运行了。

动画的播放与停止,判断是否结束:
播放:transform.animation.Play();  把动画放在物体上,这样就播放了。
停止:animation.Stop();
判断结束:(!(animation.IsPlaying("Take 001") && animation["Take 001"].normalizedTime < 1.0f))
animation.IsPlaying("Take 001") 表示是否在播放该动画
animation["Take 001"].normalizedTime < 1.0f) 表示是否还在第一次播放中,第二次播放则大于1f
倒播:  animation["Take 001"].speed = -1;  然后再play().

2013-09-02 15:03:34 ychl87 阅读数 4159

为了从不同角度观察物体,需要使用鼠标改变物体的位置及角度。

在unity3d中Input.GetMouseButton()获得鼠标键,Input.GetAxis()函数获得鼠标的移动的方向和距离,其中Mouse X表示X方向,Mouse Y表示Y方向,Mouse ScrollWheel表示中键滚动距离。

使用transform.Rotate()改变物体的旋转量,Space.World指定旋转的参考坐标系为世界坐标系;

	private float rotationX;
	private float rotationY;
	private float scaleRotationX = 5f;
	private float scaleRotationY = 5f;
	
	private float positionX ;
	private float positionY ;
	private float positionZ ;
	private float scalePosiontX = 0.1f;
	private float scalePosiontY = 0.1f;
	private float scalePosiontZ = 1f;
	
	void Update()
	{
		if(Input.GetMouseButton(1))  //右键改变x,y,z位置
		{
			positionX =Input.GetAxis("Mouse X") * scalePosiontX;	
			positionY = Input.GetAxis("Mouse Y") * scalePosiontY;	
			positionZ = -Input.GetAxis("Mouse ScrollWheel") * scalePosiontZ;
			transform.position += new Vector3(positionX,positionY,positionZ);
		}	
		else if(Input.GetMouseButton(2))	//中间改变旋转量
		{
			rotationX =-Input.GetAxis("Mouse X") * scaleRotationX;	
			rotationY =Input.GetAxis("Mouse Y") * scaleRotationY;	
			transform.Rotate(rotationY,rotationX,0f,Space.World);
		}		
	}



2019-05-15 16:13:10 q764424567 阅读数 2366

一、前言

以前转载了一篇关于在Unity3d中鼠标控制物体的旋转、移动、缩放的代码
然后发现错误比较多,就重新写了一个代码,自我感觉简单实用。。。特意分享出来供大家参考
原文章也贴出来吧
【Unity3d 鼠标滚动拉近模型、鼠标右键旋转模型、鼠标中键拖拽模型】
https://blog.csdn.net/q764424567/article/details/78630649

效果图:
在这里插入图片描述

二、知识点

  • Input.GetMouseButton(0)
    获取鼠标输入,参数为一个int值
    为0的时候获取的是左键

  • Input.GetMouseButton(1)
    为1的时候获取的是右键

  • Input.GetMouseButton(2)
    为2的时候获取的是中键(就是那个滑轮)

  • Input.GetMouseButton
    鼠标按压

  • Input.GetMouseButtonUp
    鼠标点击

  • Input.GetMouseButtonDown
    鼠标松开

  • Camera.main.ScreenToWorldPoint
    屏幕坐标转化为世界坐标

  • Quaternion rotation = Quaternion.Euler(0, 0, 0);
    欧拉角转化为四元数

三、代码分享

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseControlModel : MonoBehaviour
{
    //旋转最大角度
    public int yMinLimit = -20;
    public int yMaxLimit = 80;
    //旋转速度
    public float xSpeed = 250.0f;
    public float ySpeed = 120.0f;
    //旋转角度
    private float x = 0.0f;
    private float y = 0.0f;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            //将屏幕坐标转化为世界坐标  ScreenToWorldPoint函数的z轴不能为0,不然返回摄像机的位置,而Input.mousePosition的z轴为0
            //z轴设成10的原因是摄像机坐标是(0,0,-10),而物体的坐标是(0,0,0),所以加上10,正好是转化后物体跟摄像机的距离
            Vector3 temp = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10));
            transform.position = temp;
        }
        else if (Input.GetMouseButton(1))
        {
            //Input.GetAxis("MouseX")获取鼠标移动的X轴的距离
            x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
            y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            y = ClampAngle(y, yMinLimit, yMaxLimit);
            //欧拉角转化为四元数
            Quaternion rotation = Quaternion.Euler(y, x, 0);
            transform.rotation = rotation;
        }
        else if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            //鼠标滚动滑轮 值就会变化
            if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                //范围值限定
                if (Camera.main.fieldOfView <= 100)
                    Camera.main.fieldOfView += 2;
                if (Camera.main.orthographicSize <= 20)
                    Camera.main.orthographicSize += 0.5F;
            }
            //Zoom in  
            if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                //范围值限定
                if (Camera.main.fieldOfView > 2)
                    Camera.main.fieldOfView -= 2;
                if (Camera.main.orthographicSize >= 1)
                    Camera.main.orthographicSize -= 0.5F;
            }
        }
    }

    //角度范围值限定
    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);
    }
}

谢谢大家!

没有更多推荐了,返回首页