天天看點

RPG黑暗之光學習筆記 攝像頭設定

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CamFolRole : MonoBehaviour {
    public GameObject role;
    public Vector3 offer;
    public float speed=0.5f;
    public float distance = 0;
    public float crameSpeed = 10;//縮放速度
    public float rotateSpeed = 5;//旋轉速度
    private bool isRotating = false;//是否滑動
	// Update is called once per frame
    void Start()
    {
        offer = transform.position - role.transform.position;
    }
	void Update () {
        transform.position = role.transform.position + offer;
        //處理視野的旋轉
        RotateView();
        //處理視野的拉近和拉遠效果
        ScrollView();
      
	}
    void ScrollView()
    {
        print(Input.GetAxis("Mouse ScrollWheel"));
        distance = offer.magnitude;//magnitude 是目前點到原點的距離
        distance += -Input.GetAxis("Mouse ScrollWheel")*crameSpeed;//向前滑動為+,先後滑動為-
        distance = Mathf.Clamp(distance, 2, 18);//設定distance的大小區間2-18
        offer = offer.normalized * distance;//
    }
    void RotateView(){
       // Input.GetAxis("Mouse X");//得到滑鼠在水準方向的滑動
       // Input.GetAxis("Mouse Y");//得到滑鼠在垂直方向的滑動
        if (Input.GetMouseButtonDown(1))//滑鼠右鍵按下時開始滑動
        {
            isRotating = true;
        }
        if (Input.GetMouseButtonUp(1))//滑鼠左鍵按下時停止滑動
        {
            isRotating = false;
        }
        if (isRotating)
        {
            //設定左右旋轉
            transform.RotateAround(role.transform.position,role.transform.up, rotateSpeed * Input.GetAxis("Mouse X"));
            Vector3 originalPos = transform.position;//存放上下旋轉之前的位置
            Quaternion originalRotatin = transform.rotation;//存放之前的旋轉

            //設定上下旋轉
            transform.RotateAround(role.transform.position,transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
            //我們是從我們的視野上去看的 是以是transform.right

            float x = transform.eulerAngles.x;//歐拉角也就是rotation的x
            if (x < 10 || x > 80)//單超出時就設定為原來的角度
            {
                transform.position = originalPos;
                transform.rotation = originalRotatin;
            }
        }
        offer = transform.position - role.transform.position;//旋轉之後方向向量就變了 是以要更新
    }
}

           

1.攝像頭跟随人物

思路:先擷取攝像頭與人物的內插補點,然後在Update每次調用的時候都重新設定相機的position=人物的位置+內插補點

第一步:得到內插補點

offer = transform.position - role.transform.position;//相機與人物的差

第二步:重新整理相機位置

transform.position=role.transform.position+offer;//在Update裡面更新

2.攝像頭放大縮小

***思路:産生縮放效果,可以先擷取錄影機與人物之間的距離,然後通過改距離進而改變,錄影機的位置***
	**第一步:人物與相機之間的距離**
      float distance=offer.magnitude;//magnitude 是目前點到原點的距離,由于offer是內插補點是以就是人物與錄影機之間的距離
	**第二步:擷取滑鼠滑輪的值**
	float x=input.GetAxis("Mouse ScrollWheel")*crameSpeed;//Mouse ScrollWheel中文翻譯是滑鼠滑輪,作為GetAxis的參數時可以擷取滑鼠的滑動情況,上滑是正數,下滑是負數	
	**第三步:改變相機與人物之間的距離**
	distance+=x*crameSpeed;
	**第四步:改變相機的位置**
	offer=offer.normalized*distance;//一個新的offer,先擷取offer的方向向量然後*上距離,這個新的offer除了距離不一樣,方向還是相同的
      這樣下一次update的時候就像新的offer了
           

3.攝像頭左右轉動

思路:先判斷是否要旋轉,如果要旋轉了就擷取旋轉的值,左右旋轉是以人物為點,錄影機的right為軸轉動的

第一步:判斷是否旋轉

bool isRotating=false;//定義一個bool類型的值,預設為false不旋轉

第二步:設定可以旋轉的操作區間

if(input.GetMouseButtonDown(1))//-1為左鍵,0為滑輪,1為右鍵

{//當按下滑鼠右鍵時就表示可進行旋轉了

isRotating=true;

}

if(input.GetMouseButtonUp(1)){

//當滑鼠起來的時候就是不按了,就不旋轉了

isRotating=false;

}

第三步:開始旋轉

if(isRotating){//判斷是否可以旋轉

transform.RotateAround(role.transform.position,tramsform.up,rotateSpeed * Input.GetAxis(“Mouse X”));//以人物為點,自人向上為軸轉動,Mouse X參數就是擷取滑鼠X軸方向的移動

}

第四步:重新設定錄影機與人物的內插補點

offer=transform.position-role.transform.position;//因為旋轉之後相機的位置變了是以要重新指派

3.攝像頭上下轉動

思路:和左右旋轉很相似,但是要設定旋轉的區間,不然就容易穿地面的模

第一步:上下旋轉

if(isRotating){//判斷是否可以旋轉

transform.RotateAround(role.transform.position,role.tramsform.right,-rotateSpeed * Input.GetAxis(“Mouse Y”));//以人物為點,自人向右為軸轉動,Mouse Y參數就是擷取滑鼠Y軸方向的移動,這裡取反,我滑動的時候看起來更舒服

}

第二步:設定旋轉區間

//先儲存之前的旋轉與位置的資料,下面會用到

Vector3 originalPos = transform.position;//存放上下旋轉之前的位置

Quaternion originalRotatin = transform.rotation;//存放之前的旋轉,rotation

是四元數,是以用Quaternion來存儲

//轉到的時候是x轉動是以我們先擷取x

float x = transform.eulerAngles.x;//歐拉角也就是rotation的x

//判斷是否在某個區間

if(x<10||x>80){

//不在10~80之間就還原 不然他改變

transform.position=originalPos ;

transform.rotation=originalRotatin;

}

第四步:重新設定錄影機與人物的內插補點

offer=transform.position-role.transform.position;//因為旋轉之後相機的位置變了是以要重新指派

注意事項

先旋轉再縮放

原因:如果先縮放再旋轉的話,offer值是不一樣的,offer的值不一樣是以産生的收縮向量就不是錄影機的了

//處理視野的旋轉

RotateView();

//處理視野的拉近和拉遠效果

ScrollView();