【Unity学习笔记】Transform—游戏物体的位置and位移、Vector基础
一、必备知识点 Vector3 基础
Vector3主要用来标识三维坐标系中的 一个点 或 一个向量
Vector3的本质是一个Unity提供好的结构体
现有:
Lesson6脚本的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson6 : MonoBehaviour
{
void Start()
{
//Vector3的声明
//方法一:不new (它是一个值类型,可以不new)
Vector3 v;
v.x = 10;
v.y = 10;
v.z = 10;
//方法二:用无参构造声明
Vector3 v2 = new Vector3();
v2.x = 10;
v2.y = 10;
v2.z = 10;
//方法三:它还有重载的有参构造函数
// 不传z的值,z会默认为0
Vector3 v3 = new Vector3(10, 10);
// 传三个值,分别是x、y、z (最常用的声明方式)
Vector3 v4 = new Vector3(10, 10, 10);
//Vector3的基本计算
//运算后会有一个Vector3类型的返回值
Vector3 v5 = new Vector3(3, 3, 3);
Vector3 v6 = new Vector3(2, 2, 2);
//1.加/减
//计算结果为v5和v6的x、y、z分别相加/减
print(v5 + v6);
print(v5 - v6);
//2.乘/除
//v5的x、y、z分别 * 10
print(v5 * 10);
//v5的x、y、z分别 / 2
print(v5 / 2);
//常用的预设点/向量
print(Vector3.zero); //对应点(0, 0, 0)
//print(Vector3.one); //对应点(0, 0, 0)
print(Vector3.right); //对应点(1, 0, 0)
print(Vector3.left); //对应点(-1, 0, 0)
print(Vector3.forward); //对应点(0, 0, 1)
print(Vector3.back); //对应点(0, 0, -1)
print(Vector3.up); //对应点(0, 1, 0)
print(Vector3.down); //对应点(0, -1, 0)
//补充:计算两个点之间的距离的方法
//只需传入两个点,就能自动计算出两点的距离
float f = Vector3.Distance(v5, v6);
}
}
运行:
二、位置相关
现有:
Lesson6脚本的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson6 : MonoBehaviour
{
void Start()
{
//1.相对世界坐标系的位置(与父GameObject对象无关)
print(this.transform.position);
//2.相对于父GameObject对象的位置
// 如果想要以Inspector面板上的坐标数值为准来进行设置
// 那一定是通过LocalPosition来进行设置
print(this.transform.localPosition);
//补充:他们两个有两种情况会出现面板数值一样
// 1.对象没有父对象
// 2.父对象的坐标 就是世界坐标系(0, 0, 0)点
//3.位置的赋值
//注意:无法单独对x、y、z其中一个值进行修改,只能使用Vector3进行整体修改
//this.transform.position.x = 10; // X
this.transform.position = new Vector3(10, 10, 10); // √
// 对然不能直接改transform的x、y、z,但是Vector的是可以直接改的
// 用Vector把位置取出来,
Vector3 v = this.transform.localPosition;
// 然后再修改
v.x = 15;
//4.得到对象当前的朝向相关
// 1.对象当前的面朝向
print(this.transform.forward);
// 2.对象当前头顶的朝向
print(this.transform.up);
// 3.对象当前的右手边朝向
print(this.transform.right);
// 4.back、left、down同理...
}
}
三、位移相关
坐标系下的位移计算公式:路程 = 方向 * 速度 * 时间
(因为是在多为坐标系中移动,所以要乘一个方向)
现有:
Lesson6脚本的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson6 : MonoBehaviour
{
void Update()
{
//方式一:自己手动计算
//用当前的位置 + 我要动多长距离 得出最终所在的位置
//这样写 对象会始终朝自身坐标系的正前方移动
this.transform.position += this.transform.forward * 1 * Time.deltaTime; //(方向 * 速度 * 时间)
//这样写 对象会朝着世界坐标系的前方(z轴正方向)移动
this.transform.position += Vector3.forward * 1 * Time.deltaTime;
//方法二:使用API计算
//一个专门管位移的方法:Translate
//参数1 表示位移了多少 (方向 * 速度 * 时间)
//参数2 表示相对坐标系 (不写默认相对本地坐标系)
//1.这样写 始终朝着世界坐标系的 Z轴移动
//(因为Vector3.forward得到的仅仅是个方向(0, 0, 1)而已)
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);
//2.这样写 始终朝着自己的面朝想移动 (常用)
//(因为this.transform.forward得到的是世界坐标系下对象自己的面朝向)
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);
//3.这样写 始终朝着自己的面朝想移动 (常用)
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);
//4.这样写 不对!! X
//(因为this.transform.forward得到的是世界坐标系下对象自己的面朝向,而参数2又是自己的坐标系,两者重叠后 方向将错乱)
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);
}
}