unity3d 鼠标旋转视角_unity鼠标右键控制自由视角旋转 - CSDN
  • 可以简单的实现鼠标右键控制视角的转动,代码简短,没有设置限定转动的角度,望指正。 private Vector2 offs; public float speed=2; void Start () { offs = transform.eulerAngles; } void Update () { ...

     可以简单的实现鼠标右键控制视角的转动,代码简短,没有设置限定转动的角度,望指正。

        private Vector2 offs;
        public float speed=2;
    	void Start () {
            offs = transform.eulerAngles;
    	}
    	void Update () {
            if (Input.GetMouseButton(1))     //用户交互的键入
            {
                offs += new Vector2(Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse X"))*speed;   //摄像机旋转的控制
                transform.eulerAngles = offs;
            }
    	}

     

     

    展开全文
  • Unity使用鼠标旋转缩放平移视角 用代码在Game界面完美实现Scene界面的操作方法。 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上。 视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角...

    Unity使用鼠标旋转缩放平移视角


    用代码在Game界面完美实现Scene界面的操作方法。

    使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上。

    视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行。

    代码主要是分三部分功能进行实现。

    1. 右键拖动控制视角的旋转;
    2. 滚轮旋转控制视角的缩放;
    3. 中键拖动控制视角的平移。

    右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相机的旋转是通过旋转相机本体坐标系的x轴与y轴实现的,重要的是在旋转相机的同时,要控制相机和target物体的相对距离,即同时控制相机绕target物体的旋转。这个网上多数实现都相同,不赘述

    中键滚轮控制视角的缩放,定义Distance变量控制相机与target的距离(相机z轴方向的距离),用GetAxis获得滚轮旋转的程度,控制Distance的变动。这里和网上已有的方法也没什么区别。

    中键拖动控制视角的平移,之前在网上查找相关的实现,结果实际效果都比较差,所以自己实现了一下。视角的平移是通过获取中键在屏幕坐标系下的平移的方向向量,然后转换为世界坐标系下的target坐标的平移,然后调整相机的位置进行相应的平移以保证旋转和缩放不受影响。

    屏幕坐标系的平移转换到世界坐标系下的平移,本质上就是世界坐标系下沿着相机的本体坐标系的x与y轴进行相应的平移。所以只需要求出屏幕坐标系x与y方向的平移,分别乘以相机x与y轴的方向向量,然后与target原来的坐标相加,就可以获得target平移后的位置,再将相机的位置平移过去即实现了视角的平移,这种平移保证了相机平面和target之间的相对距离保持不变。具体代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MouseLookTest : MonoBehaviour {
    
    	//相机跟随的目标物体,一般是一个空物体
    	public Transform target;
    	private int MouseWheelSensitivity = 1; //滚轮灵敏度设置
    	private int MouseZoomMin = 1; //相机距离最小值
    	private int MouseZoomMax = 20; //相机距离最大值
    
    	private float moveSpeed = 10; //相机跟随速度(中键平移时),采用平滑模式时起作用,越大则运动越平滑
    
    	private float xSpeed = 250.0f; //旋转视角时相机x轴转速
    	private float ySpeed = 120.0f; //旋转视角时相机y轴转速
    
    	private int yMinLimit = -360;
    	private int yMaxLimit = 360;
    
    	private float x = 0.0f; //存储相机的euler角
    	private float y = 0.0f; //存储相机的euler角
    
    	private float Distance = 5; //相机和target之间的距离,因为相机的Z轴总是指向target,也就是相机z轴方向上的距离
    	private Vector3 targetOnScreenPosition; //目标的屏幕坐标,第三个值为z轴距离
    	private Quaternion storeRotation; //存储相机的姿态四元数
    	private Vector3 CameraTargetPosition; //target的位置
    	private Vector3 initPosition; //平移时用于存储平移的起点位置
    	private Vector3 cameraX; //相机的x轴方向向量
    	private Vector3 cameraY; //相机的y轴方向向量
    	private Vector3 cameraZ; //相机的z轴方向向量
    
    	private Vector3 initScreenPos; //中键刚按下时鼠标的屏幕坐标(第三个值其实没什么用)
    	private Vector3 curScreenPos; //当前鼠标的屏幕坐标(第三个值其实没什么用)
    	void Start () {
    		//这里就是设置一下初始的相机视角以及一些其他变量,这里的x和y。。。是和下面getAxis的mouse x与mouse y对应
    		var angles = transform.eulerAngles;
    		x = angles.y;
    		y = angles.x;
    		CameraTargetPosition = target.position;
    		storeRotation = Quaternion.Euler (y + 60, x, 0);
    		transform.rotation = storeRotation; //设置相机姿态
    		Vector3 position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition; //四元数表示一个旋转,四元数乘以向量相当于把向量旋转对应角度,然后加上目标物体的位置就是相机位置了
    		transform.position = storeRotation * new Vector3 (0, 0, -Distance) + CameraTargetPosition; //设置相机位置
    
    		// Debug.Log("Camera x: "+transform.right);
    		// Debug.Log("Camera y: "+transform.up);
    		// Debug.Log("Camera z: "+transform.forward);
    
    		// //-------------TEST-----------------
    		// testScreenToWorldPoint();
    
    	}
    
    	void Update () {
    		//鼠标右键旋转功能
    		if (Input.GetMouseButton (1)) {
    			x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;
    			y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;
    
    			y = ClampAngle (y, yMinLimit, yMaxLimit);
    
    			storeRotation = Quaternion.Euler (y + 60, x, 0);
    			var position = storeRotation * new Vector3 (0.0f, 0.0f, -Distance) + CameraTargetPosition;
    
    			transform.rotation = storeRotation;
    			transform.position = position;
    		} else if (Input.GetAxis ("Mouse ScrollWheel") != 0) //鼠标滚轮缩放功能
    		{
    			if (Distance >= MouseZoomMin && Distance <= MouseZoomMax) {
    				Distance -= Input.GetAxis ("Mouse ScrollWheel") * MouseWheelSensitivity;
    			}
    			if (Distance < MouseZoomMin) {
    				Distance = MouseZoomMin;
    			}
    			if (Distance > MouseZoomMax) {
    				Distance = MouseZoomMax;
    			}
    			var rotation = transform.rotation;
    
    			transform.position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition;
    		}
    
    		//鼠标中键平移
    		if (Input.GetMouseButtonDown (2)) {
    			cameraX = transform.right;
    			cameraY = transform.up;
    			cameraZ = transform.forward;
    
    			initScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
    			Debug.Log ("downOnce");
    
    			//targetOnScreenPosition.z为目标物体到相机xmidbuttonDownPositiony平面的法线距离
    			targetOnScreenPosition = Camera.main.WorldToScreenPoint (CameraTargetPosition);
    			initPosition = CameraTargetPosition;
    		}
    
    		if (Input.GetMouseButton (2)) {
    			curScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
    			//0.01这个系数是控制平移的速度,要根据相机和目标物体的distance来灵活选择
    			target.position = initPosition - 0.01f * ((curScreenPos.x - initScreenPos.x) * cameraX + (curScreenPos.y - initScreenPos.y) * cameraY);
    
    			//重新计算位置
    			Vector3 mPosition = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + target.position;
    			transform.position = mPosition;
    
    			// //用这个会让相机的平移变得更平滑,但是可能在你buttonup时未使相机移动到应到的位置,导致再进行旋转与缩放操作时出现短暂抖动
    			//transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*moveSpeed);
    
    		}
    		if (Input.GetMouseButtonUp (2)) {
    			Debug.Log ("upOnce");
    			//平移结束把cameraTargetPosition的位置更新一下,不然会影响缩放与旋转功能
    			CameraTargetPosition = target.position;
    		}
    
    	}
    
    	//将angle限制在min~max之间
    	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);
    	}
    
    	void testScreenToWorldPoint () {
    		//第三个坐标指的是在相机z轴指向方向上的距离
    		Vector3 screenPoint = Camera.main.WorldToScreenPoint (CameraTargetPosition);
    		Debug.Log ("ScreenPoint: " + screenPoint);
    
    		// var worldPosition = Camera.main.ScreenToWorldPoint(new Vector3(1,1,10));
    		// Debug.Log("worldPosition: "+worldPosition);
    	}
    }
    
    

    实现的效果如下图:
    在这里插入图片描述

    demo工程在此下载:
    https://github.com/JinghanSun/MouseLookDemoWithUnity3D

    展开全文
  • 下面举一个简单的例子说明在Unity3D如何用键盘鼠标控制视角的移动的。如下图所示: 就像大部分游戏一样,可以用鼠标滚轮控制视角的远近,键盘的wasd和上下左右控制镜头的位置,而按着鼠标右键则可以控制镜头的旋转...

    在3D游戏里面,视角是一个很重要的因素,部分玩家对锁视角嗤之以鼻,因此视角也是游戏制作里面需要努力的方面。其实也不难,换到Unity3D里面是想办法控制摄像机的移动。下面举一个简单的例子说明在Unity3D如何用键盘鼠标控制视角的移动的。如下图所示:


    就像大部分游戏一样,可以用鼠标滚轮控制视角的远近,键盘的wasd和上下左右控制镜头的位置,而按着鼠标右键则可以控制镜头的旋转。当然你可以根据需要改成其它控制方式,反正原理是同一个原理。

    其实这个游戏场景布置非常非常简单,也不是本文的重点。如下图所示,基本能够一览无遗:


    如上图所示,我们其实需要做的,只是控制Main Camera的位置和旋转则能够做到上面的效果。因此赋予给Main Camera,如下的脚本CameraMove.cs:

    using UnityEngine;
    using System.Collections;
    
    public class CameraMove : MonoBehaviour
    {
        public float sensitivityMouse = 2f;
        public float sensitivetyKeyBoard = 0.1f;
        public float sensitivetyMouseWheel = 10f;
    
        void Update()
        {
            //滚轮实现镜头缩进和拉远
            if (Input.GetAxis("Mouse ScrollWheel") != 0)
            {
                this.camera.fieldOfView = this.camera.fieldOfView - Input.GetAxis("Mouse ScrollWheel") * sensitivetyMouseWheel;
            }
            //按着鼠标右键实现视角转动
            if (Input.GetMouseButton(1))
            {
                transform.Rotate(-Input.GetAxis("Mouse Y") * sensitivityMouse, Input.GetAxis("Mouse X") * sensitivityMouse, 0);
            }
    
            //键盘按钮←/a和→/d实现视角水平移动,键盘按钮↑/w和↓/s实现视角水平旋转
            if (Input.GetAxis("Horizontal") != 0)
            {
                transform.Translate(Input.GetAxis("Horizontal") * sensitivetyKeyBoard, 0, 0);
            }
            if (Input.GetAxis("Vertical") != 0)
            {
                transform.Translate(0, Input.GetAxis("Vertical") * sensitivetyKeyBoard, 0);
            }
        }
    
    }
    

    鼠标右键点击的监听这里就不说了,在《【Unity3D】用鼠标点击事件、AddForce完成跳跃与二段跳》(点击打开链接)已经详细说过了。这里引用了Input.GetAxis的概念。理论上,你可以像《【Unity3D】利用物体碰撞检测、键盘输入处理完成平衡球游戏》(点击打开链接)那样控制物体移动那样,控制主摄像机的移动与旋转的,但是使用Input.GetAxis会让你代码更加简洁,在Unity3D中有18条轴,不过基本上常用轴就是上述代码的几个。

    Input.GetAxis能够获取这个轴的输入,也就是同样是用来监听鼠标输入的一个东西,它将返回一个-1~1的数值。用于记录用户按键盘的时长、翻滚轮、鼠标对比上一个位置偏移的多少。这样的话,我们再乘上一个合适的float,则可以形成一个坐标位置。配合Rotate与Translate则能够时物体移动。

    另一方面,摄像头的焦距,也就是缩放可以直接对fieldOfView控制而达成。

    展开全文
  • Unity3D鼠标移动视角+键盘移动位置实现 鼠标移动视角实现: 一、Ui操作 在物体下创建一个子摄像机,把它作为物体的眼睛,并调到一定高度 二、代码实现 将本脚本放到子物体Camera上。 using System.Collections; ...

    Unity3D鼠标移动视角+键盘移动位置实现

    鼠标移动视角实现:

    一、Ui操作

    在物体下创建一个子摄像机,把它作为物体的眼睛,并调到一定高度

    在这里插入图片描述
    在这里插入图片描述

    二、代码实现

    将本脚本放到子物体Camera上。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    //将脚本放到子物体Camera上
    public class MouseView2 : MonoBehaviour {
    
        //Mouse direction
        private Vector2 mD;
    
        //The capsule parent!
        private Transform myBody;
    
    	// Use this for initialization
    	void Start () {
    
            myBody = this.transform.parent;
        
    	}
    	
    	// Update is called once per frame
    	void Update () {
            Vector2 mC = new Vector2
                (Input.GetAxisRaw("Mouse X"),
                    Input.GetAxisRaw("Mouse Y"));
    
            mD += mC;
            //上下控制相机
            //绕x轴旋转,旋转大小
            this.transform.localRotation =
                Quaternion.AngleAxis(-mD.y, Vector3.right);
            //左右控制父级
            //绕y轴旋转,旋转大小
            myBody.localRotation =
                Quaternion.AngleAxis(mD.x, Vector3.up);
    		
    	}
    }
    

    解析:转向可以分为上下转动,以及左右转动。

    上下转动:上下转动通常不能够让物体转动,不然物体造型会发生倾斜,像这个样子!
    在这里插入图片描述
    所以我们命令上下转动为摄像机,左右转动为父物体。

    this.transform.localRotation 控制摄像机方向
    this.transform.parent.localRotation 控制父物体方向

    键盘移动位置实现:

    一、Ui操作

    添加CharacterController组件
    在这里插入图片描述

    二、代码实现

    将本代码放到父物体上

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlayerControll : MonoBehaviour {
    
        public float speed = 6.0f;
        public float jumpSpeed = 8.0f;
        public float gravity = 20.0f;
        //md is move Direction
        private Vector3 mD = Vector3.zero;
    
        private void Update()
        {
            CharacterController controller = GetComponent<CharacterController>();
            //CharacterController组件中自带检测是否在地面方法
            if(controller.isGrounded)
            {
            	//范围(-1,1)
                float h = Input.GetAxis("Horizontal");
                //范围(-1,1)
                float v = Input.GetAxis("Vertical");
    			//获取单位向量
                mD = new Vector3(h, 0, v);
                //从自身坐标到世界坐标变换方向。
                mD = transform.TransformDirection(mD);
                //单位向量乘速度
                mD *= speed;
               	//跳跃检测
                if (Input.GetButton("Jump"))
                    mD.y = jumpSpeed;
            }
            mD.y -= gravity * Time.deltaTime;
            ////CharacterController组件移动方法
            controller.Move(mD * Time.deltaTime);
        }
    }
    
    展开全文
  • 前面,学了物体的移动功能,现在来学一下鼠标控制摄像机(视角)移动 ( ⊙o⊙ )~。代码如下: C#脚本(在Unity 5.5.1 下能运行): using System.Collections; using System.Collections.Generic; using UnityEngine; ...

    前面,学了物体的移动功能,现在来学一下鼠标控制摄像机(视角)移动 ( ⊙o⊙ )~。

    代码如下:
    C#脚本(在Unity 5.5.1 下能运行):

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    public class MouseView : MonoBehaviour {
    
        public enum RotationAxes
        {
            MouseXAndY = 0,
            MouseX = 1,
            MouseY = 2
        }
    
        public RotationAxes m_axes = RotationAxes.MouseXAndY;
        public float m_sensitivityX = 10f;
        public float m_sensitivityY = 10f;
    
        // 水平方向的 镜头转向
        public float m_minimumX = -360f;
        public float m_maximumX = 360f;
        // 垂直方向的 镜头转向 (这里给个限度 最大仰角为45°)
        public float m_minimumY = -45f;
        public float m_maximumY = 45f;
    
        float m_rotationY = 0f;
    
    
        // Use this for initialization
        void Start () {
            // 防止 刚体影响 镜头旋转
            if (GetComponent<Rigidbody>()) {
                GetComponent<Rigidbody> ().freezeRotation = true;
            }
        }
    
        // Update is called once per frame
        void Update () {
            if (m_axes == RotationAxes.MouseXAndY) {
                float m_rotationX = transform.localEulerAngles.y + Input.GetAxis ("Mouse X") * m_sensitivityX;
                m_rotationY += Input.GetAxis ("Mouse Y") * m_sensitivityY;
                m_rotationY = Mathf.Clamp (m_rotationY, m_minimumY, m_maximumY);
    
                transform.localEulerAngles = new Vector3 (-m_rotationY, m_rotationX, 0);
            } else if (m_axes == RotationAxes.MouseX) {
                transform.Rotate (0, Input.GetAxis ("Mouse X") * m_sensitivityX, 0);
            } else {
                m_rotationY += Input.GetAxis ("Mouse Y") * m_sensitivityY;
                m_rotationY = Mathf.Clamp (m_rotationY, m_minimumY, m_maximumY);
    
                transform.localEulerAngles = new Vector3 (-m_rotationY, transform.localEulerAngles.y, 0);
            }
        }
    }
    

    调用时,只需把该脚本绑定给物体即可。这里是绑定摄像机,以摄像机为第一人称视角转动。

    展开全文
  • 最近在做一个工程,在Game视窗内用到了和Sence视窗内差不多的功能,研究...第一个新建一个C#脚本MouseOrbit,这个脚本是借鉴了unity3D自带的MouseOrbit脚本,我在其基础上进行了修改,删掉一部分内容,增加了不少东西,
  • Unity3D鼠标控制摄像机“左右移动控制视角+WASD键盘控制前后左右+空格键抬升高度”脚本
  • 各位朋友,大家好,我是秦元培,欢迎大家关注我的博主,我的博客地址是blog.csdn.net/...本文采用的方法依然是在[Unity3D]Unity3D游戏开发之自由视角下的角色控制这篇文章中所采用的方法,所以如果大家对于这部
  • using UnityEngine; using System.Collections; //1.设置Axes为Mouse X QQ群:476842922... // MouseLook rotates the transform based on the mouse delta. ...// To make an FPS style character: ...// - Create a c...
  • 在游戏过程中,经常需要通过鼠标在屏幕在滑动实现相机视角的功能,如果只是把相机挂在玩家上,并不能实现视角的自由旋转,只能一直朝向玩家前方。 接下来我将教大家实现相机的旋转和缩放功能。 一、相机缩放 首先...
  • Unity3D鼠标拖拽绕任意轴旋转的实现
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class mouselook : MonoBehaviour { //MouseLook.cs //无重力:放在人上MouseXAndY //加重力: 人水平MouseX 摄像机...
  • 主要实现的功能是相机跟随主角,鼠标右击移动后,相机的视角旋转 思路:
  • 各位朋友,大家好,我是秦元培,欢迎大家关注...今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由视角下的角色控制。如图是博主非常喜欢的《古剑奇谭》游戏截图,在
  • Unity3d鼠标拖拽物体实现任意角度自旋转 主要涉及函数Input.GetAxis(“Mousex”) 可取得鼠标横向(x轴)移动增量Input.GetAxis(“Mousey”) 可取得鼠标竖向(y轴)移动增量通过勾股定理获取拖拽长度,长度越长旋转越...
  • 在游戏过程中,经常需要通过鼠标在屏幕在滑动实现相机视角的功能,如果只是把相机挂在玩家上,并不能实现视角的自由旋转,只能一直朝向玩家前方。 接下来我将教大家实现相机的旋转和缩放功能。 一、相机缩放 首先...
  • Unity3D第三人称Camera视角旋转,实现对player观察的实现,效果图如下(player and Scene 有点lou): 内容知识总结: Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下...
  • Unity3d按右键旋转相机

    2020-07-24 23:33:56
    Unity3d中实现按右键旋转相机功能。
  • Unity3d实现鼠标控制相机绕物体旋转(带阻尼) 本来想的是用四元数实现球性插值实现阻尼效果,但是不知道四元数怎么绕定点旋转。因此用速度衰减的方法进行实现。 1.实现鼠标控制相机带阻尼旋转 2.实现鼠标中键...
  • 实现鼠标旋转拖动缩放模型,非常不错的代码: using UnityEngine; using System.Collections; public class MouseControl : MonoBehaviour { public Transform target; private int MouseWheelSensitivity = 1...
1 2 3 4 5 ... 20
收藏数 1,142
精华内容 456
关键字:

unity3d 鼠标旋转视角