【问题标题】:I can't modify variables I declared in C++ with UPROPERTY(EditAnywhere) using Blueprint (UE4)我无法使用蓝图 (UE4) 使用 UPROPERTY(EditAnywhere) 修改在 C++ 中声明的变量
【发布时间】:2020-12-29 08:01:20
【问题描述】:

我是 UE4 的新手,但我对 C++ 有一些基本了解,并且我一直在开发一款 FPS 射击游戏,这对我来说有点挑战。我在这里,有一个问题仍然没有解决。

这是我的代码的一部分:

FPSCharacter.h:

#pragma once

...
#include "Weapon.h"
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "FPSCharacter.generated.h"

UCLASS()
class GAME_API AFPSCharacter : public ACharacter
{
    GENERATED_BODY()

public:
...
    
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon")
    UWeapon* Primary;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon")
    UWeapon* Secondary;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon")
    UWeapon* Tertiary;

...
};

Weapon.h(我认为在这种情况下这无关紧要,但仍然如此):

#pragma once

#include "CoreMinimal.h"
#include "Item.h"
#include "Weapon.generated.h"

UCLASS()
class GAME_API UWeapon : public UItem
{
    GENERATED_BODY()

public:

    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Item")
    float MagSize = 30.f;

    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Item")
    float FireRate;

    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Item")
    float BulletRange = 100000000.f;

    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Item")
    float BaseDamage = 35.f;

    UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Item")
    float DamageDropRate = 0.8f;

protected:

    virtual void Use(class AFPSCharacter* Character) override;
    
};

然后我有一些基于 UWeapon 类创建的蓝图类等待分配给FPSCharacter.h 上的这三个变量,它们是UWeapon* PrimaryUWeapon* SecondaryUWeapon* Tertiary

如我所愿,我进入了 FPSCharacter 的 Blueprint 类,并将这三个变量分配给我为它们创建的 Blueprint 类。

修改这些值: https://imgur.com/a/5TVe2t6

点击编译按钮: https://imgur.com/a/fuauwKn

单击编译按钮后,所有这些变量都恢复为默认值。 (值为无)

这有什么问题?我做错什么了吗?请帮我解决这个问题。在此先感谢 ;)

【问题讨论】:

    标签: c++ unreal-engine4 unreal-blueprint


    【解决方案1】:

    您应该在武器变量的 UPROPERTY 说明符中添加 Instanced 关键字。这样,将创建一个对象实例并将其分配给一个属性,从而正确保存

    您可能还需要将 EditInlineNew 作为 UCLASS 说明符添加到您的武器类中。

    FPSCharacter.h

    UCLASS()
    class GAME_API AFPSCharacter : public ACharacter
    {
         // Other code...
    
         UPROPERTY(Instanced, EditAnywhere, BlueprintReadWrite, Category = "Weapon")
         UWeapon* Tertiary;
    }
    

    武器.h

    UCLASS(EditInlineNew)
    class GAME_API UWeapon : public UItem
    {
        // Weapon stuff
    }
    

    【讨论】:

    • 成功了!您愿意解释一下EditInlineNew 的工作原理吗?
    • @HaiQin 您可以在此处找到更多相关信息:docs.unrealengine.com/en-US/ProgrammingAndScripting/… 表示可以从虚幻编辑器属性窗口创建此类的对象,而不是从现有资源中引用。默认行为是只能通过“属性”窗口分配对现有对象的引用)。此说明符传播到所有子类;子类可以使用 NotEditInlineNew 说明符覆盖它。
    猜你喜欢
    • 2021-10-29
    • 2015-06-11
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多