Unity3D中API常用方法和类详细讲解 (Transform类)

本文详细介绍了Unity3D中的Transform类,包括其Properties和Public Methods。主要讨论了Transform的坐标转换方法,如全局坐标系与局部坐标系、屏幕坐标系与全局坐标系、屏幕坐标系与视口坐标系之间的转换。还涵盖了Transform.Translate、Transform.Rotate、Transform.Find等关键方法的使用,以及Transform.LookAt、Transform.localPosition等属性的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 


Transform类


点击这里进入官网

该类表示的是对象的位置、旋转和缩放。


Properties


Transform.parent

public Transform parent;

让一个游戏物体成为另一游戏物体的子对象,那么该物体的 位置、缩放、旋转会受到父对象的位置、缩放、旋转的影响。

 void Start()
    {
        var tran = GameObject.Find("Sphere").transform;      
        gameObject.transform.parent = tran; // 让当前脚本所在游戏对象成为 Sphere 的子对象
    }

 


Public Methods


Transform.Translate

public void Translate(Vector3 translation);
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
  • 沿着 translation 的方向移动 | translation | 的距离,其结果将应用到 relativeTo 坐标系中。
  • 如果relativeTo为空 或设置为 Space.Self,则该 transform 则相对于自身的局部坐标轴进行移动。
  • 如果relativeTo是Space.World,则该transform是相对于世界坐标系进行移动。
public void Translate(float x, float y, float z);
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);
  • 通过参数 x、y、z 沿着transform 的  x、y、z 轴进行移动
  • 如果将 relativeTo 省略或设置为Space.Self,则该 transform 则相对于自身的局部坐标轴进行移动。(在场景视图中选择对象时显示的x,y和z轴)
  • 如果relativeTo是Space.World,则该transform是相对于世界坐标系进行移动。
public void Translate(Vector3 translation, Transform relativeTo);
  • 移动 transform 在translation的方向和距离上。
  • 默认情况下,那么它是相对于 relativeTo 的局部坐标系进行移动。
  • 如果relativeTo 是 null ,那么是相对于 relativeTo 的世界坐标系进行移动。
public void Translate(float x, float y, float z, Transform relativeTo);
  • 通过参数 x、y、z 沿着transform 的  x、y、z 轴进行移动
  • 默认情况下,那么它是相对于 relativeTo 的局部坐标系进行移动。
  • 如果relativeTo 是 null ,那么是相对于 relativeTo 的世界坐标系进行移动。

Transform.Find

public Transform Find(string n);
n需要查找的名字
  • 通常 参数 n 提供的名字进行查找。 如果没有找到, 则返回 null。
  • 如果 n 包含 '/',它将像路径名一样访问层次结构中的Transform。
  • 该操作必须在当前脚本所在的对象或者是获得某个对象的引用查找该对象的直接子对象(激活不激活都可以),不会查找到其它对象的同名直接子对象。
  • 该操作不会在整个场景中搜索。

Transform.Rotate:

public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
  • 使用 Transform.Rotate 以各种方式旋转 GameObjects。 第一个参数需要提供的是欧拉角 而不是 四元数。 第二个参数指示出你可以在世界坐标系 还是 物体坐标系中旋转。 默认情况下,是 按物体坐标系进行旋转的。
  • 此方法的功能是使得 transform 的实例在相对参数 relativeTo 的坐标系中旋转欧拉角eulerAngles。
public void Rotate(Vector3 axis, float angle, Space relativeTo = Space.Self);
  • 其中参数 axis 为旋转轴方向, 参数 angle 为旋转角度, 参数 relativeTo 为参考坐标系, 默认为Space.self.
  • 此方法的功能是使得 Gameobject 对象在 relativeTo 坐标系中绕轴向量 axis 旋转 angle 度。若想使Gameobject对象实例绕着某个物体旋转, 请用Transform.RotateAround

Public Methods


全局坐标系 和 局部坐标系 之间的相互转换


点击这里进入官网

Transform.Translate

public void Translate(Vector3 translation);
public void Translate(Vector3 translation, Space relativeTo = Space.Self);
  • 沿着 translation 的方向移动 | translation | 的距离,其结果将应用到 relativeTo 坐标系中。
  • 如果relativeTo为空 或设置为 Space.Self,则该 transform 则相对于自身的局部坐标轴进行移动。
  • 如果relativeTo是Space.World,则该transform是相对于世界坐标系进行移动。

可以通过以下操作来进行 全局坐标系 和 局部坐标系 之间的转换:

Transform.TransformPoint: ( 局部 ——》 全局)

public Vector3 TransformPoint(Vector3 position);
  • 将一个坐标点从局部坐标系转换到全局(世界)坐标系。
  • 请注意,返回的位置会受 scale 影响。 如果要处理方向,请使用 Transform.TransformDirection
public Vector3 TransformPoint(float x, float y, float z);
  • 将位置x、y、z从局部空间转换为世界空间。

Transform.InverseTransformPoint:(全局——》 局部

public Vector3 InverseTransformPoint(Vector3 position);
  • 将某个坐标点从 全局(世界)坐标系转换到局部坐标系。
  • 此函数基本上与Transform.TransformPoint相反,后者用于从局部坐标系转换到全局(世界)坐标系。
  • 请注意,返回的位置会受 scale 影响。 如果要处理方向,请使用 Transform.InverseTransformDirection 
public Vector3 InverseTransformPoint(float x, float y, float z);
  • 将某x、y、z 表示的坐标点从 全局(世界)坐标系转换到局部坐标系。

 

Transform.TransformDirection:( 局部 ——》 全局)

public Vector3 TransformDirection(Vector3 direction);
  • 将一个方向局部坐标系转换到全局坐标系。
  • 此操作不受transform 的 scale 或 position 的影响。返回的向量与 direction 有同样的长度。
public Vector3 TransformDirection(float x, float y, float z);
  • 将 x、y、z方向从局部空间转换为世界空间。

Transform.InverseTransformDirection (全局——》 局部

public Vector3 InverseTransformDirection(Vector3 direction);
  • 将一个方向从全局坐标系转换到局部坐标系。
  • 和 Transform.TransformDirection 相反。
  • 此操作不受 scale 影响。
  • 如果vector 表示的是空间中的某一个位置而不是方向,则应使用 Transform.InverseTransformPoint
public Vector3 InverseTransformDirection(float x, float y, float z);
  • 将某个方向的 x, y, z从世界空间变换到局部空间。

 

Transform.TransformVector (局部 ——》 全局)

public Vector3 TransformVector(Vector3 vector);
  • 将一个向量从局部坐标系转换到全局坐标系。
  • 此操作不受 transform 位置的影响,但受 scale 影响。 返回的新向量可能与原向量不同的长度。
public Vector3 TransformVector(float x, float y, float z);
  • 将向量 x, y, z从局部空间变换到世界空间。

Transform.InverseTransformVector (全局 ——》局部)

public Vector3 InverseTransformVector(Vector3 vector);
  • 将一个向量从全局坐标系转换到局部坐标系。
  • 是与 Transform.TransformVector. 相反的。
  • 此操作受 scale 影响。
public Vector3 InverseTransformVector(float x, float y, float z);
  • 一个向量(x, y, z)从世界坐标空间到局部坐标空间。这个操作与Transform.TransformVector相反。
  • 此操作受 scale 影响。

Transform.forward, Transform.right, Transform.up:

  • 当前物体的物体坐标系的z轴,x轴,y轴在世界坐标系上的指向
  • Vector3.forward ,(0,0,1)的缩写在 transform.Translate() 中使用时,如果不表明坐标系,则为物体的局部坐标,即物体自身的正前方。
  • Vector3.right,(1,0,0)的缩写。 Vector3.up ,(0,1,0)的缩写。

屏幕坐标系与全局坐标系之间的相互转换


点击这里进入官网

Camera.ScreenToWorldPoint

public Vector3 ScreenToWorldPoint(Vector3 position);
  • 将屏幕坐标转换为世界坐标。
  • 屏幕空间的坐标是以像素来表示的。屏幕左下角为(0,0); 右上角是 ( pixelWidth,pixelHeight ). 
  • z的 位置是以世界单位衡量的到 Camera 的距离。

 

Camera.WorldToScreenPoint 

public Vector3 WorldToScreenPoint(Vector3 position);
public Vector3 WorldToScreenPoint(Vector3 position, Camera.MonoOrStereoscopicEye eye);
  • 全局坐标转换为屏幕坐标。
  • 屏幕空间的坐标是以像素来表示的。屏幕左下角为(0,0); 右上角是 ( pixelWidth,pixelHeight ). 
  • z的 位置是以世界单位衡量的到 Camera 的距离。

Input.mousePosition:

public static Vector3 mousePosition;
  • 获得鼠标在屏幕坐标系中的坐标(只读),它是以像素为单位的。
  • 屏幕或窗口的左下角是(0,0)。 屏幕或窗口的右上角位于(Screen.width,Screen.height)。
  • 注意:即使鼠标不在 Game 视图中,也会返回鼠标的位置,例如,即使当 Cursor.lockState 设置为  CursorLockMode.None时也是如此。当以窗口模式运行且光标未被限制时,小于0或大于屏幕尺寸(Screen.width,Screen.height)的位置值表示鼠标光标在游戏窗口之外。

 


屏幕坐标系与视口坐标系之间的相互转换


Camera.ScreenToViewportPoint

public Vector3 ScreenToViewportPoint(Vector3 position);
  • 屏幕坐标转换为视口坐标。
  • 屏幕坐标的坐标是以像素来表示的。屏幕左下角为(0,0); 右上角是 ( pixelWidth,pixelHeight ). 
  • z的 位置是以世界单位衡量的到 Camera 的距离。

Camera.ViewportToScreenPoint

public Vector3 ViewportToScreenPoint(Vector3 position);
  1. 视口坐标转换为屏幕坐标
  2. 视口坐标是相对于Camera 的  normalized 的。Camera 的左下角是(0,0); 右上角是(1,1)。
  3. z 的 位置是以世界单位衡量的到 Camera 的距离。

 


全局坐标系与视口坐标系 之间的相互转换


Camera.WorldToViewportPoint

public Vector3 WorldToViewportPoint(Vector3 position);
public Vector3 WorldToViewportPoint(Vector3 position, Camera.MonoOrStereoscopicEye eye);
  • 全局坐标转换为视口坐标
  • 视口坐标是相对于Camera 的  normalized 的。Camera 的左下角是(0,0); 右上角是(1,1)。
  • z 的 位置是以世界单位衡量的到 Camera 的距离。

Camera.ViewportToWorldPoint

public Vector3 ViewportToWorldPoint(Vector3 position);
  • 视口坐标转换为全局坐标。
  • 视口坐标是相对于Camera 的  normalized 的。Camera 的左下角是(0,0); 右上角是(1,1)。
  • z 的 位置是以世界单位衡量的到 Camera 的距离。
  • 请注意,ViewportToWorldPoint 将x-y屏幕位置转换为3D空间中的x-y-z位置。

Transform.LookAt

public void LookAt(Transform target);
public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
target要指向的对象
worldUpVector 指定向上的方向。

旋转 transform,使向前的向量指向/ target /的当前位置。简单说,旋转物体使z轴指向目标物体。

当该物体设置了LookAt并指定了目标物体时,该物体的z轴将始终指向目标物体,在设置了worldUp轴向时,该物体在更接近指定的轴向使旋转便的灵活,注意worldUp指的是世界空间,不论你物体在什么位置,只要接近指定的轴方向,旋转会变的更灵活。

Transform.localPosition:

public Vector3 localPosition;
  • 可以通过 transform.localPosition 取得一个物体在其父物体的局部坐标系中的坐标
  • 如果该游戏物体没有父物体,那么 transform.localPosition 获得的依然是该物体在全局坐标系中的坐标。
  • 如果该物体有父物体,则获得是在其父物体的局部坐标系中的坐标。此时 检视视图中显示的为 localPosition 的值。

Transform.SetParent

public void SetParent(Transform p);
public void SetParent(Transform parent, bool worldPositionStays);
  • 将 游戏对象 P 的 transform 变成 当前对象的父对象。
  • 第二个参数,如果没有 或者 为  true时, 它与 Transform.Parent 效果是一样的,即 当前对象 的transform 会变成其 父对象的局部坐标系中的坐标。
  • 如果第二个参数为false, 那么当前游戏对象还是会变成 P 的 子对象, 但是其坐标不再是相对于父对象的局部坐标。 而是其自身世界坐标位置 (意思就是说,虽然变成了子对象,但是坐标并没有被改变)。

 

 

<think>嗯,用户这次的问题非常具体,是关于Unity中RectTransform的属性、常用API使用示例的。看来用户正在学习UI开发部分,而且很注重实践操作,需要清晰的讲解代码示例。从用户之前提供的引用材料来看,ta可能已经掌握了Unity脚本API的基本结构(C#为主)部分平台适配知识,但这次聚焦在UI组件的核心功能上。用户特意强调“不是参考引用中的刘海屏适配”,说明需要纯粹聚焦RectTransform本身的教学。考虑到UnityUI系统的特性,RectTransform确实是UGUI最基础也最重要的组件之一,但它的坐标系统对初学者来说容易混淆。需要重点区分:-锚点(Anchors)轴点(Pivot)的视觉差异-sizeDelta在不同锚点模式下的计算逻辑-屏幕空间与局部空间的转换用户要求示例,那就需要准备典型场景的代码片段,比如:1动态调整UI位置(适用于浮动提示框)2分辨率适配(针对不同屏幕比例)3运行时旋转缩放(比如加载动画)特别要注意强调RectTransform传统Transform的区别——用户很可能是从3D开发转向UI开发,容易忽略rectWidth/height等特殊属性。可以提及“UI元素必须放在Canvas下”这个前提条件,避免用户犯低级错误。安全问题方面,SetSizeWithCurrentAnchors方法在修改尺寸时可能导致父对象布局重新计算,需要提醒性能影响。对于锚点预设的使用要说明:过度依赖左上/右下等绝对定位可能导致不同分辨率下显示异常。</think> 好的,Unity 中的 `RectTransform` 是 UGUI(Unity GUI)系统的基础组件,专门用于控制 UI 元素在 Canvas 中的位置、大小、旋转缩放。它继承自 `Transform`,但增加了许多针对 2D UI 设计的强大功能。下面我们详细讲解其核心属性、常用 API、使用要点及示例。 **核心概念** 1. **锚点 (Anchors):** 定义 UI 元素相对于其父级 RectTransform(通常是 Canvas 或另一个 UI 面板)的位置基准点。由 `anchorMin` `anchorMax` 两个 `Vector2` 属性共同定义。 * `anchorMin`: UI 元素的左下角相对于父级锚点的位置(范围 0-1)。 * `anchorMax`: UI 元素的右上角相对于父级锚点的位置(范围 0-1)。 * **作用:** * **定位 (Positioning):** 决定了元素的初始位置点或参考点。 * **拉伸 (Stretching):** 当 `anchorMin` `anchorMax` 不重合时(即不是单个点,而是一个矩形区域),UI 元素会**拉伸**以填充该定义的区域(通常配合 `sizeDelta` 使用)。这是实现响应式 UI 布局的关键。 * **维持边距:** 当父级尺寸改变时,确定元素如何维持与父级特定边的距离。 2. **轴点 (Pivot):** `Vector2` (范围 0-1)。定义 UI 元素自身围绕哪个点进行旋转、缩放位置偏移(位置的坐标点是轴点在父级空间的位置)。例如,(0.5, 0.5) 是中心点,(0, 0) 是左下角。 * **作用:** 影响旋转中心、缩放中心、位置点定义(例如,你设置位置时,是以轴点的位置为准)。 3. **位置 (`anchoredPosition` & `localPosition`):** * `anchoredPosition`: `Vector2`。相对于锚点定义的参考点(通常是父对象上 `anchorMin` `anchorMax` 构成矩形的轴心点)的 *局部 2D* 位置。这是处理与锚点相关的位移时最常用的属性。 * `localPosition`: `Vector3`。继承自 `Transform`,代表相对于父对象 `Transform` 的位置(在 `RectTransform` 的 3D 空间中)。在纯 2D UI 操作中,通常优先使用 `anchoredPosition`。 4. **尺寸 (`sizeDelta`):** `Vector2`。理解它的核心在于 **相对锚点矩形的偏移量**。 * 如果锚点是**单个点**(如 `anchorMin` == `anchorMax`),`sizeDelta` 直接表示元素的宽度 (x) 高度 (y)。 * 如果锚点定义的是一个**矩形区域**(如 `anchorMin` = (0, 0), `anchorMax` = (1, 1) - 即铺满父对象),那么: * `sizeDelta.x = UI元素宽度 - 父对象宽度` * `sizeDelta.y = UI元素高度 - 父对象高度` * **简单理解:** `sizeDelta` 描述了 UI 元素的大小 *相对于* 其锚点定义的“自然大小”的增量(或减量)。当锚点是点(点定位)时,“自然大小”是0;当锚点区域是父级整个矩形(拉伸定位)时,“自然大小”就是父级尺寸。 5. **缩放 & 旋转:** 通常使用 `localScale` (继承自 `Transform`) `localEulerAngles`/`localRotation`。虽然可以在 UI 上使用,但需谨慎,因为它可能影响像素对齐布局。UI 元素通常很少旋转或非均匀缩放。 **常用 API** 1. **`void SetSizeWithCurrentAnthors(RectTransform.Axis axis, float size)`** * **作用:** 这是动态调整尺寸时**最常用、最直观**的方法!它将 UI 元素沿指定轴(`Axis.Horizontal` 或 `Axis.Vertical`)的大小设置为 `size`,**同时保持当前的锚点配置**。它会自动处理 `sizeDelta` 的计算,让开发者无需手动根据锚点状态计算。 * **何时用:** 任何需要在运行时根据锚点设置特定宽度或高度的场景(比如动画、动态内容加载后的适配、窗口调整)。优先使用这个,避免手动计算 `sizeDelta`! 2. **`Vector2 anchoredPosition`** - 如上所述,核心位置属性。赋值可移动元素:`myRectTransform.anchoredPosition = new Vector2(x, y);` 3. **`Vector2 sizeDelta`** - 如上所述,核心尺寸偏移属性。赋值前需理解锚点状态:`myRectTransform.sizeDelta = new Vector2(width, height);` (当锚点是点时才表示宽高)。 4. **`Rect rect`** * **作用:** 获取该 UI 元素在 *其父级坐标系下* 的包围矩形信息 (x, y 代表左下角相对于父级的坐标,width, height 代表尺寸)。对于获取**当前实际占用空间**非常有用。 * **注意:** 这个矩形**包含**了缩放旋转的影响!如果需要忽略旋转(只考虑轴对齐矩形),获取其尺寸更直接的方法是 `myRectTransform.rect.size` (Vector2)。 5. **`Rect GetWorldRect()` / `RectTransformUtility.CalculateRelativeRectTransformBounds(Canvas, myRectTransform)`** * **作用:** 获取 UI 元素在*世界空间(Wold Space)*或*相对于某个Canvas矩形空间*的包围区域。用于物理检测(如射线检测、碰撞区判断)或精确裁剪计算。 6. **锚点快捷设置:** Unity Inspector 面板上预设了 9 种常用的锚点模式(预设的 `anchorMin`/`anchorMax` 组合),如居中、左上、右上、左下、右下、左右拉伸居中、上下拉伸居中、水平拉伸、垂直拉伸、四边拉伸。这些快捷方式极大简化了基础响应式布局设置。 **使用要点 & 最佳实践** 1. **Anchor First:** 在设置任何位置或尺寸前,先想清楚元素的锚点如何设定。锚点决定了元素的定位方式响应式行为。UI 设计的第一步就是合理选择锚点预设。 2. **`SetSizeWithCurrentAnchors` 优先:** 在运行时改变尺寸时,优先考虑使用 `SetSizeWithCurrentAnchors` 而不是直接操作 `sizeDelta`。后者在锚点非点状态下计算复杂且易错。 3. **理解坐标系:** 区分 Canvas 的 Render Mode(Screen Space Overlay / Screen Space Camera / World Space)对坐标的影响。`anchoredPosition` 是局部坐标系(相对于父级锚点),`rect` 的位置是基于父级的局部坐标系。需要全局位置时考虑 `GetWorldRect`。 4. **维护像素对齐:** UI 元素通常期望保持清晰的像素边缘。过度使用非整数缩放或位置可能导致模糊。注意 `Canvas Scaler` 的缩放设置。 5. **层级与顺序:** `RectTransform` 的同级顺序(Sibling Index)决定了在 Canvas 中的渲染/事件顺序(后渲染的叠在上面)。可用 `SetAsFirstSibling()` / `SetAsLastSibling()` / `SetSiblingIndex(int index)` 调整。 **示例讲解(C#脚本)** ```csharp using UnityEngine; using UnityEngine.UI; // 访问 UI 组件 public class UIManager : MonoBehaviour { public RectTransform movingPanel; // 在Inspector中拖入一个Image或Panel public Button moveButton; public Button resizeButton; void Start() { // 示例1:使用SetSizeWithCurrentAnchors设置固定大小 // 设定movingPanel宽度为300像素(无论锚点如何设置) movingPanel.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 300f); // 示例2:按钮点击事件 - 移动元素到新位置 (基于当前锚点) moveButton.onClick.AddListener(() => { // 假设锚点设置在屏幕中心顶部 (0.5, 1) // 将轴点移动到相对于锚点下方100像素 (Y轴增加100) movingPanel.anchoredPosition = new Vector2(0f, -100f); }); // 示例3:按钮点击事件 - 改变尺寸 (使用SetSizeWithCurrentAnchors) resizeButton.onClick.AddListener(() => { // 将高度设置为150像素 movingPanel.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 150f); }); // 示例4:响应式锚点设置(代码模拟常用预设) // 水平拉伸居中(宽度随父级变化,高度固定50像素,纵向居中) void SetHorizontallyStretchedMiddle() { movingPanel.anchorMin = new Vector2(0f, 0.5f); // 父级左边界, 父级纵向中心 movingPanel.anchorMax = new Vector2(1f, 0.5f); // 父级右边界, 父级纵向中心 movingPanel.pivot = new Vector2(0.5f, 0.5f); // 自身中心点 movingPanel.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 50f); // 固定高度50 // 对于水平方向,锚点已定义从左到右拉伸,sizeDelta.x会被自动处理为0或其他值(无需额外设置) } // SetHorizontallyStretchedMiddle(); // 需要时调用 } // 示例5:获取当前有效尺寸(忽略旋转后) Vector2 GetEffectiveSize(RectTransform rt) { return rt.rect.size; // 返回自身的宽度高度(Vector2) } // 示例6:将屏幕坐标(如鼠标位置)转换到此UI元素局部坐标 public bool PointInLocalRect(Vector2 screenPoint, Camera eventCamera) { Vector2 localPoint; // RectTransformUtility是关键助手 RectTransformUtility.ScreenPointToLocalPointInRectangle( movingPanel, screenPoint, eventCamera, out localPoint); Rect rect = movingPanel.rect; // 获取自身局部坐标系下的矩形 return rect.Contains(localPoint); // 判断转换后的点是否在矩形内 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值