Hi all!
I have some thoughts and they relate to interfaces in UE4.
In general, interfaces in UE4 are a pain: I will not show an example, you know what it is about
I would like to have a similar system as in simple C ++ with the ability to be inherited in BP, without stupidly checking the child class on a interface method exist.
This is my changes in the engine:
[SPOILER]
UnrealEngine\Engine\Source\Editor\BlueprintGraph\Classes\EdGraphSchema_K2.h
229 /** Allow Custom override*/
230 static const FName MD_AllowOverride;
...
800 /** Can this function may be custom override */
801 static bool FunctionAllowOverride(const UFunction* InFunction);
UnrealEngine\Engine\Source\Editor\BlueprintGraph\Private\EdGraphSchema_K2.cpp
187 const FName FBlueprintMetadata::MD_AllowOverride(TEXT("AllowOverride"));
...
924 bool UEdGraphSchema_K2::FunctionAllowOverride(const UFunction* InFunction)
{
return InFunction && InFunction->GetBoolMetaData(FBlueprintMetadata::MD_AllowOverride);
}
929 bool UEdGraphSchema_K2::CanKismetOverrideFunction(const UFunction* Function)
{
/* return Function && // original code
(
Function->HasAllFunctionFlags(FUNC_BlueprintEvent)
&& !Function->HasAllFunctionFlags(FUNC_Delegate) &&
!Function->GetBoolMetaData(FBlueprintMetadata::MD_BlueprintInternalUseOnly) &&
(!Function->HasMetaData(FBlueprintMetadata::MD_DeprecatedFunction) || GetDefault<UBlueprintEditorSettings>()->bExposeDeprecatedFunctions)
);
*/
const auto IsNotBad = Function && (!Function->HasMetaData(FBlueprintMetadata::MD_DeprecatedFunction) || GetDefault<UBlueprintEditorSettings>()->bExposeDeprecatedFunctions);
const auto IsEvent = Function && Function->HasAllFunctionFlags(FUNC_BlueprintEvent);
const auto IsNotDelegate = Function && !Function->HasAllFunctionFlags(FUNC_Delegate);
const auto IsNotInternal = Function && !Function->GetBoolMetaData(FBlueprintMetadata::MD_BlueprintInternalUseOnly) ;
const auto IsAllowOverride = FunctionAllowOverride(Function);
return IsNotBad && IsNotDelegate && IsNotInternal && ( IsEvent || IsAllowOverride );
}
964 bool UEdGraphSchema_K2::FunctionCanBePlacedAsEvent(const UFunction* InFunction)
{
/*
// First check we are override-able, non-static and non-const
if (!InFunction || !CanKismetOverrideFunction(InFunction) || InFunction->HasAnyFunctionFlags(FUNC_Static|FUNC_Const))
{
return false;
}
// Then look to see if we have any output, return, or reference params
return !HasFunctionAnyOutputParameter(InFunction);
*/
const auto IsOverride = InFunction && CanKismetOverrideFunction(InFunction);
const auto IsStaticConst = InFunction && InFunction->HasAnyFunctionFlags(FUNC_Static|FUNC_Const);
const auto IsEvent = InFunction && InFunction->HasAllFunctionFlags(FUNC_BlueprintEvent);
const auto IsHasOutParams = HasFunctionAnyOutputParameter(InFunction);
if(!IsOverride || IsStaticConst) return false;
return IsEvent && !IsHasOutParams;
}
UnrealEngine\Engine\Source\Editor\KismetCompiler\Private\KismetCompiler.cpp
3258 //const bool bCanBeOverridden = Function->HasAllFunctionFlags(FUNC_BlueprintEvent); // original code
const bool bCanBeOverridden = Function->HasAllFunctionFlags(FUNC_BlueprintEvent) || Function->GetBoolMetaData(FBlueprintMetadata::MD_AllowOverride);
if (!bCanBeOverridden)
{
MessageLog.Error(TEXT("The function in node @@ cannot be overridden"), EntryNode);
}
[/SPOILER]
How to use in project:
[SPOILER]
Interface declaration:
Override in child class:
Select to override in inherited BP.
Note, void returned methods(Events) is possible override as Functions (I am dnt like Events - they
s cluttered graphs)
Used in AnimInstance class( my case):
Declaration var in header:
Used in souce:
[/SPOILER]
This is not ideal case. On example, if use Owner->OnHealthChanged() (last example see upward), overrided function in BP not fired, becouse used class d`nt know about BP function.
Thinking, need dig in BlueprintImplementableEvent and make it same.
I’d love to see interfaces in UE convenient, this is necessary for those who work in C ++.
Thank you for the attention.