ue5c++工程中,修改变量名以后蓝图无法运行,需要重新放节点
系列文章目录文章目录系列文章目录前言一、问题原因是什么二、解决步骤前言先看一下运行效果// Fill out your copyright notice in the Description page of Project Settings.#pragmaonce#includeCoreMinimal.h#includeAnimInstances/WarriorBaseAnimInstance.h#includeWarriorCharacterAnimInstance.generated.hclassAWarriorCharacterBase;classUCharacterMovementComponent;UCLASS()classGODOFWAR_DEMO_APIUWarriorCharacterAnimInstance:publicUWarriorBaseAnimInstance{GENERATED_BODY()public:UWarriorCharacterAnimInstance();public://重写动画初始化函数在动画初始化时调用virtualvoidNativeInitializeAnimation()override;//重写动画更新函数在动画更新时调用virtualvoidNativeThreadSafeUpdateAnimation(floatDeltaSeconds)override;protected://指向拥有此动画实例的角色对象UPROPERTY()//UPROPERTY(EditAnywhere, BlueprintReadWrite, Category AnimData | LocomotionData)AWarriorCharacterBase*OwningCharacter;//指向角色的移动组件对象UPROPERTY()UCharacterMovementComponent*OwningMovementComponent;//角色的移动速度UPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly,CategoryAnimData|LocomotionData)floatGroundSpeed;//角色是否正在加速(是否有移动输入) 注意这里默认值是falseCategory AnimData|LocomotionData必须和子类分组一致否则会报错UPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly,CategoryAnimData|LocomotionData)boolbHasAcceleration;//bHasAcceleration、bHasIsAccelerating//角色运动方向相对于自身朝向的偏转角度角色移动方向:0度角色正前方Y轴90度角色朝右X轴正方向-90度角色朝左X轴负方向UPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly,CategoryAnimData|LocomotionData)floatLocomotionDirection;};在上面代码中我把boolbHasIsAccelerating;修改成boolbHasAcceleration;代码编译通过但是蓝图中用到变量bHasAcceleration的地方都有警告产生蓝图里面相关的部分都运行异常。Could not find a variable named “bHasIsAccelerating” in ‘/Game/PlayerCharacter/AnimBP/ABP_Hero.ABP_Hero_C’.Make sure ‘/Game/PlayerCharacter/AnimBP/ABP_Hero.ABP_Hero_C’ has been compiled for Get bHasIsAcceleratingCould not find a variable named “bHasIsAccelerating” in ‘/Game/PlayerCharacter/AnimBP/ABP_Hero.ABP_Hero_C’.Make sure ‘/Game/PlayerCharacter/AnimBP/ABP_Hero.ABP_Hero_C’ has been compiled for Get bHasIsAcceleratingInvalid field ‘bHasIsAccelerating’ found in property path for ResultInvalid field ‘bHasIsAccelerating’ found in property path for Result[0601.24] Compile of ABP_Hero successful, but with 4 Warning(s) [in 47 ms] (/Game/PlayerCharacter/AnimBP/ABP_Hero.ABP_Hero)一、问题原因是什么//角色是否正在加速(是否有移动输入) 注意这里默认值是falseCategory AnimData|LocomotionData必须和子类分组一致否则会报错UPROPERTY(VisibleDefaultsOnly,BlueprintReadOnly,CategoryAnimData|LocomotionData)由于 bool bHasAcceleration;把 UPROPERTY 变量重命名了Anim Blueprint 里原来绑定到 bHasIsAccelerating 的反射属性引用失效了。所以结果就是C 里新变量 bHasAcceleration 在更新但动画蓝图 ABP_Hero、状态机过渡规则、BlendSpace 条件很多地方可能还在引用旧属性 bHasIsAccelerating旧引用失效后动画条件拿不到正确值角色移动逻辑正常但动画状态没正确切换看起来就变成“滑步”为什么原来能正常改名后就不正常因为在 UE 里UPROPERTY 不只是普通 C 成员它还会被UHT 反射系统记录蓝图资产序列化保存动画蓝图状态机节点按“属性名”引用对 C 来说只是改名。但对已经保存过的 AnimBlueprint 资产来说这相当于旧属性没了新属性是另一个全新的反射属性所以动画蓝图里的旧绑定不会自动百分百无缝迁移。为什么角色还能移动但动画不对因为 WASD 移动走的是CharacterMovementComponent角色移动输入速度更新而动画切换走的是AnimInstance动画蓝图状态机过渡规则里读取的变量也就是说角色确实在跑但动画蓝图没正确拿到“正在加速”的布尔值所以没切到跑步/移动状态就成了滑步最常见的修复办法打开你的动画蓝图 ABP_Hero检查这些地方是否还在用旧变量状态机 Transition RuleIdle/Run 切换条件Locomotion GraphEvent Graph 里读这个变量的节点如果看到旧变量 bHasIsAccelerating删掉重新拖一个新的 bHasAcceleration 进去。重新编译动画蓝图打开 ABP_Hero 后CompileSave很多时候仅仅 C 编译成功还不够动画蓝图资产本身也要重新编译。不要只靠 Live Coding如果你是边开编辑器边改 C 变量名尤其是 UPROPERTY 改名UE 很容易残留旧反射信息。更稳的做法是关闭 UE 编辑器在 VS 里完整编译重新打开工程打开 ABP_Hero再手动 Compile Save4. 必要时删除旧节点重新连如果动画蓝图里原来有基于这个变量的节点即使表面显示没报错也建议删除旧的变量读取节点重新从 My Blueprint 或右键搜索里放置新的 bHasAcceleration重新连接过渡条件更底层一点的原因UE 蓝图资产对 UPROPERTY 的引用本质上依赖反射名。你重命名后bHasIsAccelerating - bHasAcceleration这不是“同一个属性换个显示名”而是“旧属性消失新属性出现”。如果想让 UE 在资产层面自动识别“这是重命名”通常要用 Core Redirect。例如在配置里加属性重定向。否则蓝图资产常常需要手动刷新。你现在最该做的事按这个顺序来关闭 UE完整编译 C重新打开工程打开 ABP_Hero检查所有动画状态机和过渡规则是否还引用旧变量 bHasIsAccelerating全部改成新变量 bHasAccelerationCompileSave一句话结论改名后出现滑步不是 bHasAcceleration 这个变量名不能用而是 动画蓝图里原先绑定的 UPROPERTY 反射引用还是旧名字导致动画状态切换条件失效了。二、解决步骤可以检查 ABP_Hero 里有没有残留旧变量最实用就按下面做。打开动画蓝图打开你的 ABP_Hero。先看 My Blueprint 面板在左侧 My Blueprint 里看当前变量列表确认现在显示的是不是bHasAcceleration如果这里还是旧名字先重新编译 Anim BP。用“查找引用”找旧变量在 My Blueprint 面板里找到旧变量 bHasIsAccelerating如果还能看到右键它选择类似Find References或“查找引用”如果旧变量已经不在列表里也可以直接在蓝图里全局搜索按Ctrl F搜索bHasIsAccelerating重点看这些位置AnimGraphEvent GraphState MachineTransition Rule4. 重点检查状态机过渡规则最容易出问题的是状态切换条件比如Idle - Walk/RunWalk/Run - IdleStart - LocomotionRelax - Move点开每一条 Transition Rule看里面是不是还在读旧变量bHasIsAccelerating如果是就删掉旧节点重新拖入bHasAcceleration5. 不要只改显示文字要重新放节点这是重点。很多时候你看到蓝图节点表面像是“连着的”但底层引用其实已经失效。所以最稳的做法不是只改名字而是删除旧变量读取节点从左侧变量列表里把新的 bHasAcceleration 拖进去重新接线这样最干净。检查 BlendSpace 或状态条件如果你的移动动画逻辑里有类似GroundSpeed 某个值bHasAcceleration true要确认这些节点里用的是新变量不是旧变量残留引用。编译并保存检查完后一定要点击 Compile再点 Save如果编译栏里有黄色警告也要点开看一下。如果还是不对强制刷新 Anim BP可以这样做关闭 UEVS 完整编译重新打开 UE打开 ABP_HeroCompileSave有时 UPROPERTY 改名后编辑器热重载不会完全刷新动画蓝图引用这一步很有用。最值得优先检查的地方你这个“能移动但滑步”的情况优先看Idle/Run 的过渡规则Locomotion 状态机里的移动判断是否还有旧变量 bHasIsAccelerating因为大概率就是这里没切过去。一句话操作版在 ABP_Hero 里按Ctrl F搜索bHasIsAccelerating找到后把所有旧节点删掉重新换成bHasAcceleration然后 Compile Save。把bHasIsAccelerating节点删除换成bHasAcceleration节点然后重新编译