Unity简单的摄像机控制代码,第三人称,第一人称,场景漫游

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.第三人称:
                
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐沢

狠狠的打赏,找我拿走所有资源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值