1, 相机随鼠标的移动而旋转;
2,按住鼠标移动相机,松开鼠标后相机退回原位
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class ConsCom : MonoBehaviour
{
bool isMouseOnUI;//判断鼠标是否点击在UI层
Vector2 leftMouseDownPos = Vector2.zero;//用来存放按下后鼠标的坐标
Vector2 middlePrePos = Vector2.zero;//用来存放中键按下后,鼠标在屏幕上的坐标值
bool leftMouseDown;//判断按下鼠标左键
float rotSpeed = 5f;//旋转速度
bool isDrangMiddle = false;//判断鼠标中键状态
Vector3 transTarget;//在没有赋值的情况下,默认保存当前位置
float moveAutoSpeed = 100f;//物体回到目标点的变量
// Start is called before the first frame update
void Start()
{
//把此物体下的第一个物体里面的组件打开,如果隐藏物体也可以被发现,可以进行操作
transform.GetChild(0).GetComponent<Camera>().enabled = true;
transTarget = this.transform.position;
}
// Update is called once per frame
void Update()
{
if (!isMouseOnUI)//不在UI层界面时,才进行以下操作
{
//按下鼠标中键
if (Input.GetMouseButtonDown(2))
{
isDrangMiddle = true;//如果中键按下,设定此值为真以便进行下一步操作
}
}
//如果鼠标中键弹起时
if (Input.GetMouseButtonUp(2))
{
isDrangMiddle = false;
MoveAuto1();
}
//由EventSystem判断鼠标是否在UI层,返回一个bool类型的值,如果在UI层返回true
isMouseOnUI = EventSystem.current.IsPointerOverGameObject();
if (!isMouseOnUI)
{
if (Input.GetMouseButtonDown(0))
{
leftMouseDown = true;
leftMouseDownPos = Input.mousePosition;//把按下时的鼠标坐标赋值给leftMouseDown
}
}
if (leftMouseDown)
{
//前一帧的坐标值和后一帧的坐标差值,转换成我们的旋转角度,将值放入posDelta
Vector2 posDelta = (Vector2)Input.mousePosition - leftMouseDownPos;
RotateManual(posDelta);//调用方法
}
if (Input.GetMouseButtonUp(0))
{
leftMouseDown = false;
}
//使变量里的值变为当前值
leftMouseDownPos = Input.mousePosition;
if (isDrangMiddle)
{
Vector2 delta = (Vector2)Input.mousePosition - middlePrePos;
MoveManual(delta);
}
//放在这里只是少一帧移动
middlePrePos = Input.mousePosition;
}
//这个方法实现相机的旋转
void RotateManual(Vector2 delta)
{
//获得摄像机物体的角度,用临时变量来接受
Vector3 eular = transform.eulerAngles;
//在当前Y轴角度上根据鼠标更改左右移动产生的旋转增量,unscaleDeltaTime不受时间尺度限制,以秒计算
eular.y += delta.x * rotSpeed * Time.unscaledDeltaTime;
//在当前X轴角度上根据鼠标更改左右移动产生的旋转增量
eular.x += -delta.y * rotSpeed * Time.unscaledDeltaTime;
//Clamp 限制X轴只能在0到90度之间旋转
eular.x = Mathf.Clamp(eular.x, 0, 90);
//将临时变量整体赋值给摄像机的角度
transform.eulerAngles = eular;
}
/// <summary>
/// 摄像机平移的方法
/// </summary>
/// <param name="d"></param>
void MoveManual(Vector2 delta)
{
Vector3 move = new Vector3(delta.x, 0, delta.y) * 5.0f * Time.unscaledDeltaTime;
transform.Translate(move);
}
void MoveAuto(Vector2 pos)
{
}
//Vector3.Lerp 在做游戏的时候会发现有些跟随动作不够圆滑或需要一个缓冲的时候用到这个方法
void MoveAuto1()
{
//如果目标值为空的话,此方法直接跳过,不执行后面的语句
if (transform == null)
{
return;
}
//当前物体按一定速度回到目标点
transform.position = Vector3.Lerp(transform.position, transTarget, moveAutoSpeed * Time.unscaledDeltaTime);
}
}
相机为挂载脚本的空物体的子物体