Transform

http://docs.unity3d.com/ScriptReference/Transform.html


Transform

继承自:Component


一个对象的位置、旋转和缩放。

场景中每个对象都有一个Transform。它被用来存储和操作对象的位置、旋转和缩放。每一个Transform都可以有一个父级,允许你分层次的运用位置、旋转和缩放。Hierarchy面板有层级关系。他们也支持计数器,所以你可以遍历子物体。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        foreach (Transform child in transform) {
            child.position += Vector3.up * 10.0F;
        }
    }
}

Variables

childCount

类型:int

Transform的子物体的个数。(只返回一级子物体的个数,子物体下的子物体不计数)

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        print(transform.childCount);
    }
}

eulerAngles

类型:Vector3

以角度为单位,以欧拉角计算的旋转。

x, y, z角代表绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度。

仅使用这个变量来读取和设置脚的绝对的值。不要递增他们,超过360度时它将失败。使用Transform.Rotate来代替。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public float yRotation = 5.0F;
    void Update() {
        yRotation += Input.GetAxis("Horizontal");
        transform.eulerAngles = new Vector3(10, yRotation, 0);
    }
    void Example() {
        print(transform.eulerAngles.x);
        print(transform.eulerAngles.y);
        print(transform.eulerAngles.z);
    }
}
不要单独的设置一个轴的角度,因为它将导致偏移和不希望的旋转。当设置一个新值时,一次性全部设置他们,就像上面所示。unity会转换欧拉角度到Transform.rotation或将Transform.rotation转换到欧拉角度。


forward

类型:Vector3

世界坐标系中蓝色的轴,也就是Z轴。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public float thrust;
    public Rigidbody rb;
    void Start() {
        rb = GetComponent<Rigidbody>();
    }
    void Update() {
        rb.AddForce(transform.forward * thrust);
    }
}
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public float angleBetween = 0.0F;
    public Transform target;
    void Update() {
        Vector3 targetDir = target.position - transform.position;
        angleBetween = Vector3.Angle(transform.forward, targetDir);
    }
}
hasChanged

类型:bool

上一次这个标签设置为fsalse后transform改变过吗?

对变换的任何改变会导致矩阵的重新计算:任意调节它的位置、旋转或缩放。请注意此操作,是否在设置此标识之前新旧的值不同,也将不会实际检查。因此,对于实例化,transform.position将总是设置此变换的hasChanged,无论是否有实际的变化。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        if (transform.hasChanged) {
            print("The transform has changed!");
            transform.hasChanged = false;
        }
    }
}
localEulerAngle

类型:Vector3

以角度为单位,相对于父级transform的旋转。

x, y, z角度代表绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度。

仅使用这个变量去读取和设置绝对的角度的值。不要递增它们,当角度超过360度时它将失败,使用Transform.Rotate代替。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        print(transform.localEulerAngles.x);
        print(transform.localEulerAngles.y);
        print(transform.localEulerAngles.z);
    }
}
Unity自动转换这些角度到Transform.loaclRotation,反之亦然。


localPosition

类型:Vector3

相对于父级transform,当前transform的位置。

如果当前transform没有父级,它与Transform.position的值一样。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.localPosition = new Vector3(0, 0, 0);
        print(transform.localPosition.y);
    }
}
注意当计算世界坐标系的位置时,父级transform的世界坐标系的旋转和缩放会作用于当前位置。也就是说,Transform.position的1unit就是1unit,而transform.localposition的1unit会因为父级的缩放而缩放。


localScale

类型:Vector3

相对于父级transform,当前transform的缩放。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        // Widen the object by 0.1
        transform.localScale += new Vector3(0.1F, 0, 0);
    }
}

localRotation

类型:Quaternion

相对于父级transform,当前transform的旋转。

Unity以四元数来存储rotation。要旋转一个对象,使用Transform.Rotate。要以欧拉角度来改变旋转,使用Transform.localEulerAngles。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.localRotation = Quaternion.identity;
    }
}

localToWorldMatrix

类型:matrix4x4

一个点从自身坐标系转换到世界坐标系的矩阵。(只读)

如果你对使用矩阵来转换坐标不熟悉,使用 Transform.TransformPoint代替。

重要:如果你在设置着色器参数你必须使用Renderer.localToWoldMarix代替。



lossyScale

类型:Vector3

对象的全局缩放(只读)(世界坐标系的缩放)

请注意如果你有一个缩放的父级transform并且子级是任意旋转,那么这个缩放有偏差。因此缩放不能由3个组件的向量正确表示,而是用3X3的矩阵。然而这种表述方式工作起来非常不方便。lossyScale是一个非常方便的属性来表示真实世界的缩放。如果你的对象没有偏差,这个值将是完全正确的,如果物体包含偏差,这个值也不会有很大不同。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        print(transform.lossyScale);
    }
}
(这个值就是物体在世界坐标系中的缩放,缩放是有损的是因为并不精确,它就是错误的如果它的一个或者多个父级有不同的x, y, z的缩放或者旋转。如果父级的缩放是统一的那么它就是完全正确的。如果父级的旋转是:0.1,0.5,0.4,lossyScale会接近但并不是非常精确。如果父级的缩放是:0.1,0.1,0.1,lossyScale是精确的。)


parent

类型:Transform

transform的父级

改变父级会改变相对于父级的位置、缩放和旋转信息,但是不会改变世界坐标系的位置、旋转和缩放。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
	public GameObject player;

	//Invoked when a button is pressed.
	public void Example(GameObject newParent)
	{
		//Makes the GameObject "newParent" the parent of the GameObject "player".
		player.transform.parent = newParent.transform;
			
		//Display the parent's name in the console.
		Debug.Log ("Player's Parent: " + player.transform.parent.name);

		// Check if the new parent has a parent GameObject.
		if(newParent.transform.parent != null)
		{
			//Display the name of the grand parent of the player.
			Debug.Log ("Player's Grand parent: " + player.transform.parent.parent.name);
		}
	}
}
另一个例子:

// Detaches the transform from its parent.
	transform.parent = null;

position

类型:Vector3

transform在世界坐标系的位置

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.position = new Vector3(0, 0, 0);
        print(transform.position.x);
    }
}
right

类型:Vector3

对象的自身坐标系的x轴在世界坐标系中指向的方向。


root

类型:Transform

层级关系中最上层的transform。

(永远不会返回null,如果transform没有父级则返回他自己)

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnCollisionEnter(Collision collision) {
        if (collision.transform.root != transform.root)
            print("The colliding objects are not in the same hierarchy");
        
    }
}
rotation

类型:Quaternion

保存在四元数中的transform在世界坐标系中的旋转。

Unity以四元数保存旋转。要旋转一个对象,使用Transform.Rotate。要以欧拉角设置旋转,使用Transform.eulerAngles

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.rotation = Quaternion.identity;
    }
}
另一个例子:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public float smooth = 2.0F;
    public float tiltAngle = 30.0F;
    void Update() {
        float tiltAroundZ = Input.GetAxis("Horizontal") * tiltAngle;
        float tiltAroundX = Input.GetAxis("Vertical") * tiltAngle;
        Quaternion target = Quaternion.Euler(tiltAroundX, 0, tiltAroundZ);
        transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
    }
}
up

类型:Vector3

世界坐标系中,transform的绿色的轴。


worldToLocalMatrix

类型:Matrix4x4

矩阵转换一个点从世界坐标系到自身坐标系(只读)

如果你不熟悉使用矩阵来转换坐标,使用Transform.InverseTransformPoint 代替

重要:如果设置着色器参数,你必须使用Renderer.worldToLocalMatrix代替




Public Functions

DetachChildren

类型:void DetachChildren()

和所有子级解除父子关系。

如果你想销毁一个层级关系的根对象而不想销毁子对象,会用到这个函数。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.DetachChildren();
        Destroy(gameObject);
    }
}
Find

类型:Transform Find(string name)

参数:

name: 要找的子级的名字。


通过name找到一个子级并返回它。

如果没有找到name子级,返回null。如果name包含一个'/'字符,它会将其作为层级的路径名。(只返回一级子级,多级子级必须按路径查找)

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
	public GameObject player;
	public GameObject gun;
	public Transform ammo;

	//Invoked when a button is clicked.
	public void Example()
	{
		//Finds and assigns the child of the player named "Gun".
		gun = player.transform.Find("Gun").gameObject;

		//If the child was found.
		if(gun != null)
		{
			//Find the child named "ammo" of the gameobject "magazine" (magazine is a child of "gun").
			ammo = gun.transform.Find("magazine/ammo");
		}
		else Debug.Log("No child with the name 'Gun' attached to the player");
	}
}

GetChild

类型:Transform GetChild(int index)

参数:

index: 要返回的子transform的索引。必须比Transform.childCount小。

返回:  索引为index的子级transform

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
	public Transform meeple;
	public GameObject grandChild;

	public void Example()
	{
		//Assigns the transform of the first child of the Game Object this script is attached to.
		meeple = this.gameObject.transform.GetChild(0);

		//Assigns the first child of the first child of the Game Object this script is attached to.
		grandChild = this.gameObject.transform.GetChild(0).GetChild(0).gameObject;
	}
}

GetSiblingIndex

类型:int GetSiblingIndex()


会的同级索引。(即自己在所在层级的索引)



InverseTransformDirection

类型:Vector3 InverseTransformDirection(Vector3 direction)


从世界坐标系转换一个direction到自身坐标系。与Transform.TransformDirection相反

这个操作不受缩放影响。

你用该使用Transform.InverseTransformPoint如果向量是空间的点而不是方向。


using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    private Vector3 relative;
    void Example() {
        relative = transform.InverseTransformDirection(Vector3.forward);
        Debug.Log(relative);
    }
}
2. public  Vector3  InverseTransformDirection(float x, float y, float z)

同上

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    private Vector3 relative;
    void Example() {
        relative = transform.InverseTransformDirection(0, 0, 1);
        Debug.Log(relative);
    }
}



InverseTransformPoint

类型:Vector3 InverseTransformPoint(Vector3 position)


将position从世界坐标系转换到自身坐标系。

这个函数与Transform.TransformPoint相反,后者被用来从自身坐标系转换到世界坐标系。

注意返回值受缩放影响。如果你在处理方向向量而不是位置向量,使用Transform.InverseTransformDirection。

	// Calculate the transform's position relative to the camera.
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public Transform cam;
    public Vector3 cameraRelative;
    
    void Start() {
		cam = Camera.main.transform;
		Vector3 cameraRelative = cam.InverseTransformPoint(transform.position);

        if (cameraRelative.z > 0)
            print("The object is in front of the camera");
        else
            print("The object is behind the camera");
    }
}
2.  public  Vector3  InverseTransformPoint (float  x , float  y , float  z );

同上

	// Calculate the world origin relative to this transform.
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Start() {
        Vector3 relativePoint = transform.InverseTransformPoint(0, 0, 0);
        
        if (relativePoint.z > 0)
            print("The world origin is in front of this object");
        else
            print("The world origin is behind of this object");
    }
}

InverseTransformVector

类型:Vector3 InverseTransformVector(Vector3 vector)

将一个vector从世界坐标系转换到自身坐标系。Transform.TransformVector函数的反面。受缩放影响。


2.  public Vector3 InverseTransformVector(float x, float y, float z);

同上



IsChildOf

类型:bool IsChildOf(Transform parent)

当前的transform是否是parent的子级?

返回一个布尔值表明这个transform是否是给出的transform的子级。如果这个transform是个子级、多级子级(子级的子级)或完全就是它自己,返回true,否则返回false。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnTriggerEnter(Collider col) {
        if (col.transform.IsChildOf(transform))
            return;
        
        print("Do something here");
    }
}

LookAt

类型: void LookAt(Transform target, Vector3 worldUp = Vector3.up);

参数:

target : 要朝向的对象

worldUp: 指定向上的方向的向量


旋转transform,使前方朝向target的位置。

然后它旋转transform使他的向上的方向向量指向worldup向量示意的方向。如果worldup参数为空,函数默认使用世界坐标系y轴。worldup只是一个示意向量。如果向前的方向垂直于worldup,向上的向量只匹配worldup向量。

// This complete script can be attached to a camera to make it 
	// continuously point at another object.
	
	// The target variable shows up as a property in the inspector. 
	// Drag another object onto it to make the camera look at it.
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public Transform target;
    
    void Update() {
    	// Rotate the camera every frame so it keeps looking at the target 
        transform.LookAt(target);
    }
}
2.   public void  LookAt ( Vector3  worldPosition Vector3  worldUp  = Vector3.up);

同上


Rotate

类型:Rotate(Vector3 eulerAngles, Soace relativeTo=Space.Self)


绕z轴旋转eulerAngles.z度,绕x轴旋转eulerAngles.x度,绕y轴旋转eulerAngles.y度(按照这个顺序)。

如果没有设置relativeTo,旋转绕着自身坐标系旋转。如果relativeTo设置为Space.World,绕世界坐标系旋转

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.Rotate(Vector3.right * Time.deltaTime);
        transform.Rotate(Vector3.up * Time.deltaTime, Space.World);
    }
}
2.  public void  Rotate (float  xAngle , float  yAngle , float  zAngle Space relativeTo  = Space.Self);

同上


3.  public void Rotate(Vector3 axis, float angleSpace relativeTo = Space.Self);

绕着axis旋转angle度。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.Rotate(Vector3.right, Time.deltaTime);
        transform.Rotate(Vector3.up, Time.deltaTime, Space.World);
    }
}


RotateAround

类型: void RotateAround(Vector3 point, Vector3 axis, float angle);


世界坐标系中,绕着穿过point点的axis轴旋转angle度。

这个函数同时改变transform的位置和旋转

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.RotateAround(Vector3.zero, Vector3.up, 20 * Time.deltaTime);
    }
}

SetAsFirstSibling

类型:void SetAsFirstSibling()


移动transform到自身所在transform列表的开端。(把transform移动到当前层级的第一个位置)

using UnityEngine;
using System.Collections;
using UnityEngine.UI; //Required when using UI Elements.
using UnityEngine.EventSystems; // Required when using event data.

public class ExampleClass : MonoBehaviour, IPointerDownHandler
{
	public RectTransform panelRectTransform;

	//Invoked when the mouse pointer goes down on a UI element. 
	public void OnPointerDown (PointerEventData data) 
	{
		// Puts the panel to the back as it is now the first UI element to be drawn.
		panelRectTransform.SetAsFirstSibling ();
	}
}

SetAsLastSibling

类型: void SetAsLastSibling();

移动transform到transform列表的末端。

using UnityEngine;
using System.Collections;
using UnityEngine.UI; //Required when using UI Elements.
using UnityEngine.EventSystems; // Required when using event data.

public class ExampleClass : MonoBehaviour, IPointerDownHandler
{
	public RectTransform panelRectTransform;

	//Invoked when the mouse pointer goes down on a UI element. 
	public void OnPointerDown (PointerEventData data) 
	{
		// Puts the panel to the front as it is now the last UI element to be drawn.
		panelRectTransform.SetAsLastSibling ();
	}
}

SetParent

类型: void SetParent(Transform parent, bool worldPositionStays)

参数:

parent: transform要使用的父级

worldPositionStays: 如果为真,相对父级的位置、缩放和旋转被改变所以对象可以保持以前的世界坐标系中的位置、旋转和缩放。


设置transform的父级。

这个函数与parent属性一样,除了它可以通过设置worldPositionStays属性为false让transform保持他的局部坐标不变。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
	public GameObject player;

	//Invoked when a button is clicked.
	public void Example(Transform newParent)
	{
		//Sets "newParent" as the new parent of the player GameObject.
		player.transform.SetParent(newParent);

		//Same as above, except this makes the player keep its local orientation rather than its global orientation.
		player.transform.SetParent(newParent, false);
	}
}

SetSiblingIndex

类型:void SetSiblingIndex(int index)

参数:

index: 设置的索引


设置当前层级索引。


TransformDirection

类型:Vector3 TransformDirection(Vection direction)


把direction从自身坐标系转换到世界坐标系。

这个操作不受transform的缩放和位置影响。

返回的向量与direction长度相同。

如果向量代表的是一个位置而不是方向,使用Transform.TransformPoint。


2. public Vector3 TransformDirection(float x, float y, float z);

同上



TransformPoint

类型:Vector3 TransformPoint(Vector3 position)


把position从自身坐标系转换到世界坐标系

注意返回的位置受缩放影响。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public GameObject someObject;
    public Vector3 thePosition;
    
    void Start() {
    	// Instantiate an object to the right of the current object
	    thePosition = transform.TransformPoint(Vector3.right * 2);
	    Instantiate(someObject, thePosition, someObject.transform.rotation);
    }
}
2.  public  Vector3  TransformPoint (float  x , float  y , float  z );

同上

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public GameObject someObject;
    
    void Start() {
    	// Instantiate an object to the right of the current object
        Vector3 thePosition = transform.TransformPoint(2, 0, 0);
        Instantiate(someObject, thePosition, someObject.transform.rotation);
    }
}

TransformVector

类型: Vector3 TransformVector(Vector3 vector)

操作不受transform的位置影响,但是受缩放影响。返回的向量可能与vector长度不一样。


2. public Vector3 TransformVector(float x, float y, float z);

同上



Translate

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


将transform以translation的方向和距离移动。

如果relativeTo没有设置或设置为Space.Self,移动是相对于自身坐标系。如果relativeTo设置为Space.World,移动是相对于世界坐标系。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.Translate(Vector3.forward * Time.deltaTime);
        transform.Translate(Vector3.up * Time.deltaTime, Space.World);
    }
}

2.public void Translate(float x, float y, float zSpace relativeTo = Space.Self);

同上

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.Translate(0, 0, Time.deltaTime);
        transform.Translate(0, Time.deltaTime, 0, Space.World);
    }
}

3.public void Translate(Vector3 translationTransform relativeTo);

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.Translate(Vector3.right * Time.deltaTime, Camera.main.transform);
    }
}

4.public void Translate(float x, float y, float zTransform relativeTo);

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        transform.Translate(Time.deltaTime, 0, 0, Camera.main.transform);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值