第十二章 Transform组件(下)

上一章节中我们介绍了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轴正方向)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nodejs+vue+elementui学生毕业生离校系统

学生毕业离校系统的开发过程中。该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员:首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等,前台首页;首页、离…

软件测试的测试用例

1.白盒和黑盒测试: 黑盒测试:把代码看成一个黑盒子,只关心输入和输出结果之间的关系 产品功能是否符合要求; 白盒测试:能够看到代码本身,针对代码本身进行测试,测试代码本身的逻辑是否符合规范。 2.测试用…

SOFA Weekly|SOFAArk 社区会议预告、Layotto 社区会议回顾、社区本周贡献

SOFA WEEKLY | 每周精选 筛选每周精华问答,同步开源进展 欢迎留言互动~ SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁集团自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件&am…

c#笔记-内置类型

内置类型 内置类型是一些有关键字表示的类型。关键字具有非常高的优先级,可以让你在没有别的配置的情况下, 只要用的是c#就可以使用。这也意味着这些类型是非常重要,或是基本的东西。 整数:byte, sbyte, short, ushort, int, ui…

展望Flink各版本及新特性

展望Flink各版本及新特性 一 Flink 1.9 版本1.1 细粒度批作业恢复1.2 State Processor API1.3 Stop-with-Savepoint1.4 新 Blink SQL 查询处理器预览1.5 Table API / SQL 的其他改进 二 Flink 1.10 [重要版本 : Blink 整合完成]2.1 内存管理及配置优化2.2 统一的作业提交逻辑2.…

【WCH】CH32F203基于内部RTC+I2C SSD1306 OLED时钟和温度显示

【WCH】CH32F203基于内部RTCI2C SSD1306 OLED时钟和温度显示 📌相关篇《【WCH】CH32F203基于内部RTC时钟I2C SSD1306 OLED显示》📺显示效果: ✨主要是在其基础 上增加温度显示,温度数据来源于DS18B20,更换了OLED驱动显…

大型Saas系统的权限体系设计(二)

X0 上期回顾 上文《大型Saas系统的权限体系设计(一)》提到2B的Saas系统的多层次权限体系设计的难题,即平台、平台的客户、客户的客户,乃至客户的客户的客户如何授权,这个可以通过“权限-角色-岗位”三级结构来实现。 但这个只是功能权限&am…

Apache安装与基本配置

1. 下载apache 地址:www.apache.org/download.cgi,选择“files for microsoft windows”→点击”ApacheHaus”→点击”Apache2.4 VC17”,选择x64/x86,点击右边download下面的图标。 2. 安装apache (1)把…

【LeetCode】1000题挑战(220/1000)

1000题挑战 没有废话,直接开刷! 目录 1000题挑战 没有废话,直接开刷! 第一题:119. 杨辉三角 II - 力扣(Leetcode) 题目接口 解题思路 代码: 过过过过啦!&#x…

【软考备战·希赛网每日一练】2023年5月2日

文章目录 一、今日成绩二、错题总结第一题 三、知识查缺 题目及解析来源:2023年05月02日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 三、知识查缺 复习 流水线技术。序列图(顺序图)用于展现系统中一个用例和多…

【五一创作】[论文笔记]图片人群计数CSRNet,Switch-CNN

2018(有代码)_CSRNet (10次) 应用最最广泛的:e, is the most widely used while working with counting problems. 2018_CVPR——CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes https://arxiv.org/abs/1802.100…

第八章 集合函数

文章目录 前言一、聚合函数介绍1 、AVG (平均值) 和SUM (求和)函数2 、MIN(最小值)和MAX(最大值)函数3 、COUNT函数问题:用count(*),count(1),count(列名)谁好呢? 二、G…

嵌入式Sqlite数据库【基本语法、Sqlite-JDBC、嵌入到Java程序】

目录 前言 基本介绍 Sqlite 对比 MySQL 字段类型 语法 创建表 插入数据 更新数据 查询数据 删除数据 查看建表语句 Sqlite-JDBC 嵌入到Java程序 前言 最近在用JavaFX做一个桌面软件需要用到数据库,但MySQL这种数据库明显只能本地访问,把软…

ChatGPT能让智能客服更上一层楼么?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 现实生活中,智能客服的身影已随处可见。 随着全球经济从以产品为主向以服务为主转型,体验经济也快速发展。客户服务逐渐成为一个独立的产业,而客服中心也成为所有企业的基本部门。然而&am…

利用snpEff对基因型VCF文件进行变异注释的详细方法

利用snpEff对VCF文件进行变异注释 群体遗传研究中,在获得SNP位点后,我们需要对SNP位点进行注释,对这些SNP位点进行更深的了解。 snpEff是一个用于对基因组单核苷酸多态性(SNP)进行注释的软件,snpEff软件可以用于对VCF文件进行变异注释&…

Packet Tracer - 配置和验证小型网络

Packet Tracer - 配置和验证小型网络 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.10.10.1 255.255.255.0 不适用 G0/1 10.10.20.1 255.255.255.0 不适用 SW1 VLAN1 10.10.10.2 255.255.255.0 10.10.10.1 SW2 VLAN1 10.10.20.2 255.25…

基于AI技术的智能考试系统设计与实现(论文+源码)_kaic

摘 要 随着当今世界互联网信息技术的飞速发展,互联网在人们生活中的应用越来越广泛,在线考试成为选拔人才的重要方法。实现一个基于AI技术的智能考试系统,该系统采用Java编程语言实现。通过使用自然语言处理技术和机器学习算法,该…

GPT-3.5 也能直接联网了

ChatGPT 常令人诟病的一个问题,就是它的模型训练数据,迄今为止用的还是 2021 年的老数据。 对于当下这个信息大爆炸时代,相隔两小时,消息都有可能滞后,更别说相隔两年了。 目前正式开放了 Web Browsing 这款插件。 …

力扣刷题2023-04-29-1——题目:1431. 拥有最多糖果的孩子

题目: 给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果…

PostgreSQL16中pg_dump的LZ4和ZSTD压缩

PostgreSQL16中pg_dump的LZ4和ZSTD压缩 pg_dump压缩lz4和zstd LZ4和ZSTD压缩算法合入了PG16。LZ4补丁的作者是Georgios Kokolatos。由Tomas Vondra提交。由Michael Paquier、Rachel Heaton、Justin Pryzby、Shi Yu 和 Tomas Vondra 审阅。提交消息是: Expand pg_dum…