using UnityEngine;
using System.Collections;
public class MouseOrbit : MonoBehaviour {
public GameObject target; //目标
public float xSpeed; //y轴旋转速度
public float ySpeed; //x轴旋转速度
public float yMinLimit; //x轴角度下限
public float yMaxLimit; //x轴角度上线
public float scrollSpeed; //鼠标滑轮速度
public float zoomMin; //摄像机离目标最近距离
public float zoomMax; //摄像机离目标最远距离
//Private variable
private float distance;//摄像机与目标初始距离
private float distanceLerp;
private Vector3 position;
private bool isActivated;
private float x;//x轴的值
private float y;//y轴的值
// Use this for initialization
void Start () {
//如果忘记挂载目标
if(target == null)
{
target = GameObject.FindGameObjectWithTag("target");
if(target == null)
{
Debug.LogWarning("Don't found player tag please change player tag to Player");
}
}
//初始值
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
CalDistance();
}
void LateUpdate () {
ScrollMouse();
RotateCamera();
}
//旋转方法
void RotateCamera()
{
//鼠标右键按下
if (Input.GetMouseButtonDown(1))
{
isActivated = true;
}
// 鼠标右键抬起
if (Input.GetMouseButtonUp(1))
{
isActivated = false;
}
if (target && isActivated)
{
y -= Input.GetAxis("Mouse Y") * ySpeed;
x += Input.GetAxis("Mouse X") * xSpeed;
y = ClampAngle(y, yMinLimit, yMaxLimit);
Quaternion rotation = Quaternion.Euler(y, x, 0);
Quaternion targetRotate = Quaternion.Euler(0, x, 0);
target.transform.rotation = targetRotate;
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.position;
transform.rotation = rotation;
transform.position = position;
}
else
{
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.position;
transform.rotation = rotation;
transform.position = position;
}
}
//固定距离
void CalDistance()
{
distance = zoomMax;
distanceLerp = distance;
Quaternion rotation = Quaternion.Euler(y, x, 0);
Vector3 calPos = new Vector3(0, 0, -distanceLerp);
position = rotation * calPos + target.transform.position;
transform.rotation = rotation;
transform.position = position;
}
//鼠标滑轮滑动
void ScrollMouse()
{
distanceLerp = Mathf.Lerp(distanceLerp,distance,Time.deltaTime * 5);
if (Input.GetAxis("Mouse ScrollWheel") != 0 )
{
// get the distance between camera and target
distance = Vector3.Distance (transform.position , target.transform.position);
distance = ScrollLimit(distance - Input.GetAxis("Mouse ScrollWheel")*scrollSpeed, zoomMin, zoomMax);
}
}
//鼠标滑轮限制
float ScrollLimit(float dist, float min, float max)
{
if (dist < min)
dist= min;
if (dist > max)
dist= max;
return dist;
}
//角度限制
float ClampAngle(float angle,float min,float max)
{
if(angle < -360)
angle += 360;
if(angle > 360)
angle -= 360;
return Mathf.Clamp(angle,min,max);
}
}
这是Top-Down RPG Starter Kit这个demo里面的代码,做个笔记。若有侵权请私信。
Unity3D之第三人称视角管理
最新推荐文章于 2024-08-21 11:18:40 发布