【Unity自制手册】Unity—Camera相机跟随的方法大全

news/2024/4/19 17:08:03/

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==1==) 挂载于父对象上进行跟随
    • 🎶(==2==)位置定点跟随,滑轮改变视野
    • 🎶(==3==) 距离差值进行跟随
    • 🎶(==4==) LookAt上帝视角的跟随
    • 🎶(==5==)相机的第一/三人称跟随(添加了跟随点)
    • 🎶(==6==)相机 Lerp差值跟随
    • 🅰️


前言


🎶(1 挂载于父对象上进行跟随



🎶(2位置定点跟随,滑轮改变视野


😶‍🌫️效果:
摄像机需要实现跟随,车同步移动,旋转。并且滑动鼠标滑轮可以调节与车辆之间的摄影距离。

在这里插入图片描述


public class CameraFllow : MonoBehaviour
{//目标物体public Transform target;//鼠标滑轮的速度public float ScrollSpeed = 4f;//Y轴差距参数public float Ydictance = 0f; public float  Ymin = 0f;public float  Ymax  = 4f;//Z轴差距参数public float Zdictance = 4f;public float Zmin = 4f;public float Zmax = 8f;//相机看向的角度 和最終位置public float angle = -25 ;public Vector3 lookPosition;void LateUpdate(){//Z轴和Y轴的距离和鼠标滑轮联系Ydictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed;Zdictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed;//設置Y軸和x轴的滚轮滑动范围Ydictance = Mathf.Clamp(Ydictance , Ymin ,Ymax );Zdictance = Mathf.Clamp(Zdictance , Zmin, Zmax );//确定好角度,四元数 * 三维向量 = 三维向量lookPosition = Quaternion.AngleAxis(angle, target .right) * -target.forward ;//更新位置transform.position = target.position + Vector3.up * Ydictance - lookPosition  * Zdictance  ;//更新角度transform.rotation = Quaternion.LookRotation(lookPosition);}
}

🎶(3 距离差值进行跟随


在这里插入图片描述

public class CameraMove : MonoBehaviour
{public Transform target; //跟随的目标物体private Vector3 offset;  //位置偏移差void Start(){offset = transform.localPosition - target.transform.localPosition;}private void FixedUpdate(){if (target){transform.rotation = target.rotation ;transform.rotation *= Quaternion.AngleAxis(-15, Vector3.left);transform.position = target.transform.localPosition + offset;}}}

🎶(4 LookAt上帝视角的跟随


在这里插入图片描述

public class CameraMove : MonoBehaviour
{public Transform target; //跟随的目标物体private Vector3 offset;  //位置偏移差void Start(){offset = transform.localPosition - target.transform.localPosition;}private void FixedUpdate(){if (target){           transform.rotation = target.rotation ;           transform.position = target.transform.localPosition + offset;transform.LookAt(target.position +Vector3 .up*3);}}}

🎶(5相机的第一/三人称跟随(添加了跟随点)


  • 为了实现相机和人物的镜头旋转保持一致,(达到相机作为子对象的效果)
  • 所以只需要再父对象中添加一个跟随点作为其子对象
    在这里插入图片描述
    在这里插入图片描述
public class CameraMove : MonoBehaviour
{public Transform target; //跟随的目标物体private Vector3 offset;  //位置偏移差void Start(){offset = transform.position - target.GetChild(0).position;//target的第一个子对象是相机的跟随点}private void FixedUpdate(){if (target){           transform.rotation = target.GetChild(0).rotation ;           transform.position = target.GetChild(0).position+ offset;transform.LookAt(target.position + Vector3 .up*2.5f);///transform.rotation = target.rotation;}}}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能:  玩家的移动
//___________创建者:___秩沅____
//_____________________________________
//-------------------------------------
public class PlayerMove : MonoBehaviour
{private float vertical;private float horizontal;private float mousePosition;private CharacterController player; //角色控制器private Vector3 moveDerictor;       //移动的方向public  float  velocity = 2f;       //移动的速度public  float roVelocity = 10f;private Animator playerAnimatior;private void Awake(){player = GetComponent<CharacterController>();playerAnimatior = GetComponent<Animator>();}private void FixedUpdate(){vertical   =  Input.GetAxis("Vertical") ;horizontal =  - Input.GetAxis("Horizontal") ;mousePosition = Input.GetAxis("Mouse X");//旋转transform.localRotation *= Quaternion.Euler(0, mousePosition * roVelocity, 0);if (vertical != 0 ||horizontal != 0){        //移动playerAnimatior.SetFloat("SpeedWS", (int)vertical);playerAnimatior.SetFloat("SpeedAD", (int)horizontal);moveDerictor = new Vector3(vertical, 0, horizontal);print(moveDerictor.normalized);/// moveDerictor = moveDerictor.normalized;   //将方向变成单位向量//transform.position= transform.position + moveDerictor.normalized*Time .deltaTime ;player.SimpleMove(transform.forward * vertical );player.SimpleMove(transform.right * -horizontal);//GetComponent<Rigidbody>().MovePosition( transform.localPosition + moveDerictor * velocity * Time.deltaTime); //速度*方向 = 向量//此时物体并非跟着自己的旋转方向进行移动而是根据自身位置进行改变//(白话:无法变成FPS的第一视角进行当前视角当前前进)       }}private void MouseRotation(){}}

🎶(6相机 Lerp差值跟随


在这里插入图片描述

     transform.position = Vector3.Lerp(transform.position, target[ChooseIndex].position, Time.deltaTime * speed);transform.LookAt(targetOb );

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述



http://www.ppmy.cn/news/1364139.html

相关文章

為什麼使用海外動態代理IP進行網路爬蟲?

網路爬蟲作為獲取網路數據的重要工具&#xff0c;其重要性不言而喻。但隨著網站反爬策略的日益嚴格&#xff0c;爬蟲任務變得愈發困難&#xff0c;不過海外動態代理IP可以很好地解決這一問題。本文將詳細闡釋動態代理IP在爬蟲中的應用&#xff0c;以及如何使用動態代理IP提升爬…

嵌入式系统在物联网中的应用与发展趋势

嵌入式系统在物联网中的应用与发展趋势 嵌入式系统在物联网中扮演着至关重要的角色&#xff0c;它们是连接物理世界和数字世界的桥梁&#xff0c;实现了物体之间的互联互通。以下是嵌入式系统在物联网中的应用与发展趋势的几个方面&#xff1a; 1. 应用领域 智能家居&#x…

Linux系统部署前后端分离项目

一、Nginx简介 1.1 什么是nginx? Nginx&#xff08;发音同"engine x"&#xff09;是一个高性能的反向代理和 Web 服务器软件&#xff0c;最初是由俄罗斯人 Igor Sysoev 开发的。Nginx 的第一个版本发布于 2004 年&#xff0c;其源代码基于双条款 BSD 许可证发布&am…

【UnityShader入门精要学习笔记】第六章(1)Unity中的基础光照

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 光照的原理光源吸收和散射着…

mysql开启远程访问并开启3306端口

登陆mysql mysql -u root -p设置允许访问的地址 如果你想允许用户root从ip为192.168.1.123的主机连接到mysql服务器&#xff0c;并使用password密码登录。&#xff08;根据情况自行替换&#xff09; GRANT ALL PRIVILEGES ON *.* TO root192.168.1.123 IDENTIFIED BY passwo…

eureka注册中心做了哪些事情/原理?

1.服务注册&#xff1a; 将eureka client发送过来的元数据存储到注册表中 2.服务续约&#xff1a; eureka client默认会每30秒向eureka server发送一次心跳来进行服务续约&#xff0c;通过这一行动来表示自己没有出现故障&#xff1b; 3.服务…

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法&#xff0c;分别是&#xff1a;灰度世界(G…

10 款数据恢复软件功能和有效性对比(2024 年更新)

数据丢失可能是一种痛苦的经历&#xff0c;无论是由于意外删除、硬件故障还是软件损坏。值得庆幸的是&#xff0c;数字时代带来了强大的数据恢复解决方案。 随着我们进入 2024 年&#xff0c;市场上充斥着旨在有效检索丢失数据的先进软件。在本文中&#xff0c;我们将探讨 2024…

分销小程序有哪些功能?

​分销类型的小程序在电商领域非常普遍受到欢迎。分销类型的小程序是指通过分销模式&#xff0c;让用户成为商品的分销商&#xff0c;通过分享商品链接或小程序码&#xff0c;推广商品并获取相应的佣金。我们开发的分销小程序的主要功能如下&#xff1a; 1. 商品管理&#xff…

Windows上基于名称快速定位文件和文件夹的免费工具Everything

在Windows上搜索文件时&#xff0c;使用windows上内置搜索会很慢&#xff0c;这里推荐使用Everything工具进行搜索。 "Everything"是Windows上一款搜索引擎&#xff0c;它能够基于文件名快速定位文件和文件夹位置。不像Windows内置搜索&#xff0c;"Everything&…

Maven jar 的查找及依赖版本确定

关于 jar 的查找&#xff0c;及使用版本的确定&#xff0c;及依赖的版本确认&#xff0c;避免 jar 冲突或版本不兼容 在使用 maven 构建项目时&#xff0c;需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖&#xff0c;这里以查找 mybatis 依赖为例&…

LeetCode 刷题 [C++] 第438题.找到字符串中所有字母异位词

题目描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 题目分析 在字符串 s中使用同向双指针来查…

【设计模式】5种创建型模式详解

创建型模式提供创建对象的机制,能够提升已有代码的灵活性和复用性。 常用的有&#xff1a;单例模式、工厂模式&#xff08;工厂方法和抽象工厂&#xff09;、建造者模式。不常用的有&#xff1a;原型模式。 一、单例模式 1.1 单例模式介绍 1 ) 定义 单例模式&#xff08;Si…

Spring Cloud项目合规性注册之-(单元集成测试报告)

用于合规性注册&#xff0c;本文章仅提供模板 这个大纲涵盖了从单元测试到集成测试&#xff0c;再到自动化和持续集成的全方位测试过程。 一、引言 1. 项目概述 "xxxxxx"是一个先进的数据管理和展示平台&#xff0c;旨在提供高效、可靠的数据服务。该平台通过集成各…

hive内置函数--floor,ceil,rand三种取整函数

文中三种取整函数操作目录&#xff1a; 一、向下取整函数: floor ​​​​​​​二、向上取整函数: ceil ​​​​​​​​​​​​​​三、取随机数函数: rand ​​​​​​一、向下取整函数: floor 语法: floor(double a) 返回值: BIGINT 说明:返回等于或者小于该doubl…

Flutter 中 Gap 和 SizedBox 的比较与区别

在 Flutter 中&#xff0c;两个小部件在控制应用设计布局尺寸和空间方面起着至关重要的作用&#xff0c;它们是 SizedBox 和 Gap 小部件。 在 Flutter 中构建响应式布局时&#xff0c;间距和大小很重要。框架提供了一些简单但功能强大的小部件来控制间距和大小&#xff0c;Siz…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

刷题日记 | 字符串扩容和增强型for循环

for(char c:s)遍历字符串 增强型for循环 C for(char c:s)遍历字符串 增强型for循环_c for (char c : s)-CSDN博客 字符串使用前要进行扩容 reserve函数 【CString类成员函数辨析】resize(),size(),capacity(),reserve()函数的解析与对比_c reserve函数-CSDN博客 a.size() 用来…

WinForms中的Timer探究:Form Timer与Thread Timer的差异

WinForms中的Timer探究&#xff1a;Form Timer与Thread Timer的差异 在Windows Forms&#xff08;WinForms&#xff09;应用程序开发中&#xff0c;定时器&#xff08;Timer&#xff09;是一个常用的组件&#xff0c;它允许我们执行定时任务&#xff0c;如界面更新、周期性数据…

SpringBoot:Invalid bound statement (not found)的原因和解决方案

&#x1f413; 报错信息&#xff1a; &#xff08;无效绑定声明&#xff09;找不到 解析&#xff1a; 你的mapper实例对象和对应的mapper.xml对象未找到 &#x1f413; 排查&#xff1a; 情况一&#xff1a; 1.排除相对应的mapper实例对象路径是否正确 查看相对应的mapper中…