unity值属性修改步骤

一、核心目的

这四行代码的核心是:修改连线 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****。
  • 关键原理
    • sizeDeltaRectTransform值类型属性 (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. 第 1 行:size = (100, 5);
  2. 第 2 行:size 变成 (150, 5);
  3. 第 3 行:size 还是 (150, 5)(因为lineWidth本来就是 5);
  4. 第 4 行:连线 UI 的sizeDelta被设为 (150, 5),连线长度从 100 变成 150,宽度保持 5。

如果lineWidth改成 8,则第 3 行后size变成 (150, 8),最终连线宽度会变成 8。

四、易错点补充

  1. 为什么不能直接修改 ****sizeDelta.x**
    比如写 talentView.root.sizeDelta.x = distance; 是无效的,因为sizeDelta是值类型,访问talentView.root.sizeDelta时会返回一个
    临时副本**,修改副本的 x 值不会影响原组件的属性。
  2. 锚点对 ****sizeDelta**的影响
    只有当连线 UI 的RectTransform锚点设为
    中心点 **(Anchor Min/Max = (0.5, 0.5))时,sizeDelta才直接等于 UI 的实际宽高。如果锚点不是中心点,sizeDelta代表的是 "UI 尺寸相对于锚点范围的偏移",此时需要先计算锚点范围再调整尺寸(你当前的代码默认锚点是中心点,符合 2D 连线的常规设置)。

总结

  1. 这四行代码是 Unity 修改RectTransform尺寸的标准流程:先读取尺寸到临时变量→修改临时变量→赋值回原属性;
  2. X 轴设为distance是让连线长度匹配节点间距,Y 轴设为lineWidth是固定连线粗细;
  3. 核心原则:值类型属性(如 Vector2/Vector3)不能直接修改子属性,必须通过临时变量中转。
相关推荐
小贺儿开发3 小时前
Unity3D 四星探秘:手势互动演示
科技·unity·人机交互·科普·硬件·leap motion·互动
风酥糖4 小时前
Godot游戏练习01-第11节-显示优化,游戏背景,Shader
游戏·游戏引擎·godot
码界奇点6 小时前
基于模块化架构的Unity游戏开发框架设计与实现
java·c++·unity·架构·毕业设计·源代码管理
风酥糖8 小时前
Godot游戏练习01-第13节-粒子系统,武器攻击特效
游戏·游戏引擎·godot
张老师带你学10 小时前
unity船资源,快艇,帆船,游轮
科技·游戏·unity·游戏引擎·模型
C蔡博士11 小时前
Unity游戏物体渲染顺序
unity·游戏引擎·游戏开发
瑞瑞小安13 小时前
Unity功能篇:PCVR开发(设备:HTC Vive Pro)更新中。。。
unity·游戏引擎
风酥糖1 天前
Godot游戏练习01-第10节-组件化,玩家受伤,YSort,和一点思考
游戏·游戏引擎·godot