【Unity入门】10.物体的运动

news2024/11/25 0:25:38

【Unity入门】物体的运动

    大家好,我是Lampard~~

    欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢

(一)用脚本驱动物体移动

(1)制作一台运动的小车

    回顾上一篇文章,我们已经可以用脚本获取挂载对象的信息,并且在update方法中,令物体动起来了。这篇博客我们制作一台小车,用上上节课的脚本看看小车能不能跑起来

     首先我们把之前挂载Audio控件的小车重新创建出来,然后把它的Position和Rotation的值归0.可以发现当前的车头方向正是我们的Z轴方向

    因此我们把上一节课脚本里,每一帧对X的改动修改成对Z的改动,更符合小车朝车头开的印象

     然后把脚本拖动至小车对象上就可以了,运行看看:

(2)transform.Translate

    之前的脚本是通过创建一个Vector3的值然后重新赋值给transform.localPosition,但其实有一个Translate方法可以帮我们完成这个任务,只需要传入需要变化的位置信息就可以了

    以下是Translate方法的定义:

transform.Translate是Unity引擎中Transform组件的一个方法,用于平移物体。该方法接受一个三维向量作为参数,表示需要平移的距离和方向。平移距离和方向的单位是世界坐标系中的单位

    因此我们的代码可以改成这样:

    void Update()
    {
        Vector3 localPos = this.transform.localPosition;
        float DisPreSec = 6f;
        //localPos.z += DisPreSec * Time.deltaTime;
        //this.transform.localPosition = localPos;
        this.transform.Translate(0, 0, DisPreSec * Time.deltaTime);
    }

(二)改变运动的朝向

(1)朝着红旗前进

    假设这台小车车有一个移动的目标,我们需要朝着红旗对象前进,驶向终点那要如何做呢?

    首先创建一个红旗对象,然后随便放置一个位置

(2)获取红旗物体

    然后为了能使小车的车头朝向红旗,我们需要获取到红旗的位置。在获取红旗位置之前,我们就需要在脚本中先获取到红旗这个对象

    怎么做呢?可以通过GameObject.Find这个静态方法来寻得红旗

GameObject.Find是Unity引擎中的一个方法,用于查找场景中指定名称的游戏物体。该方法接受一个字符串作为参数,表示需要查找的游戏物体的名称,返回一个代表该游戏物体的GameObject对象

    而用法也很简单,直接把目标的名字传入就可以了

GameObject flag = GameObject.Find("红旗");

  (3)transform.LookAt

    获取到红旗这个对象,下一步我们就可以调整车头方向了。当然我们可以通过手动计算出两个物体当前的便宜角度,但阿发老师直接给我们提供了一个更好用的接口:transform.LookAt

transform.LookAt是Unity引擎Transform组件中的一个方法,用于使物体朝向指定的目标位置。该方法接受一个三维向量作为参数,表示需要朝向的目标位置

    只需要调用这个方法,就把车头位置朝向红旗了

    void Update()
    {
        GameObject flag = GameObject.Find("红旗");
        this.transform.LookAt(flag.transform);

        Vector3 localPos = this.transform.localPosition;
        float DisPreSec = 6f;
        this.transform.Translate(0, 0, DisPreSec * Time.deltaTime);
    }

    看看效果:

(4)代码优化

    首先,每一秒是update60次,我们不需要每一次都让车头lookAt红旗,我们只需要执行一次就可以了,因此我们可以把红旗对象定义为脚本全局变量,这样只需要在start方法中lookAt一次就行了

    然后就是,小车驶向红旗之后,直接就碾了过去,好像也不太科学。我们可以让小车在红旗跟前就停下,操作很简单只需要判断当前的距离足够近,若是就不用移动就可以了,加上一个if判断

    void Update()
    {
        float distance = Vector3.Distance(this.transform.position, flag.transform.position);
        if (distance > 3f) {
            Vector3 localPos = this.transform.localPosition;
            float DisPreSec = 6f;
            this.transform.Translate(0, 0, DisPreSec * Time.deltaTime);
        }
    }

    看看效果:

好啦今天就到这里,感谢阅读!!!
点赞,关注!!!

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

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

相关文章

Allegro thermal relief热风焊盘

为了画个通孔焊盘,看了很久的 Thermal relief相关的内容,终于基本上理解了。记录一下。 这篇文章讲得非常清楚: 深入理解Allegro之Thermal Relief与Anti Pad - 百度文库 (baidu.com) 热风焊盘般用在内层,减少一些焊盘和铜皮的连…

某vm样本的分析

背景 驱动那块(MiDeadPteTrackerSListHead) 从遥远的东方收到的一个样本,好嘛!打开之后一直不停的在创建和结束进程,又是vmp。 还是老方法,dmp下来之后看看,好嘛,main函数被vm了&am…

大数据技术之Hive

第1章Hive基本概念1.1 Hive1.1.1 Hive的产生背景在那一年的大数据开源社区,我们有了HDFS来存储海量数据、MapReduce来对海量数据进行分布式并行计算、Yarn来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑,开发人员要编写MR来对数据进行统计…

stm32学习第四天

DMA1:各个通道一览 DMA2:各个通道一览 1.stm32DMA相关固件库函数说明 第一个参数选择哪一个DMA的哪一个通道 初始化函数 void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); typedef struct {uint32_t DMA_Periph…

Vue项目中关于全局css的处理

Vue项目中关于全局css的处理步骤一:定义声明全局CSS的样式文件(common.scss)步骤二:挂载到全局封装一:对common.scss拆分封装二:新建index.scss,对elementPlus或者element-ui样式进行覆盖封装三:variable.s…

一、ts学习第一课:环境配置

一、下载node 官网:Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 推荐下载左侧稳点版的node,下载好了,就一步步点击安装就ok了。 判断是否已经下载好了node,在命令行…

BIO和NIO的区别与实现

目录 目标 概述 实战 单线程版本的BIO 多线程版本的BIO 单线程NIO(简易版) 单线程NIO(多路复用版) 客户端发送数据的方法 目标 了解BIO和NIO的区别和应用场景。分析BIO和NIO的线程模型,利用Socket实现BIO和NI…

pytorch 笔记

1.python文件、python控制台Terminal、jupyter代码执行比较 2.Dataset和Dataloader dataset存储数据集,dataloader从数据集中批量加载数据,如 把 dataset 放入 DataLoaderloader Data.DataLoader(datasettorch_dataset, # torch TensorDataset forma…

MIPI D-PHYv2.5笔记(17) -- Global Operation Flow Diagram、数据速率依赖参数

声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 Global Operation Flow Diagram 图1 Data Lane Mod…

【Linux】线程概念详析

我们已经了解了Linux操作系统进程部分相关知识: 博主有关Linux进程相关介绍的文章: 💥[Linux] 系统进程相关概念、系统调用、Linux进程详析、进程查看、fork()初识 💥[Linux] 进程状态相关概念、Linux实际进程状态、进程优先级 …

【超算/先进计算学习】日报1

目录今日已完成任务列表遇到的问题及解决方案任务完成详细笔记Darknet框架优化介绍darknet介绍YOLO高性能计算与超级计算机简介算力超级计算机概念与体系结构并行编程技术Linux常用操作命令Linux操作系统与指令使用机器信息查询文件、目录和权限文件内容查看环境变量使用对自己…

15.枚举

枚举 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造方法、定义成员变量和方法,也能实现接口,但枚举类不能继承其他类。枚举是一个被命名的整型常数的集合,用于声明一组…

Linux系统下安装zookeeper教程

将下载好的zookeeper上传到linux服务器上,这里使用的是FileFilla 解压:[rootcentos7964 software]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz 进入刚刚解压后的文件夹,创建一个名字为data的文件夹,如下: [rootc…

分库分表--shardingjdbc

文章目录前言一、shardingjdbc简介作用二、如何使用1.我有个表现在体量太大了,我想做分库分表2.开始改造1 引入shardingjdbc2 更改yml文件3 测试看效果3.旧数据迁移4.其他分库类型5 部分配置说明总结前言 当项目开始的时候,没有想到后续的分库分表的话,其实对于后续的分库分表…

MYSQL学习 - DDL数据库操作

前言 从今天开始, 健哥就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 ------------------------------前戏已做完,精彩即开始---…

【数据结构】树和二叉树——堆

目录 🍉一.树的概念及结构🍉 1.树的概念 2.树的相关术语 3.树的表示 4.树在实际中的应用 🍊二.二叉树的概念和结构🍊 1.二叉树的概念 2.特殊的二叉树 2.1.满二叉树 2..2.完全二叉树 3.二叉树的性质 4.二叉树的存储结构 …

限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现

文章目录前言1、计数器(固定时间窗口)算法原理代码实现存在的问题2、滑动时间窗口算法原理代码实现存在的问题3、漏桶算法原理代码实现存在的问题4、令牌桶算法原理代码实现最后本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示…

一文了解Java ArrayList (源码逐行解析)

介绍 ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 Arr…

c++积累5-lock_guard使用

1、std:mutex 在了解lock_guard之前,需要先学习下std:mutex,因为lock_guard内部就是使用的std:mutex std:mutex:是一个用于保护共享数据不会同时被多个线程访问的类,它叫做互斥量。我们可以把它看作一把锁,基本使用如下&#xff…

【致敬未来的攻城狮计划】— 连续打卡第四天:e2 studio 使用教程

系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 文章目录 系列文章目录 文…