当前位置:   article > 正文

【Unity】Transform—游戏物体的位置and位移、Vector基础_unity获取当前物体位置

unity获取当前物体位置

一、Vector3 基础

Vector3主要用来标识三维坐标系中的 一个点 或 一个向量
Vector3的本质是一个Unity提供好的结构体

现有:
image
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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

运行:
image

二、位置相关

现有:
image
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同理...
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

三、位移相关

坐标系下的位移计算公式:路程 = 方向 * 速度 * 时间
(因为是在多为坐标系中移动,所以要乘一个方向)

现有:
image
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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号