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****。
  • 关键原理:
    • 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. 第 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)不能直接修改子属性,必须通过临时变量中转。
相关推荐
阿松爱学习15 小时前
【Unity开发】监听Scene场景事件
unity·c#
xiaogai_gai1 天前
BOM 物料清单同步实战:金蝶云星空 → 四化智造 MES 修改场景深度拆解
unity·游戏引擎
淡海水1 天前
03-03-架构篇-SGen GC架构解析
unity·架构·c#·gc·sgen
/**书香门第*/1 天前
Cocos Creator 打螺丝游戏的实现
游戏引擎·cocos2d·螺丝·打螺丝
萌萌的提莫队长2 天前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
mxwin3 天前
Unity Shader 光线追踪原理与实战案例
unity·游戏引擎
地狱为王3 天前
Unity使用DPDFNet实现实时语音增强(降噪)
unity·语音增强·降噪·dpdfnet
平行云PVT3 天前
国产信创实时云渲染解决方案:如何实现数字孪生与三维应用云化部署?
unity·webrtc·unreal engine·实时云渲染·国产信创·摩尔线程·砺算科技
夏炎黄3 天前
Terrain地形剪裁
unity
小贺儿开发3 天前
DeepSeek + Codex + MCP:Unity 游戏开发实测
科技·游戏·unity·ai·程序员·编程·deepseek