# Interface
Interfaces are a powerful feature that allow we to **define a set of functions that can be implemented by multiple classes**, regardless of their position in the inheritance hierarchy. This enables a form of polymorphism, where different classes can be treated uniformly if they implement the same interface. Interfaces are especially useful for defining common behaviors across disparate classes.
## Create C++ Interface
Step 1: Generate the Interface Files
- Open Unreal Editor
- Files -> New C++ Class
- Select **None** as parent class.
Step 2: Modify the Generated Files
- Example:
```cpp=
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "MyInterface.generated.h"
UINTERFACE(MinimalAPI)
class UMyInterface : public UInterface
{
GENERATED_BODY()
};
/**
* Interface class. Implement this class to add custom functionality.
*/
class MYPROJECT_API IMyInterface
{
GENERATED_BODY()
public:
// Add interface functions to this class.
virtual void MyInterfaceFunction() = 0;
```
## Implement the Interface in a Class
- Modify a class to implement interface:
```cpp=
#include "MyInterface.h" // Include the interface header
UCLASS()
class MYPROJECT_API AMyActor : public AActor, public IMyInterface
{
GENERATED_BODY()
public:
AMyActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
// Implement the interface function
virtual void MyInterfaceFunction() override;
};
```
## Use the Interface
- Example:
```cpp=
// Find all actors that implement the interface
TArray<AActor*> FoundActors;
UGameplayStatics::GetAllActorsWithInterface(GetWorld(), UMyInterface::StaticClass(), FoundActors);
// Call the interface function on each actor
for (AActor* Actor : FoundActors)
{
IMyInterface* Interface = Cast<IMyInterface>(Actor);
if (Interface)
{
Interface->MyInterfaceFunction();
}
}
```
## Implement the Interface in Blueprint
If we want to make the interface implemented in Blueprint, we have add the macros:
- BluprintNativeEvent
- C++: Default implementation.
- Blueprint: Can override the default C++ implementation.
```cpp=
// In MyInterface.h
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void MyInterfaceFunction();
```
```cpp=
// In MyActor.h
virtual void MyInterfaceFunction_Implementation() override;
```
- BlueprintImplementableEvent
- C++: No implementation.
- Blueprint: Must be implemented in Blueprints.
```cpp=
UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
void MyInterfaceFunction();
```
## Use the Interface which Implemented in Blueprint
- Example:
```cpp=
// Check if it is implemented in Blueprint
if (UKismetSystemLibrary::DoesImplementInterface(Actor, UMyInterface::StaticClass()))
{
IMyInterface::Execute_MyInterfaceFunction(Actor, Param1, Param2 ...);
}
```