/// 摄像机控制器. 将该脚本挂载到CameraFollowAndRotate空物体身上.
///
public class CameraController : MonoBehaviour
public static CameraController instance;
///
/// 控制摄像机的上下.
///
[SerializeField]
private Transform _CameraUpAndDown;
///
/// 控制摄像机缩放.
///
[SerializeField]
private Transform _CameraZoomContainer;
///
/// 摄像机容器.
///
[SerializeField]
private Transform _CameraContainer;
void Awake()
instance = this;
///
/// 设置摄像机旋转.
///
///
0代表左 1代表右
public void SetCameraRotate(int type)
transform.Rotate(new Vector3(0,20*Time.deltaTime*(type==1?-1:1),0));
///
/// 设置摄像机上下.
///
///
0代表上 1代表下
public void SetCameraUpAndDown(int type)
_CameraUpAndDown.Rotate(20 * Time.deltaTime * (type == 0 ? -1 : 1),0,0);
//限定摄像机上下. 注意事项:不要把_CameraUpAndDown这个空物体的旋转最小值设置成负数
_CameraUpAndDown.localEulerAngles = new Vector3(Mathf.Clamp(_CameraUpAndDown.localEulerAngles.x,5,70),0,0);
///
/// 设置摄像机拉近拉远.
///
public void SetCameraZoom(float value)
_CameraContainer.Translate(Vector3.forward * value * Time.deltaTime * 1000);
//限定摄像机最远和最近距离.
_CameraContainer.localPosition = new Vector3(0,0,Mathf.Clamp(_CameraContainer.localPosition.z,-26,26));
///
/// 绘制摄像机运动轨迹.
///
void OnDrawGizmos()
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position,24);
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, 19);
鼠标滑动拖拽事件代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 拖拽事件脚本. 将该脚本挂载到Panel身上.
/// </summary>
public class DragEvent : MonoBehaviour, IDragHandler,IPointerDownHandler
private Vector2 oldMousePos;//记录上一次鼠标点中屏幕的坐标.
public static DragEvent instance;
void Awake()
instance = this;
/// <summary>
/// 拖拽的方向.
/// </summary>
public enum DragDir
Left,
Right,
/// <summary>
/// 缩放类型.
/// </summary>
public enum ZoomType
In,//向内.
Out//向外.
/// <summary>
/// 拖拽事件
/// </summary>
public Action<DragDir> onDragEvent;
public Action<ZoomType,float> onZoomEvent;
void Update()
//获取鼠标滚轮键滑动的值. >0代表拉近 <0代表拉远.
if (Input.GetAxis("Mouse ScrollWheel")>0)
if (onZoomEvent != null)
onZoomEvent(ZoomType.In, Input.GetAxis("Mouse ScrollWheel"));
}else if (Input.GetAxis("Mouse ScrollWheel")< 0)
if (onZoomEvent != null)
onZoomEvent(ZoomType.Out, Input.GetAxis("Mouse ScrollWheel"));
/// <summary>
/// 拖拽进行中.
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
Vector2 dir = eventData.position - oldMousePos;
//计算鼠标滑动的方向.
if(dir.y<dir.x&& dir.y > -dir.x)
if (onDragEvent != null)
onDragEvent(DragDir.Right);
}else if(dir.y>dir.x && dir.y < -dir.x)
if (onDragEvent != null)
onDragEvent(DragDir.Left);
else if (dir.y > dir.x && dir.y>-dir.x)
if (onDragEvent != null)
onDragEvent(DragDir.Up);
if (onDragEvent != null)
onDragEvent(DragDir.Down);
/// <summary>
/// 鼠标在屏幕按下的时候.
/// </summary>
public void OnPointerDown(PointerEventData eventData)
oldMousePos = eventData.position;
控制角色的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 角色控制器. 将该脚本挂载到Player游戏物体身上.
/// </summary>
public class PlayerController : MonoBehaviour {
private Transform _Transform;
void Start()
_Transform = gameObject.GetComponent<Transform>();
//订阅事件.
DragEvent.instance.onDragEvent += OnDragEvent;
DragEvent.instance.onZoomEvent += OnZoomEvent;
void OnDestroy()
//取消事件.
DragEvent.instance.onDragEvent -= OnDragEvent;
DragEvent.instance.onZoomEvent -= OnZoomEvent;
/// <summary>
/// 事件回调.
/// </summary>
private void OnDragEvent(DragEvent.DragDir dir)
switch (dir)
case DragEvent.DragDir.Left:
CameraController.instance.SetCameraRotate(1);
break;
case DragEvent.DragDir.Right:
CameraController.instance.SetCameraRotate(0);
break;
case DragEvent.DragDir.Up:
CameraController.instance.SetCameraUpAndDown(0);
break;
case DragEvent.DragDir.Down:
CameraController.instance.SetCameraUpAndDown(1);
break;
/// <summary>
/// 摄像机缩放事件回调.
/// </summary>
/// <param name="zoom"></param>
/// <param name="value"></param>
private void OnZoomEvent(DragEvent.ZoomType zoom,float value)
switch (zoom)
case DragEvent.ZoomType.In:
CameraController.instance.SetCameraZoom(value);
break;
case DragEvent.ZoomType.Out:
CameraController.instance.SetCameraZoom(value);
break;
void Update()
CameraAutoFollow();
/// <summary>
/// 摄像机自动跟随.
/// </summary>
private void CameraAutoFollow()
if (CameraController.instance != null)
CameraController.instance.transform.position = _Transform.position;
控制摄像机的代码如下:using System.Collections;using System.Collections.Generic;using UnityEngine;/// &lt;summary&gt;/// 摄像机控制器. 将该脚本挂载到CameraFollowAndRotate空物体身上./// &lt;/summary&gt;public class Cam...
Unity使用鼠标旋转缩放平移视角,供大家参考,具体内容如下
用代码在Game界面完美实现Scene界面的操作方法。
使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上。
视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行。
代码主要是分三部分功能进行实现。
1.右键拖动控制视角的旋转;
2.滚轮旋转控制视角的缩放;
3.中键拖动控制视角的平移。
右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相机的旋转是通过旋转相机本体坐标系的x轴与y轴实现的,重要的是在旋转相机的同时,要控制相机和targ
此处0.1为啥要写0.1f,根据C#的语法规定,直接写0.1会被认为double类型的数,而这里需要flaot类型数。
此处*Time.deltatime是确保每秒移动同样的距离。
Time.deltatime 是两帧之间的间隔,如帧率为60帧/秒,则Time.deltatime =0.0167秒,或者帧率为10帧/秒,则Time.delatatime = 0.1秒。所以Time.delatatime是一个随帧率改变而改变的数值,确保物体每秒.
public void ChangeModelPositionZ(Transform currentObj, float minValue, float maxValue, float moveSpeed = 0.1f, bool isMove = false)
if (isMove)
moveL = currentObj.localPosition.z + moveSpeed;
if (moveL &l...
实现了一个功能脚本,方便于摄像机围绕一个物体进行旋转和缩放,使用的方式也很简单,将脚本挂载到主摄像机中。
这里还用到了DoTween的插件和UniRx,需要自己导入一下,如果不想使用插件,可以把以下代码简单修改一下。
using UnityEngine;
using DG.Tweening;
using UnityEngine.EventSystems;
using QFramework;
using UniRx;
using UniRx.Triggers;
/// <summary&
public GameObject lightpoint; //上下移动的ui对象
private float starttime = 0.0f;
private float downpoint = -71.0f; //实际情况来定
private float toppoint = 100.0f; //实际情况来定
private float movetime = 2.0f;
voi...
也可以配合键盘一起使用:
3. 鼠标右键按住不放,此时能以键盘上的wasdqe键进行移动,旋转,缩放视觉位置。
4. 围绕物体旋转,按住键盘ALT,再按住鼠标左键不放。也可以先定位物体(焦点),方法是双击物体或者选中物体后按F键,再ALT,鼠标左键。
我个人实践起来,觉...
// 根据鼠标的移动来旋转物体
Vector3 mouseOffset = (Input.mousePosition - mouseOrigin) * 0.1f;
transform.Rotate(mouseOffset.y, -mouseOffset.x, 0, Space.World);
mouseOrigin = Input.mousePosition;
if (isMoving)
// 根据鼠标的移动来移动物体
Vector3 mouseOffset = (Input.mousePosition - mouseOrigin) * 0.01f;
transform.Translate(mouseOffset.x, mouseOffset.y, 0, Space.World);
mouseOrigin = Input.mousePosition;
if (isScaling)
// 根据鼠标滚轮的滚动来缩放物体
float scaleAmount = 1f + scroll;
transform.localScale *= scaleAmount;
将以上代码添加到一个物体上,然后在场景中将需要控制的物体作为该物体的子物体。在运行游戏时,你可以使用鼠标右键来旋转物体,使用鼠标中键来移动物体,使用鼠标滚轮来缩放物体。