Skip to content

Commit fecbbfb

Browse files
author
Nako Sung
committed
Merge branch 'master' of https://github.com/ncsoft/Unreal.js
2 parents 19e6636 + bbf863f commit fecbbfb

File tree

5 files changed

+99
-11
lines changed

5 files changed

+99
-11
lines changed

Examples/Content/Scripts/helloCharacter.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,27 @@
77
function GetPC() {
88
return PlayerController.C(GWorld.GetAllActorsOfClass(PlayerController).OutActors[0])
99
}
10+
11+
function compile(source) {
12+
return require('uclass')()(global,source)
13+
}
1014

1115
function main() {
1216
let PC = GetPC()
17+
18+
// For movement component replacement demonstration
19+
class MyCMC extends CharacterMovementComponent {
20+
properties() {
21+
this.Dummy/*EditAnywhere+Vector*/;
22+
}
23+
}
24+
let MyCMC_C = compile(MyCMC)
1325

1426
// declare a new character class
1527
class MyCharacter extends Character {
28+
prector() {
29+
MyCMC_C.SetDefaultSubobjectClass("CharMoveComp")
30+
}
1631
// strange? ctor, not constructor...
1732
ctor() {
1833
let movement = this.GetMovementComponent()
@@ -29,7 +44,7 @@
2944
}
3045
}
3146

32-
let MyCharacter_C = require('uclass')()(global,MyCharacter)
47+
let MyCharacter_C = compile(MyCharacter)
3348

3449
function randomPoint() {
3550
return GWorld.GetRandomPoint(GWorld.NavigationSystem.MainNavData)

Plugins/UnrealJS/Source/V8/Private/JavascriptContext_Private.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -770,8 +770,7 @@ class FJavascriptContextImplementation : public FJavascriptContext
770770

771771
auto ClassConstructor = [](const FObjectInitializer& ObjectInitializer){
772772
auto Class = static_cast<UBlueprintGeneratedClass*>(ObjectInitializer.GetClass());
773-
Class->GetSuperClass()->ClassConstructor(ObjectInitializer);
774-
773+
775774
FJavascriptContextImplementation* Context = nullptr;
776775

777776
if (auto Klass = Cast<UJavascriptGeneratedClass_Native>(Class))
@@ -789,7 +788,6 @@ class FJavascriptContextImplementation : public FJavascriptContext
789788
}
790789
}
791790

792-
793791
if (Context)
794792
{
795793
auto isolate = Context->isolate();
@@ -810,21 +808,39 @@ class FJavascriptContextImplementation : public FJavascriptContext
810808
I.Throw(TEXT("Invalid proxy : construct class"));
811809
return;
812810
}
813-
auto func = proxy->ToObject()->Get(I.Keyword("ctor"));
814-
811+
815812
Context->ObjectInitializer = &ObjectInitializer;
816813

817814
auto This = Context->ExportObject(Object);
818815

819816
auto context = Context->context();
820817

821-
if (func->IsFunction())
822818
{
823-
CallJavascriptFunction(context, This, nullptr, Local<Function>::Cast(func), nullptr);
819+
auto func = proxy->ToObject()->Get(I.Keyword("prector"));
820+
821+
if (func->IsFunction())
822+
{
823+
CallJavascriptFunction(context, This, nullptr, Local<Function>::Cast(func), nullptr);
824+
}
825+
}
826+
827+
Class->GetSuperClass()->ClassConstructor(ObjectInitializer);
828+
829+
{
830+
auto func = proxy->ToObject()->Get(I.Keyword("ctor"));
831+
832+
if (func->IsFunction())
833+
{
834+
CallJavascriptFunction(context, This, nullptr, Local<Function>::Cast(func), nullptr);
835+
}
824836
}
825837

826838
Context->ObjectInitializer = nullptr;
827839
}
840+
else
841+
{
842+
Class->GetSuperClass()->ClassConstructor(ObjectInitializer);
843+
}
828844
};
829845

830846
Class->ClassConstructor = ClassConstructor;
@@ -1040,7 +1056,7 @@ class FJavascriptContextImplementation : public FJavascriptContext
10401056

10411057
if (!Function->IsFunction()) continue;
10421058

1043-
if (UName != TEXT("ctor") && UName != TEXT("constructor"))
1059+
if (UName != TEXT("prector") && UName != TEXT("ctor") && UName != TEXT("constructor"))
10441060
{
10451061
if (!AddFunction(*UName, Function))
10461062
{

Plugins/UnrealJS/Source/V8/Private/JavascriptIsolate_Private.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,19 @@ DECLARE_MEMORY_STAT(TEXT("LoSpace"), STAT_LoSpace, STATGROUP_Javascript);
3232

3333
using namespace v8;
3434

35+
// HACK FOR ACCESS PRIVATE MEMBERS
36+
class hack_private_key {};
37+
static UClass* PlaceholderUClass;
38+
39+
template<>
40+
FObjectInitializer const& FObjectInitializer::SetDefaultSubobjectClass<hack_private_key>(TCHAR const*SubobjectName) const
41+
{
42+
AssertIfSubobjectSetupIsNotAllowed(SubobjectName);
43+
ComponentOverrides.Add(SubobjectName, PlaceholderUClass, *this);
44+
return *this;
45+
}
46+
// END OF HACKING
47+
3548
template <typename CppType>
3649
struct TStructReader
3750
{
@@ -1215,6 +1228,49 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
12151228
Template->Set(I.Keyword("GetClassObject"), I.FunctionTemplate(fn, ClassToExport));
12161229
}
12171230

1231+
void AddMemberFunction_Class_SetDefaultSubobjectClass(Local<FunctionTemplate> Template, UStruct* ClassToExport)
1232+
{
1233+
FIsolateHelper I(isolate_);
1234+
1235+
auto fn = [](const FunctionCallbackInfo<Value>& info) {
1236+
auto isolate = info.GetIsolate();
1237+
HandleScope scope(isolate);
1238+
1239+
FIsolateHelper I(isolate);
1240+
1241+
auto ClassToExport = reinterpret_cast<UClass*>((Local<External>::Cast(info.Data()))->Value());
1242+
1243+
auto ObjectInitializer = GetSelf(isolate)->GetContext()->GetObjectInitializer();
1244+
1245+
if (!ObjectInitializer)
1246+
{
1247+
I.Throw(TEXT("SetDefaultSubobjectClass must be called within ctor"));
1248+
return;
1249+
}
1250+
1251+
if (info.Length() < 1)
1252+
{
1253+
I.Throw(TEXT("Missing arg"));
1254+
return;
1255+
}
1256+
1257+
auto Class = static_cast<UJavascriptGeneratedClass*>(ObjectInitializer->GetClass());
1258+
if (!Class->JavascriptContext.IsValid())
1259+
{
1260+
I.Throw(TEXT("Fatal"));
1261+
return;
1262+
}
1263+
1264+
auto Context = Class->JavascriptContext.Pin();
1265+
auto Name = StringFromV8(info[0]);
1266+
PlaceholderUClass = ClassToExport;
1267+
ObjectInitializer->SetDefaultSubobjectClass<hack_private_key>(*Name);
1268+
PlaceholderUClass = nullptr;
1269+
};
1270+
1271+
Template->Set(I.Keyword("SetDefaultSubobjectClass"), I.FunctionTemplate(fn, ClassToExport));
1272+
}
1273+
12181274
void AddMemberFunction_Class_CreateDefaultSubobject(Local<FunctionTemplate> Template, UStruct* ClassToExport)
12191275
{
12201276
FIsolateHelper I(isolate_);
@@ -1602,6 +1658,7 @@ class FJavascriptIsolateImplementation : public FJavascriptIsolate
16021658

16031659
AddMemberFunction_Class_GetClassObject(Template, ClassToExport);
16041660
AddMemberFunction_Class_CreateDefaultSubobject(Template, ClassToExport);
1661+
AddMemberFunction_Class_SetDefaultSubobjectClass(Template, ClassToExport);
16051662

16061663
AddMemberFunction_Class_GetDefaultObject(Template, ClassToExport);
16071664
AddMemberFunction_Class_GetDefaultSubobjectByName(Template, ClassToExport);

Plugins/UnrealJS/Source/V8/Private/TypingGenerator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ struct TypingGenerator : TypingGeneratorBase
422422
w.push(";\n");
423423

424424
w.push("\tstatic GetDefaultSubobjectByName(Name: string): UObject;\n");
425-
425+
w.push("\tstatic SetDefaultSubobjectClass(Name: string): void;\n");
426426
w.push("\tstatic CreateDefaultSubobject(Name: string, Transient?: boolean, Required?: boolean, Abstract?: boolean): ");
427427
w.push(name);
428428
w.push(";\n");

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Unreal.js is a plug-in which brings V8-powered Javascript into UnrealEngine4.
2424
- https://github.com/ncsoft/Unreal.js/wiki
2525

2626
### Install and play
27-
- Make sure you have [UnrealEngine 4.10 canonical build](https://www.unrealengine.com/dashboard).
27+
- Make sure you have [UnrealEngine 4.10.2 canonical build](https://www.unrealengine.com/dashboard).
2828
- Install git-lfs first to download *.umap, *.uasset properly. (https://git-lfs.github.com/)
2929
- After installing `git-lfs`, `git clone https://github.com/ncsoft/Unreal.js`
3030
- Download [prebuilt UnrealJS plugin](https://github.com/ncsoft/Unreal.js/releases) and unzip into `Examples/Plugins/UnrealJS`.

0 commit comments

Comments
 (0)