Unity3D相机围绕物体自由旋转

阅读: 评论:0

Unity3D相机围绕物体自由旋转

Unity3D相机围绕物体自由旋转

写了一个相机围绕物体360°自由旋转的脚本,比较实用,分享出来给大家使用,配置如下:

Hierarchy界面

 LookPovit:为物体Auto Aircraft的中心空对象;

AroundPovit:用于相机的空对象,作为父类,主要作用是为了保持与被观察物体的位置一致,可防止Auto Aircraft出现抖动而影响相机的抖动;

相机Inspector界面:

相机代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UAroundCamera : MonoBehaviour 
{[Header("围绕目标")]public Transform aroundTargetTrans = null;public Transform aroundPovitTrans = null;[Header("纵向旋转最小/最大角度")]private int VMinAngle = -90;private int VMaxAngle = 90;[Header("横向旋转最小/最大角度")]private int HMaxAngle = -360;private int HMinAngle = 360;[Header("缩放最近/最远距离")]public float minDistance = 20.0f;public float maxDistance = 50.0f;[Header("旋转横向、旋转纵向、缩放速度最大/最小值")]public const float minSpeed = 10f;public const float maxSpeed = 200f;[Header("旋转横向、旋转纵向、缩放速度")][Range(minSpeed, maxSpeed)]public float hSpeed = maxSpeed;[Range(minSpeed, maxSpeed)]public float vSpeed = maxSpeed;[Range(minSpeed, maxSpeed)]public float zSpeed = maxSpeed;	[Header("横向角度、纵向角度、缩放值")]private float hAngle = 0.0f;private float vAngle = 0.0f;private float zoomValue = 0.0f;/// <summary>/// 当前角度/// </summary>private Quaternion curRotation;/// <summary>/// 当前距离/// </summary>private float curDistance;[Tooltip("插值率")]public float lerpRate = 1.0f;[Header("相机初始位置和角度")]public Vector3 initPosition;public Vector3 initAngle;// Use this for initializationvoid Start () {// 初始化curDistance = maxDistance;transform.position = initPosition;transform.eulerAngles = initAngle;vAngle = initAngle.x;hAngle = initAngle.y;}void OnEnable(){}private void Update(){// 检查旋转角度if (Input.GetMouseButton(1)){Cursor.visible = false;hAngle += Input.GetAxis("Mouse X") * (hSpeed) * Time.deltaTime;vAngle -= Input.GetAxis("Mouse Y") * (vSpeed) * Time.deltaTime;}if (Input.GetMouseButtonUp(1)){Cursor.visible = true;}vAngle = ClampAngle(vAngle, VMinAngle, VMaxAngle);hAngle = ClampAngle(hAngle, HMaxAngle, HMinAngle);// 检查缩放zoomValue = Input.GetAxis("Mouse ScrollWheel") * zSpeed * Time.deltaTime;		}private void FixedUpdate(){// 更新围绕中心的位置为目标的中心位置aroundPovitTrans.position = aroundTargetTrans.position;		}// Update is called once per frameprivate void LateUpdate(){// 旋转curRotation = Quaternion.Euler(vAngle, hAngle, 0);Quaternion rotation = Quaternion.ation, curRotation, Time.deltaTime * lerpRate);ation = rotation;// 缩放float distance = curDistance - zoomValue * Mathf.Abs(curDistance); // 当前distance = Mathf.Clamp(distance, minDistance, maxDistance);curDistance = Mathf.Lerp(curDistance, distance, Time.deltaTime * lerpRate);// 更新相机的位置Vector3 position = aroundPovitTrans.position - (rotation * Vector3.forward * curDistance);transform.position = position;// 根据当前距离中心的位置来调整缩放和旋转速率float scaleValue = GetDistanceScale(curDistance);hSpeed = scaleValue * (maxSpeed - minSpeed) + minSpeed;hSpeed = Mathf.Clamp(hSpeed, minSpeed, maxSpeed);vSpeed = scaleValue * (maxSpeed - minSpeed) + minSpeed;hSpeed = Mathf.Clamp(vSpeed, minSpeed, maxSpeed);zSpeed = scaleValue * (maxSpeed - minSpeed) + minSpeed;hSpeed = Mathf.Clamp(zSpeed, minSpeed, maxSpeed);}/// <summary>/// 界面编辑/// </summary>private void OnValidate(){transform.position = initPosition;transform.eulerAngles = initAngle;vAngle = initAngle.x;hAngle = initAngle.y;}/// <summary>/// 限制角度/// </summary>/// <param name="angle"></param>/// <param name="min"></param>/// <param name="max"></param>/// <returns></returns>private static float ClampAngle(float angle, float min, float max){if (Mathf.Abs(angle) > 360){angle = 0;}return Mathf.Clamp (angle, min, max);}/// <summary>/// 获取当前的距离比率值/// </summary>/// <param name="dis">当前距离</param>/// <returns></returns>private float GetDistanceScale(float dis){return (dis - minDistance) / (maxDistance - minDistance);}
}

 温馨提示:该相机脚本实用与飞行器的相机,飞行器在飞行过程中,可360°观察状态^o^!

本文发布于:2024-01-31 00:06:29,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170663079023810.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:物体   相机   自由   Unity3D
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23