一、核心目的
这四行代码的核心是:修改连线 UI 的尺寸 ------ 让连线的长度等于两个天赋节点的直线距离,宽度固定为预设值,同时保证修改方式符合 Unity RectTransform 的使用规范。
二、逐行拆解 & 原理说明
先明确前提:talentView.root 是连线 UI 的 RectTransform 组件(2D UI 的尺寸核心组件),sizeDelta 是该组件控制 "UI 宽高" 的核心属性。
第 1 行:Vector2 size = talentView.root.sizeDelta;
csharp
运行
Vector2 size = talentView.root.sizeDelta;
- 操作本质 :读取当前连线 UI 的尺寸,并赋值给临时变量 **
**size****。 - 关键原理:
-
sizeDelta是RectTransform的值类型属性 (Vector2 是值类型),不是引用类型。这意味着你不能直接写talentView.root.sizeDelta.x = distance;(这种写法在 Unity 中无效,编译器不会报错,但运行时尺寸不会变化)。- 必须先把
sizeDelta的值 "取出来" 放到临时变量里,修改临时变量后,再 "塞回去"------ 这是 Unity 修改值类型属性的标准写法。
- 通俗类比:就像你想修改水杯里的水,不能直接改水杯里的水,得先把水倒到碗里(临时变量),调整水量后,再倒回水杯。
第 2 行:size.x = distance;
csharp
运行
size.x = distance;
- 操作本质 :将临时尺寸变量的 X 轴(宽度)设为两个节点的直线距离。
- 关键原理:
-
distance是之前计算的toPos - fromPos的向量模长(两个节点的直线距离),比如节点 A 在 (0,0)、节点 B 在 (100,100),distance≈141.42,这行代码就把连线的 X 轴长度设为 141.42。- 为什么改 X 轴?因为你之前已经通过
localEulerAngles把连线旋转到了两个节点的方向,X 轴是连线的 "延伸方向"(长度方向),Y 轴是 "粗细方向"。
第 3 行:size.y = lineWidth;
csharp
运行
size.y = lineWidth;
- 操作本质 :将临时尺寸变量的 Y 轴(高度)设为预设的连线宽度。
- 关键原理:
-
lineWidth是你提前定义的固定值(比如 5、8),代表连线的粗细。不管两个节点距离多远,连线的粗细都保持一致,只调整长度。- 举例:如果
lineWidth=5,不管distance是 100 还是 200,连线的 Y 轴尺寸永远是 5,保证视觉上所有连线粗细统一。
第 4 行:talentView.root.sizeDelta = size;
csharp
运行
talentView.root.sizeDelta = size;
- 操作本质 :将修改后的临时尺寸变量,赋值回连线 UI 的 **
**sizeDelta****,完成最终的尺寸修改。 - 关键原理:
-
- 这是整个尺寸修改的 "收尾步骤"------ 前面只改了临时变量
size,只有这一步才会真正改变 UI 的显示尺寸。 - 相当于把调整好水量的碗里的水,倒回原本的水杯里,水杯的水量才会真正变化。
- 这是整个尺寸修改的 "收尾步骤"------ 前面只改了临时变量
三、完整逻辑 & 实际效果举例
假设初始状态:
- 连线 UI 的
sizeDelta是 (100, 5)(默认长度 100,宽度 5); - 两个节点的
distance=150,lineWidth=5;
执行这四行代码后:
- 第 1 行:
size= (100, 5); - 第 2 行:
size变成 (150, 5); - 第 3 行:
size还是 (150, 5)(因为lineWidth本来就是 5); - 第 4 行:连线 UI 的
sizeDelta被设为 (150, 5),连线长度从 100 变成 150,宽度保持 5。
如果lineWidth改成 8,则第 3 行后size变成 (150, 8),最终连线宽度会变成 8。
四、易错点补充
- 为什么不能直接修改 **
**sizeDelta.x**?
比如写talentView.root.sizeDelta.x = distance;是无效的,因为sizeDelta是值类型,访问talentView.root.sizeDelta时会返回一个 临时副本**,修改副本的 x 值不会影响原组件的属性。 - 锚点对 **
**sizeDelta**的影响 :
只有当连线 UI 的RectTransform锚点设为 中心点 **(Anchor Min/Max = (0.5, 0.5))时,sizeDelta才直接等于 UI 的实际宽高。如果锚点不是中心点,sizeDelta代表的是 "UI 尺寸相对于锚点范围的偏移",此时需要先计算锚点范围再调整尺寸(你当前的代码默认锚点是中心点,符合 2D 连线的常规设置)。
总结
- 这四行代码是 Unity 修改
RectTransform尺寸的标准流程:先读取尺寸到临时变量→修改临时变量→赋值回原属性; - X 轴设为
distance是让连线长度匹配节点间距,Y 轴设为lineWidth是固定连线粗细; - 核心原则:值类型属性(如 Vector2/Vector3)不能直接修改子属性,必须通过临时变量中转。