第十二章 Transform组件(下)

news/2025/3/25 13:12:28/

上一章节中我们介绍了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 updatevoid Start(){}// Update is called once per framevoid 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.ppmy.cn/news/55781.html

相关文章

回溯算法——我欲修仙(功法篇)

个人主页:【😊个人主页】 系列专栏:【❤️我欲修仙】 系列文章目录 第一章 ❤️ 学习前的必知知识 第二章 ❤️ 二分查找 文章目录 系列文章目录回溯算法🤔🤔🤔回溯算法一般可以解决的问题回溯算法的实现回…

Linux命令集(Linux常用命令--echo指令篇)

Linux命令集(Linux常用命令--echo指令篇) Linux常用命令集(echo指令篇)2.echo(echo)1. 输出自定义内容2. 禁止输出末尾换行符3. 转义功能4. 与特殊字符配合使用实现其余功能 Linux常用命令集(echo指令篇) 如…

设计模式:创建型设计模式、结构型设计模式

目录 前言如何学习设计模式?设计模式基础设计原则 一. 创建型设计模式1. 模板方法2. 观察者模式3. 策略模式 二. 结构型设计模式1. 单例模式2. 工厂模式3. 抽象工厂4. 责任链5. 装饰器6. 组合模式 前言 如何学习设计模式? 明确目的 在现有的设计模式上…

Android 系统的分区和文件系统(1)- Android 系统源码结构分析

声明 本文分析Android系统源码各目录存放文件用途。其中参考了一些书籍内容,仅供学习使用。本文采用 LinesgeOS cm-14.1(等同于AOSP Android 7.1.1) 1. 整体结构 各个版本的源码目录基本是类似的,如果是编译后的源码目录&#x…

第十五章 角色移动旋转实例

本章节我们创建一个“RoleDemoProject”工程,然后导入我们之前创建地形章节中的“TerrainDemo.unitypackage”资源包,这个场景很大,大家需要调整场景视角才能看清。 接下来,我们添加一个人物模型,操作方式就是将模型文…

基于台风信息查询 API 设计台风预警系统的基本思路

引言 在过去的几十年中,由于全球气候变化等因素的影响,台风的强度和频率都有所增加,给人类社会带来了极大的威胁。在这种背景下,一个高效可靠的台风预警和监测系统显得尤为重要。这种系统可以通过获取、存储、处理和分析各种相关…

使用aardio写一个基于pyocd的单片机下载器

1 新建工程 最开始本来是打算调用pyocd 的python api的,但是一个是内嵌包一直安装出问题,一个是考虑到本地pack不想重复安装和管理,于是就转做pyocd的前端了,也就是直接调用pyocd,根据返回数据解析,然后执…

ViveNAS - 一个基于LSM tree的文件存储实现 (一)

1. ViveNAS (GitHub - cocalele/ViveNAS) ViveNAS 是一个开源分布式的网络文件系统(NAS), 具有下面的特点: - 通过不同存储介质的结合,在高性能、低成本间寻找动态的平衡 - 解决数据的长期、低成本存储问题&#xff…