> 文档中心 > Unity3D摄像机,键盘控制前后左右上下移动,鼠标控制旋转、放缩

Unity3D摄像机,键盘控制前后左右上下移动,鼠标控制旋转、放缩

Unity3D中运行场景时,实现摄像机的前、后、左、右、上、下,以及鼠标滚轮的放缩,鼠标右键的旋转操作。亲测有效,可供参考。
按键功能介绍:W——前;S——后;A——左;D——右;Q——下降;E——上升;鼠标右键——旋转;鼠标滚轮——放缩。
Tourcamera脚本需要挂在摄像机组件上。

using System.Collections;using System.Collections.Generic;using UnityEngine;public class Tourcamera : MonoBehaviour{    public Transform tourCamera;    #region 相机移动参数    public float moveSpeed = 1.0f;    public float rotateSpeed = 90.0f;    public float shiftRate = 2.0f;// 按住Shift加速    public float minDistance = 0.5f;// 相机离不可穿过的表面的最小距离(小于等于0时可穿透任何表面)    #endregion    #region 运动速度和其每个方向的速度分量    private Vector3 direction = Vector3.zero;    private Vector3 speedForward;    private Vector3 speedBack;    private Vector3 speedLeft;    private Vector3 speedRight;    private Vector3 speedUp;    private Vector3 speedDown;    #endregion    void Start()    { if (tourCamera == null) tourCamera = gameObject.transform; // 防止相机边缘穿透 //if (tourCamera.GetComponent().nearClipPlane > minDistance / 3) //{ //    tourCamera.GetComponent().nearClipPlane /= 3; //}    }    void Update()    { GetDirection(); // 检测是否离不可穿透表面过近 RaycastHit hit; while (Physics.Raycast(tourCamera.position, direction, out hit, minDistance)) {     // 消去垂直于不可穿透表面的运动速度分量     float angel = Vector3.Angle(direction, hit.normal);     float magnitude = Vector3.Magnitude(direction) * Mathf.Cos(Mathf.Deg2Rad * (180 - angel));     direction += hit.normal * magnitude; } tourCamera.Translate(direction * moveSpeed * Time.deltaTime, Space.World);    }    private void GetDirection()    { #region 加速移动 if (Input.GetKeyDown(KeyCode.LeftShift)) moveSpeed *= shiftRate; if (Input.GetKeyUp(KeyCode.LeftShift)) moveSpeed /= shiftRate; #endregion #region 键盘移动 // 复位 speedForward = Vector3.zero; speedBack = Vector3.zero; speedLeft = Vector3.zero; speedRight = Vector3.zero; speedUp = Vector3.zero; speedDown = Vector3.zero; // 获取按键输入 if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)) speedForward = tourCamera.forward; if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S)) speedBack = -tourCamera.forward; if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)) speedLeft = -tourCamera.right; if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) speedRight = tourCamera.right; if (Input.GetKey(KeyCode.E)) speedUp = Vector3.up; if (Input.GetKey(KeyCode.Q)) speedDown = Vector3.down; direction = speedForward + speedBack + speedLeft + speedRight + speedUp + speedDown; #endregion #region 鼠标旋转 if (Input.GetMouseButton(1)) {     // 转相机朝向     tourCamera.RotateAround(tourCamera.position, Vector3.up, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime);     tourCamera.RotateAround(tourCamera.position, tourCamera.right, -Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime);     // 转运动速度方向     direction = V3RotateAround(direction, Vector3.up, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime);     direction = V3RotateAround(direction, tourCamera.right, -Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime); } #endregion #region 鼠标滚轮效果 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; } #endregion    }    public Vector3 V3RotateAround(Vector3 source, Vector3 axis, float angle)    { Quaternion q = Quaternion.AngleAxis(angle, axis);// 旋转系数 return q * source;// 返回目标点    }}

闲鱼礼物网