Download

How to create a globally-available enum?

Hey,

I want to create a enum that contains the different types of weapons I will have (handgun, rifle, melee, etc). But if I define this enum in the c++ weapon class, my pawn’s animation blueprint can’t access it. (I need my animblueprint to access it, because I need to have the pawn doing a different animation depending on the current weapon type.)

So where can I define an enumeration so that everything, anywhere, can see it? I’m using C++, so I can’t declare one in the content browser. I also tried declaring it in MyProject.h, but that gave me errors. (?)

Thanks in advance :slight_smile:

Hi Greg,

If you mark your enum declaration with UENUM(BlueprintType), then the enum should be usable in any Blueprints, including Anim Blueprints.

Cheers,
Michael Noland

Copy and Paste the code that you put in the MyProject.h, and the errors you got.
Are you using UENUMTYPE()?
Here’s a tutorial (scroll down to the C++ code): What is proper way to make Enum for BP and C++ both - UE4 AnswerHub

@Micheal Noland, yep, it shows up in blueprints now! Thanks :slight_smile:

@jwatte, here’s my GB.h code (GB is the name of my project):

[HR][/HR]
#ifndef GB_H
#define GB_H

#include “Engine.h”

#define COLLISION_PROJECTILE ECC_GameTraceChannel1

#endif

#include “GB.generated.h”

UENUM(BlueprintType)
enum EItemAnimType
{ None UMETA(DisplayName = “None”),
Rifle UMETA(DisplayName = “Rifle”),
Handgun UMETA(DisplayName = “Handgun”),
Melee UMETA(DisplayName = “Melee”)
};
[HR][/HR]
And I get this huge wall of errors:

c:\users\greg\documents\unreal projects\gb\intermediate\build\win64\inc\gb…/…/…/…/…/Source/GB/GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\intermediate\build\win64\inc\gb…/…/…/…/…/Source/GB/GB.h(26) : see declaration of ‘EItemAnimType’
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinitionc:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1>
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’ c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1>
1> GBUIWidget.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1> GBPants.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1> GBShirt.cpp
1> GBClothing.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1> GBBackpack.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1> GBWeapon.cpp
1> GBInventoryManager.cpp
1> GBInventoryItem.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinitionc:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1>
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’ c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1>
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1> GBProjectile.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’
1> GB.cpp
1>c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26): error C2011: ‘EItemAnimType’ : ‘enum’ type redefinition
1> c:\users\greg\documents\unreal projects\gb\source\gb\GB.h(26) : see declaration of ‘EItemAnimType’

Actually, it’s the same error over and over again. But how do I fix it? :frowning:

They are beeing redefined so if you dont have the same code in two places.
Then your header is beeing included “twice”.

I think your issue may be the inclusion guards.
I think i read somewhere that you need to use the visual studio one.


#pragma once

And it also probeboly be a good idea to create a namespace for them.

Thanks! Fixed it! I noticed that #pragma once is included in most of the source files by default, but not GB.h. Wonder why.

One more thing: is it bad to #include “GB.h” in both the .h and .cpp files for other classes? By default it’s only included in the .cpp, but I want to declare some of my custom enums in the .h.

Heya,

Just like to pop in here o share the way I handle enums and structs. This is mostly based off of a tutorial from the wiki by Rama, so credits to him. Here’s my code:


#pragma once
#include "Archrune.h"
#include "Constants.generated.h"

UCLASS()
class UConstants : public UBlueprintFunctionLibrary
{
	GENERATED_UCLASS_BODY()
};


#pragma region ENUMS

UENUM(BlueprintType)
namespace ELevelState
{
	enum Type
	{
		Locked,
		Open,
		Complete
	};
}


UENUM(BlueprintType)
namespace EPlayerCameraAxisState
{
	enum Type
	{
		Free,
		AttachedRelative,
		AttachedWorld
	};
}

#pragma endregion ENUMS



#pragma region STRUCTS

USTRUCT(BlueprintType)
struct FLevelStruct : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()


	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Level Properties")
	uint8 Level_Index;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Level Properties")
	FText Level_Name;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Level Properties")
	TEnumAsByte<ELevelState::Type> Level_State;
};

#pragma endregion STRUCTS

This allows me to have enums and structs in a single organized file, but also have a bunch of INLINE functions in the header allowing for a sort of GameUtility script. It’s really handy for keeping stuff organized.

@DamirH: This is very usefull thanks for the share it gave me some ideas as well :slight_smile:

#pragma once is poor form.

You actually had almost the right solution already in the original file, except you had the “#endif” for the GB_H in the wrong place – it should be at the end.


#ifndef __GB_H__
#define __GB_H__

#include "Engine.h"

#define COLLISION_PROJECTILE ECC_GameTraceChannel1

// #endif  // this was wrong

#include "GB.generated.h"


UENUM(BlueprintType)
enum EItemAnimType
{
None UMETA(DisplayName = "None"),
Rifle UMETA(DisplayName = "Rifle"),
Handgun UMETA(DisplayName = "Handgun"),
Melee UMETA(DisplayName = "Melee")
};

#endif  // this is what it should have been


Not really… It’s supported by pretty much every noteworthy compiler out there today.

@jwatte, that actually didn’t work for me for some reason, I needed the pragma once for it to work. No matter, “pragma once” compiles, that’s good enough for me :slight_smile:

(Sorry for late reply, internet’s been down.)

The resson for this is that (and am 99.99% sure about this).
That some where in the documentation it says NOT to use inclusion guards like #ifndef FILE_H
But use the #pragma once i reserve the right to be wrong here but am prety sure about it.

Am sure a UE 4 Dev drops by soon enofe and confirm this or not :wink: