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