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)不能直接修改子属性,必须通过临时变量中转。
相关推荐
Avalon7125 小时前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎
风酥糖6 小时前
Godot游戏练习01-第33节-新增会爆炸的敌人
游戏·游戏引擎·godot
ellis19706 小时前
Unity UI性能优化一之插件【Unity UI Optimization Tool】
unity·性能优化
Zik----9 小时前
Unity基础学习笔记(B站视频课整理)
unity·vr
郑寿昌19 小时前
UE5与UE6在Lumen和Nanite的差异解析
游戏引擎·图形渲染·着色器
郝学胜-神的一滴1 天前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
郑寿昌1 天前
UE6 AI加速Lumen光线追踪降噪技术解析
人工智能·游戏引擎
晴夏。1 天前
GAS下的网络同步的全面分析【超级全面】
游戏引擎·ue·gas·网络同步
田鸡_1 天前
Unity新输入系统(Input System)教学篇
unity·游戏引擎·游戏程序
EQ-雪梨蛋花汤1 天前
【Unity笔记】Unity 音游模板与免费资源:高效构建节奏游戏开发全指南
笔记·unity·游戏引擎