完整脚本CamaraController.cs,直接挂载到Camera上就可以运行了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour {
public Transform trans;
private Vector3 offset;
private float distance;
public float scrollSpeed=5.0f;
public float MinDistance = 10.0f;
public float MaxDistance = 40.0f;
private bool isRotating;
public float rotateSpeed=5.0f;
// Use this for initialization
void Start () {
offset = transform.position - trans.position;
}
// Update is called once per frame
void Update () {
transform.position = offset + trans.position;
RotateView();
ScrollView();
}
private void ScrollView()
{
distance = offset.magnitude;
//向前滑动拉近 向后滑动拉远
distance -= Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
distance = Mathf.Clamp(distance, MinDistance, MaxDistance);
offset = offset.normalized* distance;
}
private void RotateView()
{
//鼠标右键按下可以旋转视野
if (Input.GetMouseButtonDown(1))
isRotating = true;
if (Input.GetMouseButtonUp(1))
isRotating = false;
if (isRotating)
{
Vector3 originalPosition = transform.position;
Quaternion originalRotation = transform.rotation;
transform.RotateAround(trans.position, trans.up, rotateSpeed* Input.GetAxis("Mouse X"));
transform.RotateAround(trans.position, transform.right, -rotateSpeed* Input.GetAxis("Mouse Y"));
float x = transform.eulerAngles.x;
//旋转的范围为10度到80度
if (x< 10 || x> 80)
{
transform.position = originalPosition;
transform.rotation = originalRotation;
}
}
offset = transform.position - trans.position;
}
}
相机跟随主角移动
一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置,便能实现简单的相机跟随了。
public class CameraController : MonoBehaviour {
public Transform player;//定义为public可以直接在面板里设置主角
private Vector3 offset;
// Use this for initialization
void Start () {
offset = transform.position - player.position;//取得初始偏移量
transform.LookAt(player.position);
}
// Update is called once per frame
void Update () {
transform.position = offset + player.position;
}
视野的缩放
鼠标滚轮向前拉近视野,向后视野变远。原理是设置一个变量distance为偏移向量的模,鼠标滚轮滑动改变distance的值,然后根据distance设置Camera的位置,其中scrollSpeed为定义的一个float变量用于调整缩放的速度
private float distance;
public float scrollSpeed;
public float MinDistance;
public float MaxDistance;
private void ScrollView()
{
distance = offset.magnitude;
//向前滑动拉近 向后滑动拉远
distance -= Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
distance = Mathf.Clamp(distance, MinDistance, MaxDistance);
offset = offset.normalized * distance;
}
//然后在Update里面调用ScrollView方法
视野旋转
采用transform.RotateAround方法,让Camera根据Player的位置旋转
private bool isRotating;
public float rotateSpeed;
private void RotateView()
{
//鼠标右键按下可以旋转视野
if (Input.GetMouseButtonDown(1))
isRotating = true;
if (Input.GetMouseButtonUp(1))
isRotating = false;
if (isRotating)
{
Vector3 originalPosition = transform.position;
Quaternion originalRotation = transform.rotation;
transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X"));
transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));
float x = transform.eulerAngles.x;
//旋转的范围为10度到80度
if (x < 10 || x > 80)
{
transform.position = originalPosition;
transform.rotation = originalRotation;
}
}
offset = transform.position - player.position;
}