Unity简单的摄像机控制代码,第三人称,第一人称,场景漫游
摄像机控制器代码
是我最常用的代码,挂到摄像机上面直接可以用

相机功能除了可以第三人称第一人称自由漫游之外,我还做了空间限制功能
包括最大距离限制(黑的),多个(无限)内部限制(不可穿越的区域)
可以用下图的箭头调整限制区域的大小.

可以做出这样的相机限制


using System.Collections.Generic;
using UnityEngine;
public enum CameraControlMode
{
第一人称,
第三人称,
自由漫游
}
[RequireComponent (typeof (Camera))]
public class CameraController : MonoBehaviour
{
const string INPUT_MOUSE_SCROLLWHEEL = "Mouse ScrollWheel";
const string INPUT_MOUSE_X = "Mouse X";
const string INPUT_MOUSE_Y = "Mouse Y";
[Header ("按键开启")]
public KeyCode Key = KeyCode.Mouse1;
[Header ("相机模式")]
public CameraControlMode controlMode;
[Header ("目标")]
public Transform target;
[Header ("旋转速度")]
[Header ("================『相机控制设置』================")]
[Range (0.1f, 5f)]
public float orbitSpeed = 1f;
[Header ("缩放速度")]
[Range (0.1f, 2f)]
public float zoomSpeed = 0.8f;
[Header ("俯视角限制")]
[Range (0.01f, 89.9f)]
public float downEulerLimit = 85f;
[Header ("仰视角限制")]
[Range (0.01f, 89.9f)]
public float upEulerLimit = 85f;
float upLimit = 0, downLimit = 0;
[Header ("最小缩放距离")]
[Header ("================『第三人称设置』================")]
public float minDistance = 2f;
[Header ("最大缩放距离")]
public float maxDistance = 10f;
[Header ("当前缩放距离")]
public float distance = 1f;
[Header ("自由漫游旋转平滑")]
[Header ("================『自由漫游设置』================")]
[Range (0, 1)]
public float rotationlerp = 0.5f;
[Header ("攀升速度")]
public float climbSpeed = 1;
[Header ("正常移动速度")]
public float normalMoveSpeed = 2;
[Header ("下降速度")]
public float slowMoveFactor = 1f;
[Header ("加速度")]
public float fastMoveFactor = 5;
[Header ("空间最大限制")]
[Header ("================『相机移动限制』================")]
public SpaceLimitation MaximumLimit;
[Header ("激活全部控制柄")]
public bool ActivateAllInsideControl = true;
[Header ("空间内部限制")]
public List<SpaceLimitation> spaceInsideLimitations=new List<SpaceLimitation>();
[System.Serializable]
public class SpaceLimitation
{
public Vector2 vectorX = new Vector2 ();
public Vector2 vectorY = new Vector2 ();
public Vector2 vectorZ = new Vector2 ();
[Header ("使用控制柄")]
public bool IsControl = true;
[Header ("区域颜色")]
public Color AeraColor;
[Header ("区域边框颜色")]
public Color AeraLineColor;
}
void Start()
{
if (target == null)
{
GameObject Target = new GameObject ();
Target.name = "Target";
this.target = Target.transform;
}
distance = Vector3.Distance(target.transform.position,transform.position);
updateCameraRotaiont ();
}
/// <summary>
/// 重置相机
/// </summary>
public void ResetCameraLocation()
{
transform.eulerAngles = Vector3.zero;
target.transform.position = new Vector3 (0, 0, 0);
distance = maxDistance;
updateCameraRotaiont ();
}
float rotationX = 0.0f;
float rotationY = 0.0f;
/// <summary>
/// 漫游旋转更新
/// </summary>
void updateCameraRotaiont()
{
rotationX = transform.localEulerAngles.y;
rotationY = -transform.localEulerAngles.x;
if (transform.localEulerAngles.x > 90)
{
rotationY = transform.localEulerAngles.x - 360;
rotationY *= -1;
}
}
void LateUpdate()
{
if (Input.GetMouseButtonDown (0))
{
GameObject rayPointObject;
rayPointObject = getCameraDetectionObj (100);
if (rayPointObject)
target.position = rayPointObject.transform.position;
}
// orbits
switch (controlMode)
{
case CameraControlMode.第一人称:
cameraRotationControl ();
transform.position = target.position;
updateCameraRotaiont ();
break;
case CameraControlMode.第三人称:

最低0.47元/天 解锁文章
2886

被折叠的 条评论
为什么被折叠?



