Unity之脚本API笔记一(Transform详解及使用方法)

2023-11-17

一、什么是Transform?

 场景中的每一个物体都有一个Transform,用于存储和操作对象的位置、旋转和缩放,存在层级关系(父级和子级)。

二、常用变量与属性(位置)

1.位置

position:世界坐标

localposition:相对坐标(父物体就是世界,相对于父物体的坐标)

 private void OnGUI()
    {
        //世界坐标
        GUILayout.Label(string.Format("Transform's position:{0}", transform.position));
        //相对坐标
        GUILayout.Label(string.Format("Transform's localPosition:{0}", transform.localPosition));
    }

2.角度

enlerAnles,localEnlerAnles欧拉角;rotation,localRotation四元数旋转角度(自然数)。

private void OnGUI()
    {
        //相对世界的欧拉角
        GUILayout.Label(string.Format("Transform's eulerAngles:{0}", transform.eulerAngles));
        //相对父物体的欧拉角
        GUILayout.Label(string.Format("Transform's localEulerAngles:{0}", transform.localEulerAngles));
        //相对世界的rotation
        GUILayout.Label(string.Format("Transform's rotation:{0}", 
transform.rotation));
        //相对父物体的rotation
        GUILayout.Label(string.Format("Transform's localRotation:{0}", transform.localRotation));
        //欧拉角转换成自然数方式
        transform.rotation = Quaternion.EulerAngles(270, 0, 0);
    }

3.缩放

localScale相对父级缩放比例;lossyScale相对世界缩放比例。

 private void OnGUI()
    {
        //相对父级缩放
        GUILayout.Label(string.Format("Transform's localScale:{0}", transform.localScale));
        //相对世界的缩放
        GUILayout.Label(string.Format("Transform's lossyScale:{0}", transform.lossyScale));
    }

4.其他

right(向左),up(向上),forward(向前)方向向量。

 private void OnGUI()
    {
        //向右
        GUILayout.Label(string.Format("Transform's right:{0}", transform.right));
        //向上
        GUILayout.Label(string.Format("Transform's up:{0}", transform.up));
        //向前
        GUILayout.Label(string.Format("Transform's forward:{0}", transform.forward));
    }

parent(父级),root(根物体),childCount(多少个子级)子父级相对。

 private void OnGUI()
    {
        //向右
        GUILayout.Label(string.Format("Transform's right:{0}", transform.parent.name));
        //向上
        GUILayout.Label(string.Format("Transform's up:{0}", transform.root.name));
        //向前
        GUILayout.Label(string.Format("Transform's forward:{0}", transform.childCount));
    }

三、移动

1.直接修改位置

小技巧:优化,缓存和不缓存。

public Transform trans;
    public int Count = 1000;     //缓存次数
    private long NoCache = 0;    //不缓存
    private long Cache = 0;    //缓存
    // Start is called before the first frame update
    void Start()
    {
        trans = this.transform; //获得trans,能提高效率,缓存

        Stopwatch sw = new Stopwatch();
        sw.Start();       //启动Stopwatch
        for (int i = 0; i < Count; i++) {     //循环次数
            Transform t = this.transform;
        }
        sw.Stop();
        NoCache = sw.ElapsedTicks;

        sw.Reset();

        sw.Start();
        for (int i = 0; i < Count; i++) {
            Transform t = trans;      //直接获取trans
        }
        sw.Stop();
        Cache = sw.ElapsedTicks;
    }

    private void OnGUI()
    {
        //向右
        GUILayout.Label(string.Format("Transform's NoCache:{0}", NoCache));
        //向上
        GUILayout.Label(string.Format("Transform's Cache:{0}", Cache));
    }

移动

    public Transform trans;
    private bool moveToLeft = true;  //控制左右移动
    private float speed = 2;

    // Start is called before the first frame update
    void Start()
    {
        trans = this.transform; //获得trans,能提高效率,缓存

    }
      
    // Update is called once per frame
    void Update()
    {
      Move();
      //  trans.position = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), Random.Range(-3f, 3f)); //直接移动,随机移动,随机数-3*3
      //  trans.position = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f), Random.Range(-3f, 3f)); //直接移动,随机移动,随机数-3*3
    }

    private void Move()
    {
        if (trans.position.x <= -3 && moveToLeft) {     //在x轴-3到3移动,向左移动为true
            moveToLeft = false;    //向右移动
        } else if(trans.position.x >= 3 && !moveToLeft){
            moveToLeft = true;      //向左移动
        }
       trans.position += (moveToLeft?Vector3.left : Vector3.right) * Time.deltaTime * speed;  //判断向左向右,后面的话是指每秒;如果向左移动,每秒钟向左移动两个单位。。。
    }

2.Translate函数

1.1 依据自身坐标移动

 private void Translate()
    {
        if (transform.position.x < -3 && moveToLeft)
        {     //在x轴-3到3移动,向左移动为true
            moveToLeft = false;    //向右移动
        }
        else if (transform.position.x >= 3 && !moveToLeft)
        {
            moveToLeft = true;      //向左移
        }
        transform.Translate((moveToLeft ? Vector3.left : Vector3.right) * Time.deltaTime * speed, Space.Self);
    }

1.2 space可以控制是沿自身方向(space.Self)移动还是沿世界方向(space.World)移动。

下面这段代码是沿着世界向前移动。

public Transform trans;
 void Start()
    {
        trans = this.transform;
    }
 void Update()
    {
        Translate(Space.World);
}
 private void Translate(Space space) {
        trans.Translate(Vector3.forward *Time.deltaTime *2, space);
    }

四、旋转

1.直接修改欧拉角和旋转角

修改eulerAngles欧拉角和rotation定义旋转角度代码如下:

 public Transform trans;
    public float speed = 90;

    private void Start() {
        trans = this.transform;
            }
    private void Update()
    {
        //  trans.eulerAngles = new Vector3(0, 0, 45);      //在z轴旋转45°
        trans.eulerAngles = new Vector3(0, 0, 45);      //相对父级
        trans.rotation = Quaternion.Euler(0,0,45);       // 
        trans.localRotation = Quaternion.Euler(0, 0, 45);     //相对父级

                // trans.eulerAngles += Time.deltaTime * speed * Vector3.forward;    //沿着z轴旋转
        trans.rotation = Quaternion.Euler(trans.eulerAngles.x, trans.eulerAngles.y, trans.eulerAngles.z + Time.deltaTime *speed); //沿着z轴旋转
    }

2. Rotate,RotateAround和LookAt函数

2.1 Rotate函数实现旋转功能跟修改欧拉角和旋转角进行旋转有一样的效果,只需要填写一个方向和旋转的速度。

private void Rotate() {
        trans.Rotate(Vector3.forward * Time.deltaTime * speed);     //跟修改欧拉角和旋转角进行旋转有一样的效果,只需要填写一个方向和旋转的速度
    }

2.2 RotateAround函数实现sphere围绕cube旋转,代码如下:

public Transform target;    //围绕的点

    private void Rotate() {
        trans.RotateAround(target.position, target.up, Time.deltaTime *speed); //围绕旋转的点、轴向、速度
    }

2.3 LookAt函数,z轴看向,比如把sphere移动一下,cube也是一直始终看向sphere。

 public Transform target;    //围绕的点
    private void LookAt() {
        trans.LookAt(target);
    }

3.利用right,up,forward改变方向

 private void ChangeDir() {
        Vector3 dir = target.position - trans.position;    //trans指向target
        trans.up = dir;      
    }

五、缩放

1.直接修改缩放比例

public Transform trans;
    public float speed = 1;
    public bool ZoomInt;    //放大还是缩小

    private void Start()
    {
        trans = this.transform;
    }
    private void Update()
    {
        Zoom();
    }

    public void Zoom() {
        if (trans.localScale.x <= 0 && !ZoomInt) {     //放大
            ZoomInt = true;
        } else if(trans.localScale.x <=3 && ZoomInt)       //缩小
        {
            ZoomInt = false;
        }
        trans.localScale += (ZoomInt ? Vector3.right : Vector3.left) * Time.deltaTime*speed;      //是否放大,left相当于-right
    }

五、其他常用函数

1. TransformDirection和InverseTransformDirection

1.1 TransformDirection可以实现人物可以朝着摄像机的方向移动而不一定是世界坐标,把希望的方向转给trans,代码如下。

public Transform trans;

    private void Start()
    {
        trans = this.transform;
    }
    private void Update()
    {
        Debug.DrawRay(trans.position, trans.TransformDirection(Camera.main.transform.forward) *10, Color.red);     // Debug.DrawRay()画一根线,从trans的位置
    }

1.2 InverseTransformDirection,处理镜像运动。

Debug.DrawRay(trans.position, trans.InverseTransformDirection(Camera.main.transform.forward) * 10, Color.yellow);

2. DetachChilder,Find,GetChild和IsChildOf

private Transform trans;

    public Transform Child;

    private void Start()
    {
        trans = this.transform;
    }
    private void Update()
    {
    }
    private string _IsChild;   //记录
    private void OnGUI()
    {
        if (GUILayout.Button("Detch Children")) {         //将当前transform下的子物体分离出来,取消他们的一个关系
            trans.DetachChildren();
        }
        if (GUILayout.Button("Find Children"))           //查找"Child"
        {
            trans.Find("Child").position = Vector3.one * 3;
        }
        if (GUILayout.Button("GetChildren"))         //获得子物体的方式,是根据索引值来获取的
        {
            trans.GetChild(0).position = Vector3.one * 5;
        }
        if (GUILayout.Button("IsChildOf"))            //检测当前transform是不是我们参数里填的transform的子物体
        {
            _IsChild = Child.IsChildOf(trans).ToString();
        }
        GUILayout.Label(_IsChild);
    }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity之脚本API笔记一(Transform详解及使用方法) 的相关文章

  • 微信小程序密码显示隐藏(小眼睛)

    一 效果图 微信小程序密码显示隐藏 小眼睛 二 代码 wxml
  • 如何使用vs将现有的项目或者文件夹(尤其是多层目录的)添加到项目中

    困扰我这么久的问题 哎 真心弱爆了 1 将现有项目或文件夹拷贝到指定目录下 2 解决方案右上有个显示所有文件的按钮 然后选中所有要添加的文件 右击 选择包含到项目中即可
  • react 函数组件props的使用

    函数组建的props 1 如何给组件传递数据 给组建的标签添加属性即可 2 函数组件通过props参数就能接受 也可以通过解构props function App props return div h1 我是App组件 props name
  • 层次分析法基本介绍

    层次分析法 1 主要解决哪类问题 评价类 评价类问题要明确 评价的目标是什么 为达到这个目标的可选方案 评价的准则或标准是什么 2 原理 思路是啥 eg 小明高考完如何选择一个学校 如何选择一个旅游目的地 可以思考到 并得到表格 定义指标
  • PDF批量替换文字器免费版

    安装教程 1 下载解压后 得到文件 pdfreplacer exe 双击进入安装向导 2 选择语言 完成后确认进入下一步 3 下一步 4 系统默认安装在C盘 单击浏览可自定义选择安装路径 随后下一步 5 是否创建桌面快捷方式 建议选上 下一
  • PCB板基础知识

    制作机器人的时候不可避免的会用到PCB板 之前对它的认识只停留在会用这个层面 最近学习了PCB板的制作 发现了之前很多不知道的知识 于是整理出来和大家分享 1 过孔 双层板的连接通道 这个是之前最摸不着头脑的环节 拿到一个PCB就会发现上面
  • 拼接滚动地图-Quick-cocos2dx

    lua里面class的使用 一个class的使用 class方法用于创建类 其实就是lua表 传入类名和父类 父类为方法或表 class使用 第一次用A class fun 第二次用a A new 示例 local LevelView cl
  • SpringBoot之@Slf4j的使用详解

    先简单的来说 作用 Slf4j是在SpringBoot基础上Lombok为我们提供的日志输出注解 使用 先引入lombok依赖 将注解添加在类上 然后就可以使用log info 进行日志的输出打印 Slf4j注解填在当前类上相当于Sprin
  • vscode使用ssh远程linux可视化开发环境搭建

    目录 1 搭建 vscode 远程开发流程 2 在线搭建环境 3 离线搭建环境 4 ssh免密登录 设置白名单 5 参考文档 最近一直在做服务引擎开发 编译都是在服务器linux环境中进行 每次调试使用gdb修改使用vim贼麻烦 最后找了下
  • 10种Arduino IDE替代品开始编程

    当我们开始开发Arduino项目时 通常我们倾向于使用Arduino IDE 无论如何 如果我们对标准IDE不满意 我们应该考虑几种Arduino IDE替代方案 众所周知 在开发物联网项目或构建DIY项目时 Arduino是最受欢迎的原型
  • ARM指令集

    ARM指令的基本格式 ARM指令的基本格式为
  • echarts之柱状图(1)

    PS相关学习资料链接 Pink老师的教程分解 O O哈哈 div class bar h2 就业行业 a href 2019 a a href 2020 a h2 div class chart div div css自行设置 类名为cha
  • Failed to execute goal on project rocketmq-console-ng: Could not resolve dependencies for project

    Apache RocketMQ安装部署 Failed to execute goal on project rocketmq console ng Could not resolve dependencies for project org
  • TypeScript(五)类型别名及类型符号

    目录 引言 类型别名 基本用法 字面量类型 数字字面量 字符串字面量 布尔字面量 空字面量 枚举字面量 类型符号 联合类型 交叉类型 类型断言 尖括号 as关键字 非空断言 类型保护 typeof instanceof 类型谓词 索引类型
  • 解决 IProgress not found. Please update jupyter and ipywidgets. 问题

    解决 IProgress not found Please update jupyter and ipywidgets 问题 一 报错 IProgress not found Please update jupyter and ipywid
  • web服务搭建

    Python 吹爆Python 1行代码搭建Web服务器30行代码实现服务器的文件上传下载 需求 手机每日下载图片 然后需经过本人编写的Python脚本处理一遍 再返回到手机上 个人电脑不能保证时刻开机在线 自己也不可能一直在电脑旁边 故欲
  • Firebug 1.9新特性指南

    Firebug 1 9新特性指南 FireBug1 9发布了 引入了很多新特性 一 Firebug兼容的Firefox版本 Firefox4兼容Firebug1 7 3 Firefox5 11兼容Firebug1 9 Firefox12兼容
  • 【Python 协程详解】

    0 前言 前面讲了线程和进程 其实python还有一个特殊的线程就是协程 协程不是计算机提供的 计算机只提供 进程 线程 协程是人工创造的一种用户态切换的微进程 使用一个线程去来回切换多个进程 为什么需要协程 导致Python不能充分利用多
  • 分布式协议与算法——Paxos算法

    目录 Paxos算法 Basic Paxos算法 三种角色 如何达成共识 协商过程 小结 Multi Paxos算法 关于 Multi Paxos 的思考 领导者 优化Basic Paxos Chubby 的 Multi Paxos 实现
  • 解决Elasticsearch查询默认最大值返回10000

    文章目录 1 问题描述 1 描述 2 分析 2 解决方案 1 更改当前索引最大查询条数 max result window 2 能查出数据 但是total依然还是1000 更改track total hits 3 当java使用时应该 4

随机推荐

  • android webview 加载本地html并且解决多图卡顿问题

    使用webview加载本地html 因为本地html使用多张图片 滑动起来卡顿 解决方法如下 把文件夹放入assets文件夹下 Activity加载 WebView wView WebView findViewById R id webvi
  • PANet:基于金字塔注意力网络的图像超分辨率重建(全代码)

    PANet 基于金字塔注意力网络的图像超分辨率重建 本文为全代码 原文请看 传送门 import torch import torch nn as nn import torch nn functional as F from torch
  • 运维实战案例之文件已删除但空间不释放问题解析

    1 错误现象 运维的监控系统发来通知 报告一台服务器空间满了 登陆服务器查看 根分区确实没有空间了 如下图所示 这里首先说明一下服务器的一些删除策略 由于Linux没有回收站功能 我们的线上服务器所有要删除的文件都会首先移动到系统 tmp目
  • 请使用mysql连接池

    在初次使用 python 的 pymysql工具包连接 mysql数据库 的时候 总是发生数据库连接失败的情况发生 经过多方确认 发现这种情况不是自己的连接方式错了 而是mysql数据库服务器因为网络出现闪断 导致在查询的时候发生连接出错的
  • 深度学习与计算机视觉[CS231N] 学习笔记(4.1):反向传播(Backpropagation)

    在学习深度学习的过程中 我们常用的一种优化参数的方法就是梯度下降法 而一般情况下 我们搭建的神经网络的结构是 输入 权重矩阵 损失函数 如下图所示 而在给定输入的情况下 为了使我们的损失函数值达到最小 我们就需要调节权重矩阵 使之满足条件
  • DQN理论基础及其代码实现【Pytorch + CartPole-v0】

    DQN算法的理论基础 基于动态规划方法 基于蒙特卡罗方法和基于时间差分的方法都有一个基本的前提条件 状态空间和动作空间是离散的 而且状态空间和动作空间不能太大 这些强化学习方法的基本步骤是先评估值函数 再利用值函数改善当前的策略 这时的值函
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • HBase NoSQL数据库详解

    一 HBase简介 HBase是Hadoop的生态系统 是建立在Hadoop文件系统 HDFS 之上的分布式 面向列的数据库 通过利用Hadoop的文件系统提供容错能力 如果你需要进行实时读写或者随机访问大规模的数据集的时候 请考虑使用HB
  • Android获取当前位置的三种方式及其使用方法

    1 GPS定位 2 基站定位 此类位置的获取有赖于手机无线通讯信号 当手机处在信号覆盖范围内 手机可以获得该区域 即通讯术语中的 小区 的识别号 因为这些识别号是惟一的 因此可以将识别号和地理坐标对应起来 因此根据识别号就可以知道地理位置
  • Unity3D 使用TextMeshPro中文字体

    这一篇简单描述一下如果使用unity的一个强大的文字组件或者插件 开始 第一步 如果你是unity2018版本的话 在编辑器里面的AssetPackgeManager找到这个插件 没有的话就在搜索框里面搜索下载 如果你是低于2018的版本
  • Xilinx ISE系列教程(8):读取FPGA芯片唯一ID号

    文章目录 toc 应用场景 方法1 通过JTAG读取 方法2 调用原语读取 DNA PORT原语的使用 DNACLK频率注意 本文是Xilinx ISE系列教程的第8篇文章 用过单片机的朋友都知道 单片机芯片内部都有一串序列号 比如STM3
  • OkHttp库简介

    一直以来 Java并没有什么比较好用的HTTP库 JDK自带的HTTP类又非常旧 难以使用 今天我发现了一个使用比较广泛的OkHttp库 它在安卓和Java领域都有使用 在Github上的星数有两万多 所以我们可以放心的使用 安装 先来看看
  • linkToDeath机制了解和使用

    转自 http www jianshu com p e38f08e34686 在学习Binder和AIDL的过程中遇到的一些有意思的事情 linkToDeath机制 我们先看看官网如何介绍 When working with remote
  • pytorch:参数pin_memory=True和non_blocking=True的作用

    目录 一 pin memory 二 non blocking 一 pin memory pin memory是dataloader 的参数 默认值为False 其作用是是否把把数据存放在锁页内存中 主机的内存根据物理内存 内存条 与虚拟内存
  • 服务器2012系统截屏,Windows Server 2012 R2 Preview界面截图

    微软将在BUILD大会上公开发布Windows 8 1 预览版 Windows 8 1是Windows Blue升级项目的一部分 那么一直以来与Windows客户端如影随形的Windows Server呢 是的 Blue项目并非仅为Wind
  • 微信小程序和APP优劣势大对比

    小程序的优势 1 无需下载 随走随关 2 功能丰富 体验更简便 3 接口众多 可以进行不断的开发 4 流量入口大 背靠日活9 6亿的微信 5 有强大的微信生态环境 小程序对比APP的好处 1 开发成本低 2 开发门槛低 3 获客成本低于Ap
  • 星星之火-47: 5G的八大组网方案

    目录 1 5G组网方案概述 2 选项3系列 4G LTE接入网 5G NR 接入网 4G LTE核心网 3 选项2 5G NR 5G 核心网 4 选项7系列 4G LTE接入网 5G NR接入网 5G核心网 5 选项4系列 4G LTE接入
  • Qt进程间通信

    进程是操作系统的基础之一 一个进程可以认为是一个正在执行的程序 我们可以把进程当做计算机运行时的一个基础单位 关于进程的讨论已经超出了本章的范畴 现在我们假定你是了解这个概念的 在 Qt 中 我们使用 QProcess 来表示一个进程 这个
  • .getClass.getClassLoader.getResourceAsStream的方式加载文件,总是为null加载不到数据

    记录一个问题 我在用如下的代码加载配置文件的时候 总是加载不到数据 文件位置的对的 SparkSessionBase getClass getClassLoader getResourceAsStream spark conf proper
  • Unity之脚本API笔记一(Transform详解及使用方法)

    一 什么是Transform 场景中的每一个物体都有一个Transform 用于存储和操作对象的位置 旋转和缩放 存在层级关系 父级和子级 二 常用变量与属性 位置 1 位置 position 世界坐标 localposition 相对坐标