unity控制摄像机几种视角实现方式

news2025/4/17 8:31:45

目录

1、按下鼠标右键可以实现摄像机上下左右旋转

2、自由视角

3、摄像头跟随视角

4、跟随自由视角

5、第一人称跟随视角

python学习汇总连接:



1、按下鼠标右键可以实现摄像机上下左右旋转

这段代码定义了一个名为CameraRotate的脚本,用于控制摄像机根据鼠标右键(中键)的移动进行旋转。摄像机将以一定的旋转速度(rotationSpeed)跟随鼠标输入,并且其垂直旋转角度将被限制在最小垂直角度(minVerticalAngle)和最大垂直角度(maxVerticalAngle)之间,以防止过度倾斜。通过使用Quaternion.Lerp函数,摄像机的旋转过程更加平滑自然。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraRotate : MonoBehaviour
{
    //旋转速度
    public float rotationSpeed = 5f;
    //上下旋转角度限制
    public float maxVerticalAngle = 90f;
    public float minVerticalAngle = -90f;
    //旋转缓冲速度
    public float lerpSpeed = 10f;
    private float targetRotationX = 0f;
    private float targetRotationY = 0f;
    void Update()
    {
        if (Input.GetMouseButton(1))
        {
            // 获取鼠标输入的旋转增量
            float rotationXInput = -Input.GetAxis("Mouse Y");
            float rotationYInput = Input.GetAxis("Mouse X");
            // 根据旋转速度进行摄像机的旋转
            targetRotationX += rotationXInput * rotationSpeed;
            targetRotationY += rotationYInput * rotationSpeed;
            // 对上下旋转角度进行限制
            targetRotationX = Mathf.Clamp(targetRotationX, minVerticalAngle, maxVerticalAngle);
            // 根据旋转角度更新摄像机的欧拉角,Quaternion.Lerp可以使摄像机旋转更加平滑
            Quaternion targetRotation = Quaternion.Euler(targetRotationX, targetRotationY, 0f);
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, lerpSpeed * Time.deltaTime);
        }
    }
}

2、自由视角

CameraRotate脚本同样实现摄像机围绕某个物体(target)旋转的功能,当按下鼠标右键时,摄像机会随着鼠标Y轴的移动而上下旋转、X轴的移动而左右旋转,同时确保旋转角度保持在设定范围内。此外,无论摄像机如何旋转,都会始终保持与目标物体之间的特定距离(distance),使摄像机始终围绕物体进行轨道式运动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraRotate : MonoBehaviour
{
    public Transform target;
    public float rotationSpeed = 5f;
    public float maxVerticalAngle = 90f;
    public float minVerticalAngle = -90f;
    public float lerpSpeed = 200f;
    public float distance = 10;
 
    private float targetRotationX = 0f;
    private float targetRotationY = 0f;
 
    void Start()
    {
        if (target == null)
            Debug.LogError("Please assign a target to the orbit camera!");
    }
    void Update()
    {
        if (Input.GetMouseButton(1))
        {
            float rotationXInput = -Input.GetAxis("Mouse Y");
            float rotationYInput = Input.GetAxis("Mouse X");
 
            targetRotationX += rotationXInput * rotationSpeed;
            targetRotationY += rotationYInput * rotationSpeed;
 
            targetRotationX = Mathf.Clamp(targetRotationX, minVerticalAngle, maxVerticalAngle);
 
            Quaternion targetRotation = Quaternion.Euler(targetRotationX, targetRotationY, 0f);
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, lerpSpeed * Time.deltaTime);
        }
        transform.position = target.position - transform.forward * distance;
    }
}

3、摄像头跟随视角

CameraRotate脚本使得摄像机始终跟随在一个指定的目标物体后面,并保持在其正上方一定高度的位置(followHeight)。摄像机位置会以平滑的方式逐渐调整至理想状态,即目标物体正后方特定距离处,通过SmoothDamp函数实现了摄像机跟随过程的平滑过渡。最后,摄像机的方向始终面向目标物体,保证了稳定的跟随视角。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraRotate : MonoBehaviour
{
    public Transform target;
    public float followSpeed = 2f;
    public float followHeight = 4f;
    public float distance = 8f;
 
    private Vector3 velocity = Vector3.zero;
    void Start()
    {
        if (target == null)
            Debug.LogError("Please assign a target to the orbit camera!");
    }
    void LateUpdate()
    {
        Vector3 targetPosition = target.position - (target.forward * distance)+new Vector3(0,followHeight,0);
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, 1f / followSpeed);
        transform.LookAt(target);
    }
}

4、跟随自由视角

在Unity中,实现一个跟随角色的摄像头,并且允许玩家自由旋转视角,通常分为两部分:

  1. 摄像机跟随角色移动
  2. 鼠标控制摄像机自由旋转

下面是一个简单的示例脚本,该脚本将实现这两个功能:

using UnityEngine;

public class CameraFollowAndRotate : MonoBehaviour
{
    public Transform target; // 要跟随的目标对象(例如:角色)
    public float followDistance = 5f; // 跟随距离
    public float heightOffset = 2f; // 高度偏移
    public float rotationSpeed = 100f; // 视角旋转速度
    public float xRotationLimit = 90f; // 水平旋转角度限制

    private Vector3 offset;
    private Quaternion originalRotation;

    void Start()
    {
        // 初始化时记录下摄像机相对于目标初始的位置和旋转
        offset = transform.position - target.position;
        originalRotation = Quaternion.Euler(transform.eulerAngles.x, target.eulerAngles.y, 0);
        
        // 如果需要锁定鼠标光标
        Cursor.lockState = CursorLockMode.Locked;
    }

    void LateUpdate()
    {
        // 跟随目标移动
        Vector3 desiredPosition = target.position + offset;
        desiredPosition.y += heightOffset;
        transform.position = desiredPosition;

        // 自由旋转视角
        float mouseX = Input.GetAxis("Mouse X") * rotationSpeed * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * rotationSpeed * Time.deltaTime;

        // 限制X轴旋转
        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -xRotationLimit, xRotationLimit);

        // 更新摄像机旋转
        Quaternion yRotation = Quaternion.AngleAxis(mouseY, transform.right);
        Quaternion xRotationQuat = Quaternion.AngleAxis(xRotation, Vector3.up);
        transform.rotation = originalRotation * xRotationQuat * yRotation;
    }
}

在这个脚本中,摄像机会保持一定的距离和高度跟随目标对象。同时,通过监听鼠标的水平和垂直输入,允许玩家自由旋转摄像机视角。注意这个例子是第三人称跟随并自由旋转,如果是第一人称视角,处理方式会有所不同。

记得将此脚本挂载到摄像机上,并将target变量设置为你希望摄像机跟随的游戏对象

5、第一人称跟随视角

对于Unity中的第一人称跟随视角,摄像机通常与角色头部绑定,并通过鼠标控制视口的左右旋转。以下是一个简单的实现:

using UnityEngine;

public class FirstPersonCameraFollow : MonoBehaviour
{
    public Transform target; // 角色的头部或相机挂载点
    public float mouseSensitivity = 100f;
    public float yRotationLimit = 90f; // 可选:限制上下的旋转角度

    private float xRotation = 0f;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked; // 锁定鼠标光标以获得更好的第一人称体验
    }

    void LateUpdate()
    {
        // 获取鼠标输入
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        // 更新X轴(左右)旋转
        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -yRotationLimit, yRotationLimit);

        // 更新Y轴(上下)旋转,直接应用到目标对象上
        target.Rotate(Vector3.left * mouseY);

        // 设置摄像机的局部旋转
        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);

        // 摄像机保持在角色头部位置
        transform.position = target.position;
    }
}

在这个脚本中,摄像机将始终位于角色头部的位置,并且可以通过鼠标移动来改变视角的左右旋转。垂直旋转(抬头和低头)直接作用于角色头部,而不是摄像机自身,这是第一人称视角常见的处理方式。

注意,根据项目需求,可能需要调整摄像机的父级关系以及旋转限制等参数。同时,为了确保平滑的旋转效果,可以考虑使用Mathf.SmoothDampAngle函数进行插值处理。

python学习汇总连接:

50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1346667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity坦克大战开发全流程——结束场景——通关界面

结束场景——通关界面 就照着这样来拼 写代码 hideme不要忘了 修改上一节课中的代码

Java项目:103SSM酒店管理系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 酒店管理系统基于SpringSpringMVCMybatis开发,功能简单,可用于毕设或者课程设计。 管理员功能如下: 房间管理住客入住…

图像去雾/图像去雨(matlab/python)

图像去雾和图像去雨是计算机视觉领域的两个重要问题,旨在改善被大气条件或降雨影响而模糊或噪声化的图像质量。这两个技术在很多实际应用中具有广泛的价值,包括无人驾驶、安防监控、航空航天等领域。下面将分点介绍图像去雾和图像去雨的相关内容。 1. 图…

微服务(10)

目录 46.k8s中镜像的下载策略是什么? 47.image的状态有哪些? 48.如何控制滚动更新过程? 49.DaemonSet资源对象的特性? 50.说说你对Job这种资源对象的了解? 46.k8s中镜像的下载策略是什么? 可通过命令k…

IIS服务器发布PHP网站

IIS服务器,相信开发者都不会陌生,它的英文全称是Internet Information Services,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务,常用于Windows系统的Web项目部署,本篇以PHP项目为例,讲解如…

循环生成对抗网络(CycleGAN)

一、说明 循环生成对抗网络(CycleGAN)是一种训练深度卷积神经网络以执行图像到图像翻译任务的方法。网络使用不成对的数据集学习输入和输出图像之间的映射。 二、基本介绍 CycleGAN 是图像到图像的翻译模型,就像Pix2Pix一样。Pix2Pix模型面临…

kotlin快速入门1

在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言。目前主流AndroidApp开发已经全部切换成此语言,因此对于Android开发而言,掌握Kotlin已经变成必要事情。 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言&#xff…

超声波防碰撞电路原理图

如图所示为超声波防碰撞电路,电路采用LM1812并由时基电路Ⅱ来控制LM1812的发送与接收(LM1812,即发送又接收)。控制距离可用Skfl的电位器来调节,一般可控制2-3m。时基电路1组成单稳态电路,当达到报警距离时,…

python安装MongoDB与运算符优先级

python安装MongoDB MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。 PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。 pip 安装 pip 是一个通用的 Python 包…

vue-springboot基于Javaweb的二手儿童绘本网上商城交易系统设计与实现

本二手儿童绘本交易系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了用户、商家和管理员这三者的需求。操作简单易懂,合理分析各个模块的功能,尽…

什么是边缘案例测试?如何查找并确定优先级

何为边缘情况? 在极端条件下发生的情况被称为边缘情况,有时候也叫边界情况,在功能、回归、单元和性能测试中都会应用。如果质量保证团队知道某项功能的最大和最小负载,他们就能防止这些情况发生。当用户不按照程序的预期工作流程…

C语言易错知识点十(指针(the final))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载,请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤ 许久不见,甚是想念,真的是时间时间,你慢些吧,不能再让头发变秃…

EOS运行启动 keosd 和 nodeos

EOS运行启动 keosd 和 nodeos 启动keosd:启动nodeos 安装完eosio后keosd和nodeos是一起带着的,我把EOS的运行keosd 和 nodeos官网教程放上来: https://developers.eos.io/welcome/latest/getting-started-guide/local-development-environment/start-nod…

关于链表的一些问题

求链表的中间节点 可以定义两个指针,一个一次走两步一个一次走一步,当走的快的走到NULL时,走的慢的就是链表的中间节点。(此法求出的偶数个节点的链表的中间节点是它中间的第二个) 求倒数第K个节点 也可以定义两个指…

9. 进程

9. 进程 1. 进程与程序1.1 main() 函数由谁调用1.2 程序如何结束1.2.1 注册进程终止处理函数 atexit() 1.3 何为进程1.4 进程号 2. 进程的环境变量2.1 应用程序中获取环境变量2.1.1 获取指定环境变量 2.2 添加/删除/修改环境变量2.2.1 putenv()2.2.2 setenv()2.2.3 命令行式添加…

软件测试/测试开发丨Linux进阶命令(curl、jq)

1、 curl 接口请求 curl是一个发起请求数据给服务器的工具curl支持的协议FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSPcurl是一个非交互的工具 2、 curl 发起 get 请求 -G:使用get请求-d&#xf…

上海周边公路骑行路线分享,维乐带你抓住秋天的小尾巴

路线一:松江郊里骑行      在魔都上海,藏着一条自然风景适宜,能眺望黄浦江的美丽骑行路线。导航到华长路杨家角就能到达起点,一路向西,这里路况非常好,只有一条小道,没有汽车的障碍&#xf…

蓝牙物联网灯控设计方案

蓝牙技术是当前应用最广泛的无线通信技术之一,工作在全球通用的 2.4GHZ 的ISM 频段。蓝牙的工作距离约为 100 米,具有一定的穿透性,没有方向限制。具有低成本、抗干扰能力强、传输质量高、低功耗等特点。蓝牙技术组网比较简单,无需…

【Linux--多线程同步与互斥】

目录 一、线程互斥1.1相关概念介绍1.2互斥量mutex1.3互斥量接口1.3.1初始化互斥量1.3.2销毁互斥量1.3.3互斥量加锁1.3.4互斥量解锁1.3.5使用互斥量解决上面分苹果问题 1.4互斥原理 二、可重入与线程安全2.1相关概念2.2常见线程不安全的情况2.3常见不可重入的情况2.4 可重入与线…

Python编程-面向对象基础与入门到实践一书的内容拓展

Python编程-面向对象基础与入门到实践一书的内容拓展 通过编程,模拟现实生活中的事物编程,叫做面向对象编程,此过程也叫做实例化编程 简单类的创建 class Test():def __init__ (self,id):self.id iddef print_id(self):print(self.id)这里建…