Unity基础(8)-Transform组件与类
2018-01-27 本文已影响252人
元宇宙协会
01-Unity下的Transform组件
Transform组件02-Transform类包含的属性
// 获得当前Transform的子Transform的个数
childCount The number of children the Transform has.
// 当前Transform的父亲
parent The parent of the transform.
// 获得Transform物体的根物体Transform (儿子获取父亲,孙子获取爷爷)
root Returns the topmost transform in the hierarchy.
// 当前的Transform被改变后,就会调用这个属性,所以一般使用
hasChanged Has the transform changed since the last time the flag was set to 'false'?
// 当前物体树状结构层级容量
hierarchyCapacity The transform capacity of the transform's hierarchy data structure.
// 当前节点的树状结构层次数目
hierarchyCount The number of transforms in the transform's hierarchy data structure.
//物体的世界角度与自身角度,这两者都是以Vector3进行表示
eulerAngles The rotation as Euler angles in degrees.
localEulerAngles The rotation as Euler angles in degrees relative to the parent transform's rotation.
//物体的世界坐标与自身坐标
position The position of the transform in world space.
localPosition Position of the transform relative to the parent transform.
// 物体的世界角度与自身角度,这两者都是以四元数进行旋转
rotation The rotation of the transform in world space stored as a Quaternion.
localRotation The rotation of the transform relative to the parent transform's rotation.
// 物体的自身大小(可读fget可写set)与世界大小(只读get)
localScale The scale of the transform relative to the parent.
lossyScale The global scale of the object (Read Only).
//获得Transform组件在世界x,y,z轴的正值即(Vector3.right,Vector3.up,Vector3.forward)
right The red axis of the transform in world space.
up The green axis of the transform in world space.
forward The blue axis of the transform in world space.
// 矩阵 从世界矩阵转成自身矩阵
worldToLocalMatrix Matrix that transforms a point from world space into local space (Read On)
// 矩阵 从自身矩阵转成世界矩阵
localToWorldMatrix Matrix that transforms a point from local space into world space (Read Only).
03-Transform类属性使用
// 获取物体的坐标信息
Vector3 pos = sp.position; // 世界坐标
Vector3 pos1 = sp.localPosition; // 自身坐标
Debug.Log(pos);
Debug.Log(pos1);
// 打印的就是Transform的Rotation
Vector3 anglrL = tf.localEulerAngles;
Vector3 anglr = tf.eulerAngles;
Debug.Log(anglr);
Debug.Log(anglrL);
Quaternion rota = tf.localRotation; // 自身旋转位置
Quaternion rota1 = tf.rotation; // 世界旋转位置
Debug.Log(rota);
Debug.Log(rota1);
tf.localScale = new Vector3(2, 2, 2);
Debug.Log(sp.localScale + "圆球的自身大小");
// 获取当前物体在世界中的大小
Debug.Log(tf.lossyScale);
// 拿到Transform组建的父物体
//Transform ptf = sp.parent;
//Debug.Log(ptf.name);
// 脱离父子关系
//sp.parent = null;
//Debug.Log(sp.parent.name);
Vector3 yUp = sp.up;
Vector3 zForward = sp.forward;
Vector3 xRight = sp.right;
Debug.Log(yUp);
Debug.Log(xRight);
Debug.Log(zForward);
// 获取当前物体的子个数
int number = tf.childCount;
Debug.Log(number);
Debug.Log(cuSun.root.name);
// 当前树状结构层及容量
Debug.Log(tf.hierarchyCapacity + "代表当前所在的树的层次容量");
// 当前节点的树状结构层次数目。
Debug.Log(tf.hierarchyCount + "...");
// 矩阵 从自身矩阵转成世界矩阵
Matrix4x4 ma = tf.localToWorldMatrix;
// 矩阵 从世界矩阵转成自身矩阵
Matrix4x4 ma1 = tf.worldToLocalMatrix;
Debug.Log(ma.ToString());
Debug.Log(tf.hasChanged);
Debug.Log(ma1.ToString());
// 当前的Transform被改变后,就会调用这个属性
//if (tf.hasChanged)
//{
// Debug.Log("当前的Transform被改变");
// tf.hasChanged = false;
//}
04-Transform类包含的方法
//删除所有子类
DetachChildren Unparents all children.
//查找子类对象的Transform
Find Finds a child by name and returns it.
//获取子类对象Transform组件,根据索引
GetChild Returns a transform child by index.
// 调用此方法的Transform是否为后面的Transform组件儿子
IsChildOf Is this transform a child of parent?
// 为调用此方法的Transform组件设置父Transform,建立父子级关系
SetParent Set the parent of the transform.
// 让当前调用此方法的物体的z轴朝向目标位置
LookAt Rotates the transform so the forward vector points at /target/'s current position.
// 让当前调用此方法的物体产生位移移动
Translate Moves the transform in the direction and distance of translation.
// 旋转方法
Rotate Applies a rotation of eulerAngles.z degrees around the z axis, eulerAngles.x degrees around the x axis, and eulerAngles.y degrees around the y axis (in that order).
// 旋转方法(绕某个轴进行旋转)
RotateAround Rotates the transform about axis passing through point in world coordinates by angle degrees.
// 为当前Transform组件设置位置与旋转角
SetPositionAndRotation Sets the world space position and rotation of the Transform component.
// 获取当前组件的游戏对象在Hierarchy中的索引值(从0开始计)
GetSiblingIndex Gets the sibling index.
// 设置当前组件的游戏对象在Hierarchy中的索引值(从0开始计)
SetSiblingIndex Sets the sibling index.
//设置当前组件的游戏对象在Hierarchy面板中最上面位置
SetAsFirstSibling Move the transform to the start of the local transform list.
//设置当前组件的游戏对象在Hierarchy面板中最下面位置
SetAsLastSibling Move the transform to the end of the local transform list.
// 将方向从本地坐标转换为世界坐标,不受缩放影响
TransformDirection Transforms direction from local space to world space.
// 使用父类Transform组件调用此方法可以将子类对象的自身坐标转换成世界坐标
// 使用子类Transform组件调用此方法可以将父类对象的世界坐标拿到
// 使用父类Transform组件调用此方法可以将子类对象的坐标点转换成世界坐标点
TransformPoint Transforms position from local space to world space.
// 将坐标点从本地坐标转换为世界坐标,不受位置影响但受缩放影响。
TransformVector Transforms vector from local space to world space.
// 使用父类Transform组件调用此方法可以将子类对象的自身方向转换成世界方向
// 使用父类Transform组件调用此方法可以将子类对象的世界坐标转换成自身坐标
InverseTransformDirection Transforms a direction from world space to local space. The opposite of Transform.TransformDirection.
// 使用父类Transform组件调用此方法可以将子类对象的世界坐标点转换成自身坐标点
InverseTransformPoint Transforms position from world space to local space.
// 使用父类Transform组件调用此方法可以将子类对象的世界方向转换成自身方向
InverseTransformVector Transforms a vector from world space to local space. The opposite of Transform.TransformVector.
05-Transform类方法使用
public class TransformScripts : MonoBehaviour {
private Transform tf;
public Transform sp;
public Transform cuSun;
public Transform currrent;
void Start () {
tf = this.transform;
// 删除所有的子对象
//tf.DetachChildren();
// 当前transform的父控件设置为空
//sp.parent = null;
//sp.parent = tf;
// 只能查找子类对象的Transform
//sp = tf.Find("Sphere");
//Debug.Log(sp.name);
// 获取子对象的Transform,index表示子对象,从0开始
sp = tf.GetChild(0);
//Debug.Log(sp.name);
// 获取同级索引
//int number = tf.GetSiblingIndex();
//Debug.Log(number);
//Debug.Log( "sp是否是tf的子对象"+ sp.IsChildOf(tf));
//获取的Sp代表的物体的世界坐标
Debug.Log(sp.position);
// 获取的自身坐标(参考父物体的坐标点)
Debug.Log(sp.localPosition);
// 一定要使用父类的Transform组件进行转换
Debug.Log( "使用父类的坐标转换方法:让子对象从自身坐标转为世界坐标" + tf.TransformPoint(sp.localPosition));
Debug.Log("使用父类的坐标转换方法:让子对象从世界坐标转为自身坐标" + tf.InverseTransformPoint(sp.position));
// InverseTransformDirection
// TransformDirection
// InverseTransformVector
// TransformVector
}
void Update () {
if (Input.GetKeyDown(KeyCode.Q))
{
// 获取同级索引
//int number = tf.GetSiblingIndex();
// 设置当前的transform组件的物体在层级的最前面
//tf.SetAsFirstSibling();
// 设置当前的transform组件的物体在层级的最后面
//tf.SetAsLastSibling();
}
if (Input.GetMouseButtonDown(0))
{
// 让当前含有transform组件的物体朝向另一transform组件的物体位置
//currrent.LookAt(tf);
}
if (Input.GetMouseButton(0))
{
// 让当前的Transform组建进行旋转
tf.Rotate(new Vector3(10, 0, 0));
}
if (Input.GetMouseButton(1))
{
// 添加一个托线渲染器
currrent.gameObject.AddComponent<TrailRenderer>();
// 绕着tf物体的位置,进行Y轴10角度的旋转
currrent.RotateAround(tf.position, Vector3.up, 10f);
}
if (Input.GetMouseButtonDown(2))
{
//currrent.SetParent(tf);
// 给一个物体的transform设置一个点和角度
currrent.SetPositionAndRotation(new Vector3(0, 0, -5), new Quaternion(1, 0, 0, 1));
}
if (Input.GetKey(KeyCode.W))
{
// 使当前物体进行移动
currrent.Translate(new Vector3(0, 0, 1f) * 10f * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S))
{
currrent.Translate(new Vector3(0, 0, -1f) * 10f * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A))
{
// 使当前物体进行移动
currrent.Translate(new Vector3(-1f, 0,0) * 10f * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
currrent.Translate(new Vector3(1, 0, 0f) * 10f * Time.deltaTime);
}
}
06-游戏开发中的衍生使用
在游戏开发中,我们使用Transform类用来查找游戏对象的Transform组件,从来对游戏对象的坐标及旋转,大小进行相应的设置。
Transform类的调用相比GameObject类更加具有轻量化,耗费资源更少,建议开发中使用此类替代GameObject类的使用。