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();