需要切记的事情,观看的物体一定要水平放置,否则视角会很奇怪
此脚本是挂在相机上
//FR:徐海涛(hunk Xu) QQ技术交流群:386476712
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class RotateCameraNew : MonoBehaviour
{
private Transform myTransform;
public static RotateCameraNew instance;
public float distance; //距离
public GameObject target;
float time = 0;
public bool isDragingSlider = false;
public Vector3 initTargetPos;
void Start()
{
time = Time.time;
myTransform = transform;
initTargetPos = target.transform.position;
//初始化相机
distance = Vector3.Distance(target.transform.position, transform.position);
Camera.main.transform.position = target.transform.position - this.transform.forward * distance;
}
private void Awake()
{
instance = this;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//当第二次点击鼠标,且时间间隔满足要求时双击鼠标
if (Time.time - time <= 0.1f)
{
leftClick();
}
time = Time.time;
}
if (Input.GetMouseButtonDown(1))
{
//当第二次点击鼠标,且时间间隔满足要求时双击鼠标
if (Time.time - time <= 0.1f)
{
rightClick();
}
time = Time.time;
}
//鼠标滚轮事件
if(Input.GetAxis("Mouse ScrollWheel") != 0)
{
scrollEventByTouShi(Input.GetAxis("Mouse ScrollWheel"));
}
//实现左键拖动平移相机
if (Input.GetMouseButton(0)&& !isDragingSlider)
{
Vector3 p0 = Camera.main.transform.position;
Vector3 p01 = p0 - Camera.main.transform.right * Input.GetAxisRaw("Mouse X") * 0.08f * Time.timeScale;
Vector3 p03 = p01 - Camera.main.transform.up * Input.GetAxisRaw("Mouse Y") * 0.08f * Time.timeScale;
Camera.main.transform.position = p03;
Vector3 change = p03 - p0;
target.transform.position =change + target.transform.position;
}
//鼠标右键旋转物体
if (Input.GetMouseButton(1) && !isDragingSlider)
{
float axis = Input.GetAxis("Mouse X");
float axis1 = Input.GetAxis("Mouse Y");
this.transform.Rotate(Vector3.up * Time.deltaTime * 100 * axis,Space.World);
this.transform.Rotate(-Vector3.right * Time.deltaTime * 100 * axis1);
Camera.main.transform.position = target.transform.position - this.transform.forward * distance;
}
}
//左键双击
public void leftClick()
{
//双击视野放大功能
//print("leftClick");
Vector3 p01 = myTransform.position;
Vector3 p02 =p01+ myTransform.forward * 30f;
myTransform.position = p02;
}
//右键双击
public void rightClick()
{
print("rightClick");
//双击视野缩小功能
Vector3 p01 = myTransform.position;
Vector3 p02 = p01 - myTransform.forward * 30f;
myTransform.position = p02;
}
//透视状态下,鼠标滚轮前进后退功能
public void scrollEventByTouShi(float vall)
{
if (vall > 0) //想向前移动
{
myTransform.position += myTransform.forward * vall * 30;
distance = Vector3.Distance(target.transform.position, transform.position);
}
else //向后退
{
myTransform.position += myTransform.forward * vall * 30;
distance = Vector3.Distance(target.transform.position, transform.position);
}
}
public static float ClampAngle(float angle, float min, float max)
{
angle = angle % 360;
if ((angle >= -360F) && (angle <= 360F))
{
if (angle < -360F)
{
angle += 360F;
}
if (angle > 360F)
{
angle -= 360F;
}
}
return Mathf.Clamp(angle, min, max);
}
}