Unity3D之第三人称视角管理

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之第三人称视角管理)