TransFrom】【Unity基础】Transform类怎么使用

2020-12-03 10:26发布

9条回答

public void Translate (translation : Vector3, relativeTo : Space = Space.Self) : void

把物体向translation方向移动,距离为translation.magnitude。 relativeTo表示这个移动的参考坐标系。

public void Translate (x : float, y : float, z : float, relativeTo : Space = Space.Self) : void

同上

public void Translate (translation : Vector3, relativeTo : Transform) : void

如果relativeTo 不是null,则以目标物体relativeTo的自身轴向作为参考坐标系。

public void Translate (x : float, y : float, z : float, relativeTo : Transform) : void


爱学习的小巴
3楼 · 2020-12-03 19:36

这个就是U3D所 封装的矩阵运算了,用于缩放,平移,还有定位(这个囧,他把矩阵给放这用了,所有物体都可以用transform类型来存放)。Transform所 实现的功能不过就是物体矩阵的运算罢了,具体如下: 

Variables 

position                    Vector3类型,物体位置,相对于世界坐标系的值。就是矩阵的最后一行的值。 

localPosition             Vector3类型,物体相对于父元素的位置. 

eulerAngles              Vector3类型,旋转后的欧拉角相对世界坐标的值。简单理解为各向量坐标所转动的值就好了。 

localEulerAngles      Vector3类型,相对父元素的欧拉角。 

right                        Vector3类型,表示x轴(U3里红色的轴)方向的单位向量。 

up                           Vector3类型,表示y轴(U3里绿色的轴)方向的单位向量。 

forward                   Vector3类型,表示z轴(U3里蓝色的轴)方向的单位向量。 

rotation                   Quaternion类型(quatermion就是个四维数,比vector3多一个w变量表示旋转角度的),世界坐标旋转。. 

localRotation           Quaternion类型,本地坐标的旋转度数(相对父元素)。 

localScale                Vector3类型,相对本地坐标系缩放(就是矩阵的乘法) 

parent                      Transform类型,他的父元素。 

worldToLocalMatrix  Matrix4*4类型,把一个点从世界坐标系的位置转换为本地坐标系位置。(终究得用矩阵,哈哈)只读 

localToWorldMatrix  Matrix4*4类型,把一个点从本地坐标系转换为世界坐标系。(只读) 

root                          Transform类型,返回最上层的那个Transform,就是他父亲的父亲的父亲的。。。(如果有的话) 

childCount                int型,你子元素的数量。。。 

lossyScale                Vector3类型,相对世界坐标系缩放。


小鹿姐姐
4楼 · 2020-12-03 20:42

这里所说的tansform不是类UnityEngine命名空间下的Transform,而是transform.

Transform 是Unity中最常用的类了。

其类的代码如下,代码贴出来太长也不是要说的重点:



我们所说的是常用的还有对象组件自身的transform,他里面包含了位置,旋转,缩放参数。

在常用组件Compnent的代码中:


注意这个东西是属性,有get,没有set.

当然命名空间仍旧为UnityEngine。

二、transform用法及其原因

我们先来看看,这个WrapperlessIcall ,它是unity中一个属性字段,他有什么用呢?

WrapperlessIcall 内部实现,非公开方法。

大家来看看如下代码:


看起来稀松平常,波澜不惊,但是下面水还是蛮深的。

使用myTransform替代this.transform。如果你不知道u3d内部实现获取方式你肯定会以为这人脑抽水了,有直接的不用,还自己保存起来。

this.transform并不是变量,而是一个get/set属性(property)

他是一个C++写的代码,在Mono中被调用。调用是intenal method的调用,其效率本身不是高。

比如,transform 经常需要保存在本地,然后在使用。

n

值得注意的是这个调用方法略慢,因为你需要调用外部的CIL(aka interop),花费了额外的性能。

三、新的版本会不会做了优化呢?

个人觉得这个是之前的unity版本的东西,可能效率和性能没有做优化

WrapperlessIcall][MethodImpl(MethodImplOptions.InternalCall)]

1

2

就这些属性来说,有的是直接调用C++代码,有的则是调用.net的内部函数到Unity中。

对于新的版本是不是有的优化处理呢,自己做了测试:

先看看现在Compnent的代码:


效率有手动cache (4ms)>>transform(20ms)>>this.tranform(22ms)>> GetComponent()(54ms)

但是原来的测试结果为:

1000000 次的Iterations

GetComponent=619ms

Monobehaviour = 60ms

CachedMB = 8ms

Manual Cache = 3ms


看来这其中还是有奥秘的。

我电脑配置目前还算可以,win7 64 位,I7-3770 + 960显卡+ 16G内存。

结果对比,相对与之前2012年Unity版本,可能mono做了很大的优化,当然我们的电脑可能还是不一样,没有办法直接做对比,也只能猜测而已。

但是结论还是一样的:

在以后的使用中,若大量使用,还是需把transform给手动保存下来吧

说明:

代码做了修改:

原来的代码中有这些:


四、强制拔高啦!!

我还想努力一把!!

让别人可以直接用,但是有不修改原有代码:

怎么办呢?

既然大家都要继承monobehaviour,那我就在他上面想办法。

4.1 方法一,实现一个扩展方法:


但是这个扩展方法,必须静态的,所以没有办法做一个静态的临时变量啊,这个不靠谱啊。

若写成上面的代码效率并没有太多提高。每次还是需要赋值。

所以这个路走不通啊!!

来看方法二吧。

4.2 方法二,乾坤大挪移,重新命名类


UnityMonoBehaviour 这个是啥呢?哈哈

看using UnityMonoBehaviour = UnityEngine.MonoBehaviour;

我们来看看结果:

直接使用tranform 和this.tranform花费时间为9ms,比上面的20多ms,那是降低了很多。

但是,这个是结论啊,还是没有手动缓存的效果高啊,依旧为4ms。



作者:LunarShade
链接:https://www.jianshu.com/p/b9de65aebf3d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


Ross
5楼 · 2020-12-03 20:44

在脚本里面使用transform对象,运用点运算符,调用Transform类里面的相关属性和方法,即可以实现物体的移动,旋转和缩放功能.

yy123456
6楼 · 2020-12-05 20:10

U3D所 封装的矩阵运算了,用于缩放,平移,还有定位(这个囧,他把矩阵给放这用了,所有物体都可以用transform类型来存放)。Transform所 实现的功能不过就是物体矩阵的运算罢了

老杜
7楼 · 2020-12-07 16:10

Transform上面主要封装了物体的位置,朝向,大小属性

蜗牛
8楼 · 2020-12-10 18:11

Transform类中包含了一些重要的属性,比如,position  rotation scale等

一般我们可以通过代码获取某个物体身上得Transform进行操作它,与之对比的还有小写的transform

区别:一个是类,一个是属性

小狮子
9楼 · 2020-12-10 18:16

none:定义不进行转换。

matrix(n,n,n,n,n,n):定义 2D 转换,使用六个值的矩阵。

matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n) 定义 3D 转换,使用 16 个值的 4x4 矩阵。

translate(x,y):定义 2D 转换。

translate3d(x,y,z):定义 3D 转换。

translateX(x):定义转换,只是用 X 轴的值。

translateY(y):定义转换,只是用 Y 轴的值。

translateZ(z):定义 3D 转换,只是用 Z 轴的值。

scale(x,y):定义 2D 缩放转换。

scale3d(x,y,z):定义 3D 缩放转换。

scaleX(x):通过设置 X 轴的值来定义缩放转换。

scaleY(y):通过设置 Y 轴的值来定义缩放转换。

scaleZ(z):通过设置 Z 轴的值来定义 3D 缩放转换。

rotate(angle):定义 2D 旋转,在参数中规定角度。

rotate3d(x,y,z,angle):定义 3D 旋转。

rotateX(angle):定义沿着 X 轴的 3D 旋转。

rotateY(angle):定义沿着 Y 轴的 3D 旋转。

rotateZ(angle):定义沿着 Z 轴的 3D 旋转。

skew(x-angle,y-angle):定义沿着 X 和 Y 轴的 2D 倾斜转换。

skewX(angle):定义沿着 X 轴的 2D 倾斜转换。

skewY(angle):定义沿着 Y 轴的 2D 倾斜转换。

perspective(n):为 3D 转换元素定义透视视图。

相关问题推荐

  • 回答 10

    Transform类是Unity脚本编辑的一个基础且重要的类一、成员变量position:在世界空间坐标transform的位置。localPosition:相对于父级的变换的位置。如果该变换没有父级,那么等同于Transform.position。eulerAngles:世界坐标系中的旋转(欧拉角)。localEule...

  • 回答 10

    MatrixTransform:创建一个用于操纵二维屏幕中的对象或者坐标系统的专用转换矩阵RotateTransform:围绕二维(x,y)坐标系统中一个指定点顺时针方向旋转对象ScaleTransform:调整对象在二维(x,y)坐标系统中的尺寸SkewTransform:在二维(x,y)坐标系统中倾斜对象Tr...

  • 回答 4

    Text作为UGUI最基础的控件以及最常用的控件,它在项目中的应用绝对可以算是最多的,任何一个UI界面可以说都离不开它,它的基本属性如下:一、rect transform组件:rect transform(矩形变换):理解为专门用于UI的transform组件,是UGUI所有控件的标准位置变...

  • 回答 17

    还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学  学学js flash as等等  有个梯度就好多了如果要用好unity  不会编程那是不行的  学习的过程中都有个头疼的过程  记住  头越痛  代表你要接受的东西越多  坚持 你的大脑在和知识兼容中:D...

  • unity如何自学Unity3D 2022-01-06 15:24
    回答 18

    可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...

  • 回答 23

    可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...

  • 回答 2

    Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...

  • 回答 4

    文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细具体代码实现如下:Shader Custom/shuibowen{ Properties{ _MainTex(Base (RGB),2D)=white{} _distanceFactor(Distancefactor,float)=1 _timeFactor(time factor,float)=...

  • 回答 7

    策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样!    游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...

  • 回答 7
    已采纳

    可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。

  • 回答 3
    已采纳

    游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...

没有解决我的问题,去提问