Hi
I want to make a custom event in C++. I already watched the new Tutorial Series.
They use “UFUNCTION(BlueprintNativeEvent)”
So i did that:
UFUNCTION(BlueprintNativeEvent, Category = "DmgSystem")
void TakeDmg(int32 Damage);
Now my problem:
Error 2 error LNK2005: “protected: void __cdecl AUltimateTutorialsCharacter::TakeDmg(int)” (?TakeDmg@AUltimateTutorialsCharacter@@IEAAXH@Z) already defined in UltimateTutorialsCharacter.cpp.obj E:\GitHub\UE4—UltimateTutorialMap\UltimateTutorials\Intermediate\ProjectFiles\UltimateTutorials.generated.cpp.obj UltimateTutorials
As you read the error function code already is decelered in UHT generated code. Accoring to this:
https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Functions/Specifiers/BlueprintNativeEvent/index.html
If you want to create override for event in C++ you need to create funcfion called TakeDmg_Implementation(int32 dmg) in cpp
If you want to create event only used in blueprint and triggered from C++ uss BlueprintImplementableEvent insted
2 Likes
Thank you very much!
I guess I should check the Wiki first next time
It’s just confusing because on the official tutorial they don’t do “_Implementation”
Nope doesn’t work.
UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "DmgSystem")
void TakeDmg_Implementation(int32 Damage);
I can Override the Event in BP. But when I try to call the function outside of my Character (after casting to my char) it tells me I can only call the function inside my character.
So I thought, let’s not override it in BP, let’s do it in C++.
So I tried to define it in my Source File. Error: Already Defined in UltimateTutorialsCharacter.cpp.obj
So I tried to define in my Header File. Error: function ‘void AUltimateTutorialsCharacter::TakeDmg_Implementation(int32)’ already has a body path\UltimateTutorials.generated.cpp
1 Like
remove _Implementation if you use BlueprintImplementableEvent, i think you don’t need to do that even BlueprintNativeEvent as _Implementation is generated in UHT generated header file
So do this if you want to use event in C++:
UFUNCTION(BlueprintNaiveEvent, BlueprintCallable, Category = "DmgSystem")
void TakeDmg(int32 Damage);
and then _Implementation in Cpp file or if you gonna use event only in Blueprint:
UFUNCTION(BlueprintImplementableEvent, BlueprintCallable, Category = "DmgSystem")
void TakeDmg(int32 Damage);
And then do nothing in Cpp, just do calls to that function if you want to trigger the event
2 Likes
I WANT TO DO:
Go in my char, override the event
Go to the level blueprint and let a trigger call the event
I CANNOT DO THAT BECAUSE I CANNOT ACCESS THE OVERWRITTEN FUNCTION OUTSIDE OF THE CHARACTER!
SO I TRY TO CODE THE FUNCTIONALITY IN C++!
ok, I understand NativeEvent this way:
Write functionality in C++ ; if needed, override functionality in BP
I CANNOT WRITE ANYTHING IN C++ BECAUSE IT SAYS IT IS ALREADY DEFINED!
Ok heres how it is done with begin play in engine source code
UFUNCTION(BlueprintImplementableEvent, meta=(FriendlyName = "BeginPlay"))
virtual void ReceiveBeginPlay();
virtual void BeginPlay();
And in cpp:
void AActor::BeginPlay()
{
ReceiveBeginPlay();
}
Did it just like this (changed to my function names ofc)
Error: Unresolved External Symbol
Well, not even the official tutorials work, I guess I will just reinstall the engine -.-
Thanks for your help, I give C++ up ; forever
I don’t know. Visual Studio says:
Error 2 error LNK2001: unresolved external symbol “public: virtual void __cdecl AUltimateTutorialsCharacter::TakeDmg_Implementation(int)” (?TakeDmg_Implementation@AUltimateTutorialsCharacter@@UEAAXH@Z) E:\GitHub\UE4—UltimateTutorialMap\UltimateTutorials\Intermediate\ProjectFiles\UltimateTutorialsCharacter.cpp.obj UltimateTutorials
Oh sry, I forgot to say: this only happens with BlueprintNativeEvent.
I got it working with BlueprintImplementableEvent.
Still, I want to know how I do BlueprintNativeEvent properly
I got it working with BlueprintImplementableEvent. But what I really want is a BlueprintNativeEvent.
I did just as you said for the BlueprintNativeEvent (I copied the code over) and I get following error:
Error 2 error LNK2001: unresolved external symbol “public: virtual void __cdecl AUltimateTutorialsCharacter::TakeDmg_Implementation(int)” (?TakeDmg_Implementation@AUltimateTutorialsCharacter@@UEAAXH@Z) E:\GitHub\UE4—UltimateTutorialMap\UltimateTutorials\Intermediate\ProjectFiles\UltimateTutorialsCharacter.cpp.obj UltimateTutorials
My whole Project is on Github. So if you want to take a look.
/tree/experimental
I just pushed the latest files to Experimental Branch
Oh my god! You are a magican! It compiles and works like it should! :*
(yes, I am very new to programming)
Just 1 more question.
If I place the event in BP, will it be overwritten, or extended by the code I add?
Hi! Sorry to hear you’re having trouble with this -
Are you trying to do BlueprintImplementableEvent or BlueprintNativeEvent? The first one will only have behavior written in Blueprints, but the second one can also have C++ behavior.
If you want a BlueprintImplementableEvent, just have these lines in your header file - and then no C++ code in your .cpp file.
UFUNCTION(BlueprintImplementableEvent, Category = "DmgSystem")
void TakeDmg(int32 Damage);
If you want a BlueprintNativeEvent, with some functionality in C++ and some functionality adding on or overriding in Blueprints, have these lines in your header file:
UFUNCTION(BlueprintNativeEvent, Category = "DmgSystem")
void TakeDmg(int32 Damage);
And then these lines in your source file:
void TakeDmg_Implementation(int32 Damage)
{
// your code here
}
Also, if you were getting errors about not being able to call functions externally, make sure that your TakeDmg function declaration is not below a “protected” or “private” line in the Character’s header file.
BlueprintImplementable and BlueprintNative events are both meant to be called from C++, so what you may want to do for your functionality is have two functions. One is BlueprintCallable, and has a C++ definition that calls your BlueprintImplementable or BlueprintNative events. The other is your actual TakeDmg event. I’ll take a quick look and see if that would do what you’re trying to accomplish.
If you’d like, attach your Character header and source files here and we can take a look!
Good catch! I needed to add your class name into the example code above. Thanks for bearing with me - let’s try this code instead!
Header file:
public:
UFUNCTION(BlueprintNativeEvent, Category = "DmgSystem")
void TakeDmg(int32 Damage);
Source file:
void AUltimateTutorialsCharacter::TakeDmg_Implementation(int32 Damage)
{
// your code here
}
I just gave that code a quick test compile against 4.2 - let me know if it works for you!
It will be overridden unless you add a call to the parent. You can see an example in these videos here (although this may be skipping ahead a bit in the tutorial from where you are now).
Overriding C++ with Blueprints - Part 1
Overriding C++ with Blueprints - Part 2
It seems that as of 4.7 you do have to add the _Implementation to the .h file. See this question.