YLGameCameraControl
来源:互联网 发布:csgo低配置优化补丁 编辑:程序博客网 时间:2024/06/01 08:14
鼠标右键控制目标物体(target)转动,鼠标滚轮控制前移和后移
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraTest : MonoBehaviour {
private float x;
private float y;
public Transform target;
/// <summary>
/// 水平转动角度
/// </summary>
public float thetaSpeed = 30;
/// <summary>
/// 垂直转动角度
/// </summary>
public float phiSpeed = 10;
/// <summary>
/// 纵向向下限制转动角度
/// </summary>
public float minVAngle = -89;
/// <summary>
/// 纵向向上限制转动角度
/// </summary>
public float maxVAngle = 89;
/// <summary>
/// 转动角度灵敏度
/// </summary>
public float angleSensitivity = 1;
/// <summary>
/// 滑动轮滑动距离
/// </summary>
public float mouseScrollSpeed = 3;
/// <summary>
/// 摄像机与目标物体间的距离
/// </summary>
public float distance;
/// <summary>
/// 滑动最近距离
/// </summary>
public float minDistance = 3;
/// <summary>
/// 滑动最远距离
/// </summary>
public float maxDistance = 18;
// Use this for initialization
void Start () {
x = transform.eulerAngles.y;
y = transform.eulerAngles.x;
distance = Vector3.Distance(transform.position , target.position);
//初始化摄像机的位置,通过目标物体的位置以及欧拉角、距离等关系确定初始位置
transform.position = target.position - Quaternion.Euler(y, x, 0) * Vector3.forward * distance;
}
void FixedUpdate() {
CameraZoom();
CameraRotate();
}
void CameraRotate() {
if (target != null && Input.GetMouseButton(1))
{
x += Input.GetAxis("Mouse X") * thetaSpeed * 0.1f;
y += Input.GetAxis("Mouse Y") * phiSpeed * 0.1f;
y = ClampAngle(y, minVAngle, maxVAngle);
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 direction = rotation * Vector3.forward;
transform.position = target.position - direction * distance;
transform.LookAt(target);
Cursor.visible = false;
/*不添加LookAt,摄像机不能始终朝向物体,摄像机可以自由滑动但不朝向目标物体
transform.rotation = Quaternion.Slerp(rotation, transform.rotation, angleSensitivity);//摄像机绕自身周旋转
transform.RotateAround(target.position, Vector3.up, thetaSpeed * 0.1f);//点击鼠标,摄像机绕物体平面旋转
*/
}
else {
Cursor.visible = true;
}
}
void CameraZoom() {
distance -= Input.GetAxis("Mouse ScrollWheel") * mouseScrollSpeed;
distance = Mathf.Clamp(distance, minDistance, maxDistance);
if (distance <= minDistance || distance >= maxDistance)
{
return;
}
transform.position = transform.position + transform.forward * Input.GetAxis("Mouse ScrollWheel") * mouseScrollSpeed;
}
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);
}
}