Unreal.hx is a plugin for Unreal Engine 4 that allows you to write code in the Haxe programming language. Haxe is a modern, high-level, type-safe programming language that offers high performance critical for game development.
- Haxe compiles directly to C++, for high runtime performance.
- Full access to the entire Unreal C++ API - including delegates and lambdas.
- Full support for
UCLASS
creation, subclassing, and Blueprints.
- Familiar C/Java-style syntax.
- Memory management via garbage collection.
- Strict type safety, with a powerful type inference engine.
- Many modern features such as lambdas/closures, generics, abstract data types (GADT's), reflection, metadata, and a powerful macro system for language extension.
- Make sure you've got a working
haxe
installation, and have thehxcpp
andhxcs
haxelibs installed - Clone this library or add it as a submodule to your Unreal project in the
Plugins/UE4Haxe
directory - Port your main
Build.cs
module toBuild.hx
and make sure it extendsHaxeModuleRules
- On the
Plugins/UE4Haxe
directory, runhaxe init-plugin.hxml
to make sure yourBuild.hx
file was built - A new directory,
Haxe
, will be created at the root of your project. Add any class to be compiled toHaxe/Static
, and you may add new compiler arguments to thearguments.hxml
file - For the latest master, you will need Haxe 3.3 and Unreal 4.11
package mygame;
import unreal.*;
@:uclass
class AMyActor extends AActor {
// make a property that is editable in the editor.
@:uproperty(EditDefaultsOnly, Category=Inventory)
var items:TArray<AActor>;
// make a function that is callable from C++/Blueprints
@:ufunction(BlueprintCallable, Category=Inventory)
public function addToInventory(item:AActor) {
items.push(item);
}
// override native C++ function
override function Tick(deltaTime:Float32) : Void {
super.Tick(deltaTime); // call super functions
trace('Hello, World!'); // all traces are redirected to Unreal's Log
trace('Warning', 'Some Warning'); // and it supports Warning, Error and Fatal as well
}
// tell Unreal to call our Tick function
public function new(wrapped) {
super(wrapped);
this.PrimaryActorTick.bCanEverTick = true;
}
}
package mygame;
import unreal.*;
@:uclass
class AMyGameMode extends AGameMode {
@:uproperty(BlueprintReadWrite)
public var playerName:FString;
@:ufunction(BlueprintCallable)
public function makeExternalRequest(data:String) {
// use Unreal C++ API to make an HTTP Request
var httpRequest = FHttpModule.Get().CreateRequest();
httpRequest.SetVerb("GET");
httpRequest.SetHeader("Content-Type", "application/json");
httpRequest.SetURL("www.mygame.com/players");
// use Haxe JSON library to encode data.
var json = {
name: this.playerName,
playerData: data,
};
httpRequest.SetContentAsString(haxe.Json.stringify(json));
// Receive a callback when the response is received.
httpRequest.OnProcessRequestComplete.BindLambda(function (request, response, success) {
trace('response received: ${response.GetContentAsString()}');
});
httpRequest.ProcessRequest();
}
}
For a complete example project, check out https://github.com/waneck/HaxePlatformerGame , which is a port of Unreal's Platformer Game demo to Haxe 3.3/Unreal 4.11
More information is available on the Wiki