C#中Transform类的介绍

主要用于物体的旋转移动和缩放
一、成员变量
position:在世界空间坐标transform的位置。
localPosition:相对于父级的变换的位置。如果该变换没有父级,那么等同于Transform.position。
eulerAngles:世界坐标系中的旋转(欧拉角)。
localEulerAngles:相对于父级的变换旋转角度。
right:世界坐标系中的右方向。(世界空间坐标变换的红色轴。也就是x轴。)
up:世界坐标系中的上方向。(在世界空间坐标变换的绿色轴。也就是y轴。)
forward:世界坐标系中的前方向。(在世界空间坐标变换的蓝色轴。也就是z轴。)
rotation:世界坐标系中的旋转(四元数)。
localRotation:相对于父级的变换旋转角度。
localScale:相对于父级的缩放比例。
parent:父对象Transform组件。
worldToLocalMatrix:矩阵变换的点从世界坐标转为自身坐标(只读)。
localToWorldMatrix:矩阵变换的点从自身坐标转为世界坐标(只读)。
root:对象层级关系中的根对象的Transform组件。
childCount:子对象数量。
lossyScale:全局缩放比例(只读)。
二、成员函数:
1、LookAt函数
public void LookAt(Transform target)
public void LookAt(Vector3 worldPosition);
public void LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);
public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
旋转物体,使物体的z轴指向target/worldPosition,对于worldUp的描述是,在完成上面的旋转之后,继续旋转自身,使得当前对象的正y轴朝向与worldUp所指向的朝向一致。
这里的朝向一致指的是新旋转后的y轴与worldUp在该对象初次旋转后的xy平面上的投影向量一致。之所以取投影是因为第一次旋转使物体的z轴指向target/worldPosition后,此时的worldUp向量可能不在xy平面上,要在z轴指向target/worldPosition前提下是y轴朝向与worldUp一致,只能取worldUp在xy平面上的投影。
注意:使用worldPosition向量时要注意方向,一定是target-transform.position,顺序反了会使物体背向目标;若使用Transform作为参数,则不必注意。默认情况下,worldUp是Vector3.up(世界坐标系下的y轴)
2、Rotate函数

public void Rotate(Vector3 eulerAngles);
public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);
public void Rotate(float xAngle, float yAngle, float zAngle);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
旋转一个欧拉角度,它按照zxy的顺序进行旋转,默认情况下局部坐标系下Space.Self

public void Rotate(Vector3 axis, float angle);
public void Rotate(Vector3 axis, float angle,Space relativeTo = Space.Self);
绕axis轴旋转angle角度,默认情况下局部坐标系下Space.Self。
transform.rotation和Rotate有个区别:
Rotate()方法是:旋转多少度。在原有的基础上累加,即旋转了多少角度。又旋转了多少角度,是在原有的基础上在旋转
rotation属性是:旋转到某个角度,就是是在update中每帧都执行。但每次旋转到的角度都是5,所以是旋转到5度。一直都是
比如你只想让他旋转到多少, 用rotation; 假如想让他一直转,可以用Rotate
rotation直接改变了数值, 以达到旋转效果
Rotate应用一个的旋转角度每秒1度慢慢的旋转物体
当然:rotation()还可以通过插值旋转
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要给用户介绍一下C#中的RectTransform。首先,我得回忆一下自己对这个概念的理解,确保没有记错。RectTransform是Unity中UI组件的基础,用于控制UI元素的位置、大小和旋转等。不过,用户可能对具体的属性和用法不太清楚,我需要详细说明。 首先,应该解释RectTransform和普通Transform的区别。Transform用于3D对象,而RectTransform是专门为UI设计的,继承自Transform,但增加了适应不同屏幕分辨率的特性。比如锚点和轴点这些概念,可能用户不太明白,需要举例说明。 接下来,需要列举RectTransform的主要属性。比如anchoredPosition、sizeDelta、anchorMin和anchorMax,还有pivot。每个属性都要简单解释,并且给出应用场景。比如anchoredPosition是相对于锚点的位置,而sizeDelta则与拉伸有关。 然后,应用场景部分,应该涵盖常见的使用情况,比如动态调整UI位置、响应屏幕尺寸变化、制作自适应UI布局以及动画控制。每个场景可能需要不同的属性设置,比如动态调整位置用anchoredPosition,响应屏幕变化则涉及锚点的设置。 在代码示例部分,需要展示如何获取RectTransform组件,并修改其属性。例如,设置位置、调整大小、更改锚点和轴点。代码要简洁,注释清楚,让用户容易理解。比如anchoredPosition的赋值,或者sizeDelta的调整。 最后,常见问题可能包括锚点设置不正确导致UI错位,轴点影响旋转和缩放的中心,还有屏幕自适应需要注意锚点和父物体的关系。这些问题需要简明扼要地提醒用户,避免他们踩坑。 检查过程中,要确保提到的每个概念都准确,比如anchoredPosition是否真的是相对于父物体的锚点位置,sizeDelta在不同锚点模式下的表现是否正确。如果有不确定的地方,可能需要查阅Unity文档确认,比如当锚点设置为同一个点时,sizeDelta代表尺寸,而分开时则可能代表偏移量。 另外,要确保使用中文,避免专业术语翻译错误,比如“轴点”对应的是pivot,“锚点”是anchor。同时,按照用户的要求,行内数学表达式用$...$,但在这个问题中可能用不到数学公式,所以主要注意LaTeX格式的正确性。不过用户的问题是关于C#的,可能不太涉及数学表达式,但如果有变量名之的,可以用行内格式,比如$RectTransform$。 最后,确保回答结构清晰,分点说明,步骤明确,帮助用户逐步理解RectTransform的各个方面。避免信息过载,每个部分保持简洁,重点突出。</think>在Unity引擎中,`RectTransform` 是UI系统的核心组件之一。它继承自`Transform`,但专为UI元素设计,支持复杂的布局控制和屏幕自适应功能。以下从5个维度逐步解析: $$ \text{RectTransform} \subset \text{Transform} $$ ### 一、基础特性 1. **坐标系差异** - 普通`Transform`使用3D世界坐标系 - `RectTransform`使用基于锚点的2D矩形坐标系 ```csharp // 获取组件示例 RectTransform rt = GetComponent<RectTransform>(); ``` 2. **核心属性** | 属性 | 说明 | 数学表达 | |---|---|----| | `anchoredPosition` | 相对于锚点的位置 | $P_{anchor} = (x,y)$ | | `sizeDelta` | 矩形尺寸/偏移量 | $\Delta = (width, height)$ | | `anchorMin/Max` | 锚点范围 | $[0,0] \rightarrow [1,1]$ | | `pivot` | 轴心点位置 | $P_{pivot} \in [0,1]^2$ | ### 二、锚点系统 通过4个归一化坐标定义父容器中的相对位置关系: ```csharp // 设置上下左右锚点 rt.anchorMin = new Vector2(0, 0.5f); // 左下 rt.anchorMax = new Vector2(1, 0.5f); // 右上 ``` 此时元素宽度会自动拉伸填满父容器 ### 三、动态控制实践 1. **定位控制** ```csharp // 设置相对于锚点的位置 rt.anchoredPosition = new Vector2(100, -50); // 世界坐标转换 RectTransformUtility.ScreenPointToLocalPointInRectangle( parentRT, Input.mousePosition, camera, out Vector2 localPos); ``` 2. **尺寸控制** ```csharp // 直接设置尺寸 rt.sizeDelta = new Vector2(200, 100); // 根据内容自适应 LayoutRebuilder.ForceRebuildLayoutImmediate(rt); ``` ### 四、坐标系转换 $$ \begin{cases} \text{屏幕坐标} \rightarrow \text{本地坐标} \\ \text{世界坐标} \rightarrow \text{矩形空间坐标} \end{cases} $$ 常用转换方法: ```csharp RectTransformUtility.FlipLayoutOnAxis(rt, 0, true); // 水平翻转 RectTransformUtility.PixelAdjustPoint(point, rt, canvas); // 像素对齐 ``` ### 五、典型问题解决方案 1. **元素错位** - 检查锚点模式是否匹配布局需求 - 确认父物体是否带有`ContentSizeFitter`等布局组件 2. **旋转异常** ```csharp // 修改轴心点位置 rt.pivot = new Vector2(0.5f, 0.5f); // 中心旋转 ``` 3. **多分辨率适配** 推荐使用`CanvasScaler`组件配合锚点系统,避免直接设置绝对值坐标。 建议通过Unity Editor的可视化工具理解锚点行为,结合代码实现动态UI效果。关键要掌握锚点、轴点、尺寸三者之间的相互作用关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值