天天看点

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