Unity3D相机围绕物体自由旋转

这篇具有很好参考价值的文章主要介绍了Unity3D相机围绕物体自由旋转。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Hierarchy界面

Unity3D相机围绕物体自由旋转

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

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

相机Inspector界面:

Unity3D相机围绕物体自由旋转

相机代码如下:

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 initialization
	void 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 frame
	private void LateUpdate()
    {
		// 旋转
		curRotation = Quaternion.Euler(vAngle, hAngle, 0);
		Quaternion rotation = Quaternion.Lerp(transform.rotation, curRotation, Time.deltaTime * lerpRate);
		transform.rotation = 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^!文章来源地址https://www.toymoban.com/news/detail-509177.html

到了这里,关于Unity3D相机围绕物体自由旋转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D-场景中3D物体添加点击事件

    Unity3D - 场景中3D物体添加鼠标点击事件 鼠标点击3D物体触发,Unity从本质上来说有两种:一种是通过事件(event)触发,一种是通过射线(ray)判断穿过的物体触发。这两种触发的原理是不同的,不论哪种触发都必须满足触发的要求才可以,既然原理不同,触发的要求也不一样

    2024年02月08日
    浏览(72)
  • unity3d---移动、缩放、旋转

    目录 1.示意图 2.触屏移动与缩放+键盘移动、旋转与缩放+鼠标移动旋转与缩放 1.示意图   2.触屏移动与缩放+键盘移动、旋转与缩放+鼠标移动旋转与缩放

    2024年02月06日
    浏览(59)
  • Unity3D 脚本3(旋转)

    一、物体的旋转 给物体调转一个旋转角度。 1、Quaternion四元组(x,y,z,w) transfrom.rotation()=... 不方便操作,官方不建议用 2、Euler Angle 欧拉角 transfrom.eulerAngles = new Vector(0,45,0); transfrom.LocalE ulerAngles = new Vector(0,45,0); 这样就可以让物体旋转45度。 在Update 中修改角度持续旋转 Vecto

    2023年04月16日
    浏览(70)
  • 【Unity3D】缩放、平移、旋转场景

    1 前言         场景缩放、平移、旋转有两种实现方案,一种是对场景中所有物体进行同步变换,另一种方案是对相机的位置和姿态进行变换。         对于方案一,如果所有物体都在同一个根对象下(其子对象或孙子对象),那么只需要对根对象施加变换就可以实现场景变

    2023年04月22日
    浏览(53)
  • Unity3D_物体抛物线运动

    参考:Unity 贝塞尔曲线实现抛物线运动,投掷功能实现  用到了DOTween插件, 回想起之前不知道这个插件还在用协程和SmoothDamp做运动控制的自己仿佛是个哈批 路径绘制使用的LineRenderer

    2024年02月13日
    浏览(63)
  • Unity3D物体自动躲避障碍物

            2017.4.4f1         物体向前发射一个射线,检测到碰撞后,根据碰撞信息选择新的方向。最终结果如下。 通过发射虚拟胶囊体来检测碰撞api bool Physics.CapsuleCast (Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hit, float maxDistance)  points参数如图所示,

    2023年04月24日
    浏览(64)
  • 多层Unity3D物体模型穿透问题处理

    如图,当我们想要在同一个界面中展示两层或以上3D物体时,有时会因为第一层物体材质上的 shader 渲染深度被破坏或其它原因导致第一层的物体穿透到第二层界面上来了。 在 Scene 视图中这三个橙色球体原本是在第二层黄色背景之下的: 但是在 Game 视图中我们发现那三个橙色

    2024年02月02日
    浏览(61)
  • unity3D 鼠标滚轮实现物体的大小缩放

    鼠标滚轮响应函数是Input.GetAxis(\\\"Mouse ScrollWheel\\\"),函数返回值类型是float,向前滚是返回正数,向后滚是返回负数,且鼠标滚轮滑动单次函数返回值为0.1 利用返回值修改模型transform.localscale,实现模型缩放 鼠标滚轮一直向后滚,会看见模型逐渐变小,当变到很小到消失的时候,

    2024年02月08日
    浏览(71)
  • Unity3d中关于物体穿透模型和物体移动的一些问题

    第一:可能是没有设置刚体和碰撞体; 第二种:一般是由于被穿透物体太过于薄弱,根本没有检测到碰撞的问题,这种情况可以把物体加厚。但偶尔是不能解决问题的,因为这种情况下是由于物体移动的速度过快导致的。 第三;关于物体自己动的问题,那是物体移动脚本和物

    2024年02月11日
    浏览(73)
  • Unity3d 物体不动,碰撞触发不了的情况

    问题: 有一种情况,主角带刚体,主角站着不动。玩家站在陷阱上,陷阱的碰撞体 Toggle 之后, OnCollisionEnter 触发不了。 解决:盲猜玩家组件上才有刚体,而碰撞检测是刚体运动的时候,才进行检测的。

    2024年02月06日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包