第十二章 Transform组件(下)

news2025/1/13 10:21:19

上一章节中我们介绍了Transform组件的属性和方法。我们发现 Transform 中有right,up和forward,而 Vector3 类中也有right,up和forward,他们是一回事嘛?我们使用Forward来说明两者之间的区别。我们知道,改变游戏对象的position位置,就可以形成移动效果。如果我们让游戏对象沿着forward的方向,游戏对象应该如何移动呢?

接下来,我们创建一个“SampleScene3”的新场景,并创建一个“Cube”游戏对象。

需要注意的是,我们要将这个“Cube”放置到世界坐标系的原点(0,0,0)的位置。我们点击选中“Cube”游戏对象,然后在它的Inspector检视面板中做如下修改。

然后创建一个“CubeTransformTest.cs”脚本,并将该脚本附加到“Cube”游戏对象上面。我们按下“W”键的时候,“Cube”游戏对象要向前(Z轴正方向)移动1个单位:

脚本代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeTransformTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            transform.position += new Vector3(0, 0, 1);
        }
    }
}

以上代码非常简单,就是按下“W”按键的时候,我们修改游戏对象的transform组件的position属性,让其沿着Z轴正方向移动1米的长度。

为了能够更好的查看“Cube”的移动效果,我们将摄像机移动到“Cube”的上方,同时朝向下方,也就是“俯视”当前场景,那么摄像机的参数设置如下:

因为“Cube”位于世界坐标系原点(0,0,0)位置,因此我们将摄像机放置(0,5,0)位置,也就是“Cube”的上方5个单位高度位置。然后我们将摄像机在X轴旋转90度,让摄像机朝向“Cube”,这样,我们就能够“俯视”这个“Cube”游戏对象了。接下来, 我们就可以Play当前工程,然后按下“W”键来移动这个“Cube”。

以上就是运行后的内容,接下来我们按下“W”键

我们前后对比发现,立方体Cube向前移动了一段距离。其实,我们上面也介绍了Vector3.forward就是Vector3(0, 0, 1),那么我们的代码也可以这样写,

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            //transform.position += new Vector3(0, 0, 1);
            transform.position += Vector3.forward;
        }
    }

我们重新“Play”当前工程,按下“W”键之后,发现“Cube”也向前移动了,说明Vector3.forward就是Vector3(0, 0, 1),这个是没有问题的。接下来, 我们试试transform.forward代码

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            //transform.position += new Vector3(0, 0, 1);
            //transform.position += Vector3.forward;
            transform.position += transform.forward;
        }
    }

我们再重新“Play”当前工程,按下“W”键之后,发现“Cube”也向前移动了,跟之前没有任何区别,这说明transform.forward 约等于Vector3(0, 0, 1)。他们之间肯定是有区别的。

接下来,我们添加旋转代码,测试旋转后的移动,如下所示:

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            transform.position += new Vector3(0, 0, 1);
            //transform.position += Vector3.forward;
            //transform.position += transform.forward;
        }

        // 向左旋转45度
        if (Input.GetKeyDown(KeyCode.Q))
        {
            transform.eulerAngles += new Vector3(0, -45, 0);
        }

        // 向右旋转45度
        if (Input.GetKeyDown(KeyCode.E))
        {
            transform.eulerAngles += new Vector3(0, 45, 0);
        }
    }

请注意,我们添加旋转代码的同时,还重新使用了“Vector3(0,0,1)”移动代码。我们重新Play当前工程,先旋转“cube”然后在再移动“cube”,入下所示:

 

 

我们发现,当我们选择“Cube”之后再移动的话,“Cube”仍然沿Z轴正方向移动。也就是说,“Vector3(0,0,1)”是世界坐标系的正前方(Z轴正方向),它不会受游戏物体的旋转影响。同时我们再测试“Vector3.forward”代码,发现他们两个一样的效果。这说明

Vector3.forward = Vector3(0,0,1)   

两者都代表世界坐标系的正前方(Z轴正方向)
接下来,我们再来测试“transform.forward”的效果。

        if (Input.GetKeyDown(KeyCode.W))
        {
            //transform.position += new Vector3(0, 0, 1);
            //transform.position += Vector3.forward;
            transform.position += transform.forward;
        }

 

 

我们发现,旋转后的移动方向改变了,它不是世界坐标系的前方,而是当前“Cube”游戏对象的本地坐标系的前方。他们的区别相当于“东西南北”和“前后左右”的概念。“东西南北”是相对于世界坐标系的,不管人如何旋转,方向不会改变;但是“前后左右”是相对于每一个人而言的,人的朝向不同(旋转不同),“前后左右”的方向是不一样的。两者只是参考系不同,有时候世界坐标系方便一下,有时候本地坐标系方便一些。也就是说,transform.forward代表的是游戏对象的正前方(本地坐标系Z轴正方向),而Vector3.forward 等效于Vector3(0,0,1),两者都代表世界坐标系的正前方(Z轴正方向)。

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

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

相关文章

【web基础】html常用标签+作品展示

前言 小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 说明:此部分是java web基础知识&a…

Python游戏利器pygame,疯狂赛车(34)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 你玩过游戏吗? 你喜欢玩游戏吗? 手机游戏,电脑游戏,还是游戏机游戏…

java基础入门-02

Java基础入门-02 8、面向对象8.1. 类和对象8.1.1 类和对象的理解8.1.2 类的定义8.1.3 对象的使用8.1.4 学生对象-练习 8.2. 对象内存图8.2.1 单个对象内存图8.2.2 多个对象内存图 8.3. 成员变量和局部变量8.3.1 成员变量和局部变量的区别 8.4. 封装8.4.1 封装思想8.4.2 private…

智能网联汽车城市化的进程和思考

4月19日,工信部官网显示,支持湖北(襄阳)、浙江(德清)、广西(柳州)创建国家级车联网先导区。至此,车联网国家级先导区正式扩容,由4个增至7个。智能网联作为新生…

Qt5.9学习笔记-事件(一)

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

哪些问题是ChatGPT不会回答我的?

哪些问题是ChatGPT不会回答我的? 文章目录 哪些问题是ChatGPT不会回答我的?前言ChatGPT擅长回答哪些问题呢?结语 前言 对于chatgpt,人们或许会觉得无论什么问题,它都能够答复,但对于以下这些问题&#xff…

云和恩墨荣获2023数字中国创新大赛·信创赛道“最具发展潜力奖”等4个奖项

4月27日,作为2023数字中国创新大赛信创赛道系列活动之一的“信创与开源技术论坛”在福州召开,信创赛道全国总决赛颁奖仪式在该论坛上举行。云和恩墨的参赛作品“安稳易用的企业级国产数据库 - MogDB”经过层层筛选、角逐,最终荣获“信创赛道最…

2023五一数学建模竞赛选题人数公布

数据来源自,各个平台人数投票统计,仅供参考。 具体数值比例为: 题号人数A504B1174C1905 目前,五一数模竞赛C题半成品论文基本完成制作(累计35页,10000字),注:蓝色字体…

面向画布(Canvas)的JavaScript库

面向画布(Canvas)的JavaScript库 总结 每个库各有特色,根据需求选择 学习要点 面向画布(Canvas)的JavaScript库 EaselJS 是一个封装了 HTML5 画布(Canvas) 元素的 JavaScript 库。jCanvaScript面向HTML5画布(canvas)的Javascript类库&…

【C++】switch 语句

1、缘起 最近在 BiliBili 黑马程序员学习 C 编程语言,今天学习到了 switch 语句。为了加强记忆,所以就写了一篇关于 switch 语句的博客。 switch 语句是 C 中的一种流程控制语句,它可以根据变量的值来执行不同的代码块。这种语句通常用于替代…

《LearnUE——基础指南:上篇—0》——UE架构

UE架构 给我一个UObject,我可以翘起整个UE 思考:如果让我们自己来设计一款3D渲染引擎,你会怎么设计整个架构? 目前,市面上有众多的3D游戏引擎和各种三维渲染引擎,像常见的渲染库OpenGL,WebGL&…

垃圾邮件、欺骗和网络钓鱼,如何防止电子邮件安全意识的威胁

网络安全意识月已过半,本周我们的重点是电子邮件安全意识。 在我们最近为此活动撰写的一篇博客中,我们介绍了电子邮件系统面临的一些最严重的危险——包括垃圾邮件、欺骗和网络钓鱼——以及用户如何主动在他们的电子邮件中发现这些攻击并采取措施避免它…

【Python】如此轻松就能PDF和word互转?【详细教程来啦】

文章目录 前言一、pdf2docx功能二、限制三、安装四、案例总结 前言 可将 PDF 转换成 docx 文件的 Python 库。该项目通过 PyMuPDF 库提取 PDF 文件中的数据,然后采用 python-docx 库解析内容的布局、段落、图片、表格等,最后自动生成 docx 文件。 一、…

A-star算法自学

搜索过程 广度优先搜索(BFS)算法与Dijsktra算法的结合,可以得出最短的路径。 将地图信息通过划分为方形或者其他多边形格子的方法进行表示,便于利用二维数组存放地图信息,每个格子有可行和不可行两种状态;…

[Python图像处理] 小波变换执行图像融合

小波变换执行图像融合 图像融合基础使用小波变换执行图像融合图像融合相关链接 图像融合基础 图像融合是将多个输入图像组合到单个输出图像中的过程,输出图像中包含比单个输入图像更好的场景描述。一个好的图像融合方法应当具备以下属性: 它可以保留不…

JavaScript实现用while语句计算1+n的和的代码

以下为输入圆的半径,输出周长、体积和面积实现结果的代码和运行截图 目录 前言 一、实现用while语句计算1n的和 1.1运行流程及思想 1.2代码段 1.3 JavaScript语句代码 1.4运行截图 【附加】用while计算110的和 1.1代码段 1.3 运行截图 前言 1.若有选择,您…

如何为ChatGPT应用程序自定义模型-微调(fine-tuning)

介绍 通过微调,您可以通过提供以下内容从通过 API 提供的模型中获得更多收益: 比提示设计更高质量的结果能够训练比提示所能容纳的更多示例由于提示时间较短,可以节省代币更低的延迟请求 GPT-3 已经对来自开放互联网的大量文本进行了预训练…

Opencv C++图像处理(全)

文章目录 Opencv官方资料BUG集合一、入门基础1.1、头文件说明&#xff1a;#include <opencv2/opencv.hpp>1.2、头文件说明&#xff1a;#include <opencv2/highgui/highgui.hpp>1.3、计算消费时间函数1.3.1、耗时&#xff1a;getTickCount()1.3.2、频率&#xff1a;…

项目管理-团队管理的4个激励理论

冲突和竞争 冲突&#xff1a;是指两个或两个以上的社会单元在目标上互不相容或互相排斥&#xff0c;从而产生心理上的或行为上的矛盾。冲突并不一定是有害的&#xff0c; “一团和气”的集体不一定是一个高效率的集体。对于有害的冲突要设法加以解决或减少&#xff1b;对有益的…

大三生变身AI顾问入职Prada 抢饭碗的AI造出新饭碗

“ChatGPT让我有点焦虑&#xff0c;我长大了还能找到工作吗&#xff1f;”这是一名小学生透过视频表达的担忧&#xff0c;她有点懊恼&#xff0c;“GPT简直无所不能&#xff0c;会画画、编程、写论文、创作音乐......而我们还在学加减乘除。”这段视频让网友直呼&#xff0c;AI…