Unity_相机灵活跟随角色移动

news2024/11/18 16:29:40

每日一句:慢慢改变,慢慢成长,慢慢适应,慢慢优秀

目录

角色旋转、移动类

相机跟随人物移动类


角色旋转、移动类

/*旋转刚体,位移的动画驱动移动*/

using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class PlayerMoement : MonoBehaviour

{

   

    public float turnSmooting = 15f;

    public float speedDampTime = 0.1f;

    private Animator animator;

  

    void Start()

    {

        animator = GetComponent<Animator>();

     

    }

   

    //不受帧率影响,有物理计算的时候使用,不会因为帧率影响卡帧

    private void FixedUpdate()

    {

        float h = Input.GetAxis("Horizontal");

        float v = Input.GetAxis("Vertical");

        MovementManagement(h, v);

    }

    //旋转方法,参考绝对坐标系

    void Ratating(float h, float v)//(横轴的值,纵轴的值)

    {

        //按下横轴和纵轴的键,前左、前右,后左、后右,向量,player朝向的目标向量

        Vector3 targetDir = new Vector3(h, 0, v);

        Quaternion targetRotation = Quaternion.LookRotation(targetDir);//绝对的旋转量,旋转刚体,位移的动画驱动移动

        Rigidbody rb = GetComponent<Rigidbody>();

        Quaternion newRotation = Quaternion.Lerp(rb.rotation, targetRotation, turnSmooting * Time.deltaTime);

        4(newRotation);



    }

    void MovementManagement(float h, float v)

    {      

        if (h != 0 || v != 0)//如果按先后左右键了

        {

            Ratating(h, v);

            animator.SetBool("Walk", true);//插值

        }

        else

        {

            animator.SetBool("Walk", false);

        }

    }

}

相机跟随人物移动类

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class CameraMovement : MonoBehaviour

{

    //用插值方法移动

    float smooth = 1.5f;

    Transform player;

    Vector3 playerToCamera;

    float playerToCameraMag;

    Vector3 newPos;    //计算的结果

    // Start is called before the first frame update

    void Start()

    {

        player = GameObject.FindWithTag(Tags.Player).transform;

        playerToCamera = transform.position - player.position;//a-b等到b指向a的向量

        playerToCameraMag = playerToCamera.magnitude;//计算它的模

    }

    //射线检测,看击中的是不是player

    bool ViewingPositionCheck(Vector3 checkPos)

    {

        RaycastHit hit;

        if (Physics.Raycast(checkPos, player.position - checkPos, out hit, playerToCameraMag))//检测点到plyer的方向

        {

            if(hit.transform!=player)

            {

                return false;

            }

        }

        newPos = checkPos;

        return true;

    }

    void SmoothLookAt()

    {

        Vector3 camDirction = player.position - transform.position;//摄像机指向player的向量

        Quaternion lookAtRotation = Quaternion.LookRotation(camDirction);

        //将方向转化为旋转角度:

        //传入一个方向将返回一个旋转角,当某个物体被施加这个旋转角后,这个物体的forward方向将指向传入的方向。

        transform.rotation = Quaternion.Lerp(transform.rotation, lookAtRotation, smooth * Time.deltaTime);

    }

    private void FixedUpdate()

    {

        Vector3 standardPos = player.position + playerToCamera;

        Vector3 abovePos = player.position + Vector3.up * playerToCameraMag;//0,1,0上方高度

        Vector3[] checkPoints = new Vector3[5];

        checkPoints[0] = standardPos;

        checkPoints[1] = Vector3.Lerp(standardPos, abovePos, 0.25f);

        checkPoints[2]= Vector3.Lerp(standardPos, abovePos, 0.5f);

        checkPoints[3]= Vector3.Lerp(standardPos, abovePos, 0.75f);

        checkPoints[4] = abovePos; 

        for(int i=0;i<checkPoints.Length;i++)

        {

            if(ViewingPositionCheck(checkPoints[i]))

            {

                break;//每次传过来0到4 的点,之后进行射线检测,break 出来,找到了一个合适的点,newPos里

            }

        }

        transform.position = Vector3.Lerp(transform.position, newPos, smooth * Time.deltaTime);

        SmoothLookAt();

    }

}

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

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

相关文章

一套完整的软件测试面试流程(面试题),这些题你真的都能答上吗?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自我介绍 2、…

外汇天眼:外汇交易商常见黑心手法大公开!投资务必留意这5种骗局

众所周知&#xff0c;外汇市场无论在交易量、流动性方面都是世界之最&#xff0c;如今随着网络科技愈来愈发达&#xff0c;任何人都能通过手机使用全球的经纪商&#xff0c;随时随地在线上进行外汇保证金交易。 然而&#xff0c;市面上充斥各种黑平台与假券商&#xff0c;投资人…

神经网络中卷积和池化的区别

1、什么叫卷积&#xff1f; 卷积层是用一个固定大小的矩形区去席卷原始数据&#xff0c;将原始数据分成一个个和卷积核大小相同的小块&#xff0c;然后将这些小块和卷积核相乘输出一个卷积值&#xff08;注意这里是一个单独的值&#xff0c;不再是矩阵了&#xff09;。 卷积的…

智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析

智能合约漏洞&#xff0c;价值 5200 万美元的 Vyper 漏洞攻击原理分析 7 月 30 日&#xff0c;因为 Vyper 部分版本中的漏洞&#xff0c;导致 Curve、JPEG’d 等项目陆续受到攻击&#xff0c;损失总计超过 5200 万美元。 Safful 对此事件第一时间进行了技术分析&#xff0c;并…

WebDAV之π-Disk派盘 + 书藏家

书藏家是一款书籍收藏的软件,对于喜欢阅读书籍的用户来说非常友好,记录你所阅读的书籍内容,对你所阅读的书籍内容进行全方位的管理,并且支持多种录入的方式,不管是实体书籍还是网络书籍都能够进行更为有效的管理;内置WebDAV 模块,更加便利的整理自己的文件资源;书藏家的…

三维模型3DTile格式轻量化云端处理技术方法分析

三维模型3DTile格式轻量化云端处理技术方法分析 在现代的地理信息系统 (GIS) 中&#xff0c;3D Tiles 是一种很重要的数据格式&#xff0c;用于存储和传输大规模地理空间数据。然而&#xff0c;由于其数据密度高&#xff0c;传输和加载过程中非常消耗资源&#xff0c;因此需要采…

element-ui的 el-option如果label为空显示value问题处理

element-ui的 el-option如果label为空显示value问题处理 问题描述我的第二项没有lable值直接取的value 处理办法定义一个函数处理一下 function toStr(str) {let data;if (str) {data encodeURI(str);} else {data 暂无名称;}data data.replace(/ /g, %20);return decod…

MySql运维篇---009:分库分表:垂直拆分、水平拆分、通过MyCat进行分片,读写分离:一主一从、 双主双从

3.分库分表 3.1 介绍 3.1.1 问题分析 使用单个数据库存储所有的数据&#xff0c;如果磁盘和内存和内存不足了可以增大磁盘和内存&#xff0c;但是对于一台服务器的磁盘和内存不可能无限制的扩张下去&#xff0c;它是受我们服务器的硬件影响的&#xff0c;如果说数据库所存储…

查看和分析 IIS 日志文件以增强 Web 服务器安全性

Microsoft IIS服务器&#xff0c;无论是Web还是FTP&#xff0c;对于企业来说都是必不可少的。但是&#xff0c;IT 安全管理员的工作并不止于部署 IIS 服务器。部署后&#xff0c;管理员必须采取安全措施来保护这些服务器&#xff0c;监控 IIS 服务器安全性的一种行之有效的方法…

BC v1.2充电规范

1 JEITA Reference to https://www.mianbaoban.cn/blog/post/169964 符合 JEITA 规范的锂离子电池充电器解决方案 2 Battery Fuel Gauge 2.1 Cycle Count&#xff08;充放电循环次数&#xff09; 此指令回传一只读字段&#xff0c;代表电芯组已经历的完整充放电循环数。当放电容…

Pulsar简介及其安装

Pulsar简介及其安装 简介特征Pulsar 本地安装与运行Pulsar集群安装jdk版本映射关系下载解压 Pulsar 本地安装与运行Pulsar集群安装jdk版本映射关系下载解压解压目录介绍 启动创建topic发送消息消费消息停止 简介 Apache Pulsar 是 Apache 软件基金会顶级项目&#xff0c;是下一…

host配置

配置host文件的作用主要是用于自定义域名与IP地址之间的映射关系。Host文件是一个操作系统用于将人类可读的域名&#xff08;例如&#xff1a;www.example.com&#xff09;映射到IP地址&#xff08;例如&#xff1a;192.168.1.1&#xff09;的文件。当你在浏览器中输入一个网址…

欠酸洗,异物压入,斑迹和脏污 学习笔记

欠酸洗&#xff1a; 带钢的宽度方向上&#xff0c;可能会出现在整个宽度或某个局部宽度区域的特殊分布。这种分布看起来像波浪或鱼鳞的痕迹。这种情况通常在带钢的开始和结束部分更为常见。 异物压入 通常&#xff0c;这种情况是由于圆点或小条状的粉尘和颗粒被压入所导致的…

一站式工单系统哪家好?一站式工单系统有什么特点?

伴随着高新科技的不断发展和行业竞争的加重&#xff0c;对于一站式工单系统这一类的公司服务系统软件有着越来越多的流程规定和可靠性的要求。一个比较完善的智能化一站式工单系统包含众多的流程&#xff0c;并适用更广泛性的企业信息化&#xff0c;接下来我们将一起看看一站式…

MyLife - Docker安装MySQL

Docker安装MySQL 个人觉得像数据库之类的基础设施在线上环境直接物理机安装使用可能会好些。但是在开发测试环境用docker容器还是比较方便的。这里学习下docker安装mysql使用。 1. MySQL 镜像库地址 MySQL 镜像库地址&#xff1a;https://hub.docker.com/_/mysql/tags 这里是官…

HP打印机一点击打印就出现Windows资源管理器已停止工作问题解决

本次处理的打印机型号是HP Officejet 200 移动便携式打印机&#xff0c;不过其他型号如果出现类似现象&#xff0c;解决方法应该是一致的。 在弹出Windows资源管理器已停止工作的报错提示框后&#xff0c;点击左下角的详细信息&#xff0c;看到的内容显示是KernelBase.dll崩溃…

10月10日星期二今日早报简报微语报早读

10月10日&#xff0c;星期二&#xff0c;早报简报微语早读分享。 1、全国铁路国庆黄金周运输发送旅客1.95亿人次&#xff1b; 2、贵州公安&#xff1a;三名抢劫杀人嫌犯潜逃至缅北电诈窝点&#xff0c;全部落网&#xff1b; 3、四川&#xff1a;游客擅自进入未开发开放游览活动…

Redis(六) 内存策略

文章目录 Redis内存回收一、过期策略Redis是如何知道一个key是否过期的&#xff1f;是不是TTL到期就立即删除呢&#xff1f; 二、淘汰策略 Redis内存回收 一、过期策略 Redis是如何知道一个key是否过期的&#xff1f; 利用两个Dict分别记录key-value对及key-ttl对 是不是TTL到…

Elasticsearch:什么是检索增强生成 - RAG?

在人工智能的动态格局中&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation - RAG&#xff09;已经成为游戏规则的改变者&#xff0c;彻底改变了我们生成文本和与文本交互的方式。 RAG 使用大型语言模型 (LLMs) 等工具将信息检索的能力与自然语言生成无缝结合…

LLVM(5)ORC实例分析

ORC实例总结 总结 因为API茫茫多&#xff0c;逻辑上的一些概念需要搞清&#xff0c;编码时会容易很多。JIT的运行实体使用LLVMOrcCreateLLJIT可以创建出来&#xff0c;逻辑上的JIT实例。JIT实例需要加入运行库&#xff08;依赖库&#xff09;和用户定义的context&#xff08;…