
P12 Editor Alpha V0.40.0.0 Release Note
Version: 0.40.0.0 Release Date: November 28, 2024We're excited to bring you our latest update! This release introduces powerful font customization options, dynamic visual effects, and enhanced UI controls to help you create even more impressive experiences. Highlights:[NEW] 12 New Professional Fonts[NEW] Skybox Background Transition Effects[ENHANCEMENT] World UI 2.0: Advanced Display Controls[ENHANCEMENT] Material Specular Effects[NEW] 🔤 12 New Professional FontsWe've significantly...

P12 Arcana 3.0 Trial Run
OverviewDear P12 Creators and Voters community: Since November 2023, we’ve came through 550 days of creative time, 18 rounds P12 Arcana filled with fantastic creations and inspiring works done! Along the way, we’ve made changes to P12 Arcana from display gallery to playable / launchable creations via PGE Client. However, there are more issues to be tackled:Fradulent votes on over-rated creationsDecent creations being over-looked / missedStable / On-time bounty to our P12 StarmakersP12 Arcana ...
P12 Genesis Airdrop Tutorial
IntroGreetings to all our gamers and developers! We have witnessed more than 30K Steam Gamers and Developers joining the Genesis Soul-Bound NFT Airdrop! Big thanks for your great passion for P12! This is a step-by-step tutorial on how you can claim NFTs if you are a Steam Gamer or Developer. Feel free to take a close look and if you have further questions, please leave a message here:Discord - Group Chat That's All Fun & GamesDiscord is great for playing games and chilling with friends, ...
Building the first and only UGC Game Engine for onchain games and autonomous worlds.

P12 Editor Alpha V0.40.0.0 Release Note
Version: 0.40.0.0 Release Date: November 28, 2024We're excited to bring you our latest update! This release introduces powerful font customization options, dynamic visual effects, and enhanced UI controls to help you create even more impressive experiences. Highlights:[NEW] 12 New Professional Fonts[NEW] Skybox Background Transition Effects[ENHANCEMENT] World UI 2.0: Advanced Display Controls[ENHANCEMENT] Material Specular Effects[NEW] 🔤 12 New Professional FontsWe've significantly...

P12 Arcana 3.0 Trial Run
OverviewDear P12 Creators and Voters community: Since November 2023, we’ve came through 550 days of creative time, 18 rounds P12 Arcana filled with fantastic creations and inspiring works done! Along the way, we’ve made changes to P12 Arcana from display gallery to playable / launchable creations via PGE Client. However, there are more issues to be tackled:Fradulent votes on over-rated creationsDecent creations being over-looked / missedStable / On-time bounty to our P12 StarmakersP12 Arcana ...
P12 Genesis Airdrop Tutorial
IntroGreetings to all our gamers and developers! We have witnessed more than 30K Steam Gamers and Developers joining the Genesis Soul-Bound NFT Airdrop! Big thanks for your great passion for P12! This is a step-by-step tutorial on how you can claim NFTs if you are a Steam Gamer or Developer. Feel free to take a close look and if you have further questions, please leave a message here:Discord - Group Chat That's All Fun & GamesDiscord is great for playing games and chilling with friends, ...
Building the first and only UGC Game Engine for onchain games and autonomous worlds.

Subscribe to Project Twelve

Subscribe to Project Twelve
Share Dialog
Share Dialog
>2.6K subscribers
>2.6K subscribers



【Editor】
1. Character Editor
2.Automatically format the code when creating a new script
Delete the 'ChangeClothes.ts' script file that comes with the new project by default
Change the New Script button to: New Script, New UI Script
Automatically format the script with the class name of the developer's new file name
Auto-formatted life cycle after new script creation
3. Editor Multilingual Function
Added multi-language function to the editor, you can modify the language settings through the toolbar (currently supports Simplified Chinese and English)
4.Main editor UI optimization
5.The editor synchronizes scripts through the refresh function
Project content - new refresh button in the right-click menu of the script category, used to refresh the external added scripts
6.Add the function of locating resources in the local repository to the resource reference control in the property column
The resource reference space has a new function to locate resources, click the locate button to locate the referenced resources in the local repository (Note: the resources hidden in the repository cannot be located, and the button is not responsive when clicked)
7.The editor supports multi-environment login and publishing
The editor supports overseas versions and adds regional options to the login screen
Note:
After supporting multiple environments, new projects under the editor will be saved under /MW/Saved/MetaWorld/Projects
If you want to move the project from the old path to the new path, you need to manually delete the tsconfig file in the project, and then compile it and use it normally
8.Added alerts in the local repository for resources with performance risks
In the current version, only resources with mask materials are judged as performance risk resources
9.World/Local Axis Transformation Function
Added world/local axis switching function in Editor toolbar
Toggle object world/local axis with the new function
10.Art resource upload tool (verision three)
Support for prefabricated bodies as standalone resources for tool upload
Support UI as standalone resource for tool upload
Support resource upload number display
11.Static mesh manual merge function
New static model merging function, developers can manually mark static models in groups during editing, and merge them into one static model as a group at runtime, thus reducing drawcall
Instructions
Create a merge object and mount the static model you want to merge under the merge object
Select the static mesh and execute the right-click menu [Include Selected Create Merged Objects].
Merge Effect
Comparison of drawcall before and after merging
Consolidated and unified movement
The merged static model as a whole, if you want to modify the merged static model by code, you need to set the merged object as dynamic
Sample Code
@MWCore.MWClass
export default class test extends MWCore.MWScript
{
protected OnStart(): void {
Events.OnKeyDown(Type.Keys.NumPadOne,()=>
{
let b =MWCore.GameObject.Find("Merge Object ID");
b.location=new Type.Vector(0,0,100);
}
)
}
}
Note
Number of facets: the number of static model facets under the merged object cannot be more than 65535
The static model merge function does not support dynamic merge at runtime yet
Developers need to create the merge object at edit time, and the subobjects (StaticMesh) under the merge object will be merged into one at runtime.
After merging, you can drag the code to transform the merged object as a whole, but you can't get the subobjects under the merged object and operate them by the object ID.
There is no practical effect after using the manual merge function under Prefab for the time being, this problem will be fixed as soon as possible.
Other optimization: on the basis of the original static StaticMesh automatic merge batch, add the dynamic StaticMesh DrawCall optimization strategy (multiple identical models in the screen except for transform will be merged into a draw call)
You can see that there are multiple of the same object without increasing drawcall
12. Resource priority loading
New "Priority Loading" area in Object Manager, resources mounted to "Priority Loading" area will be downloaded and loaded first when the game starts (Loading phase), and you can enter the game only after all the priority loading resources are loaded.
13.Editor frame rate limit when losing focus
The editor, which runs at a fixed 62 fps when active, will run at 10 fps when out of focus, reducing PC performance consumption when out of focus
14.Add grid display for surface material, with grid alignment function
After creating a new empty scene, the ground material will show the grid
Large grid corresponds to: move the alignment tool parameter 100,
Added Han clothing related resources
Compile and mount the script, PIE can run it, or use the role editor for dressing
@MWCore.MWClass
class TestAttach extends MWCore.MWScript {
@MWCore.MWProperty()
preloadAssets = "47666,47673,47668,47669,47671"
Character: GamePlay.Character;
OnStart() {
console.log("OnStart");
GamePlay.AsyncGetCurrentPlayer().then((player) => {
this.Character = player.Character;
this.ChangeCloth();
});
}
ChangeCloth(): void {
this.Character.V2_Tools.UpperCloth_Tools.SetMesh("47673");
this.Character.V2_Tools.LowerCloth_Tools.SetMesh("47666");
this.Character.V2_Tools.FrontHair_Tools.SetMesh("47668");
this.Character.V2_Tools.BehindHair_Tools.SetMesh("47669");
this.Character.V2_Tools.Shoe_Tools.SetMesh("47671");
}
};
export default TestAttach;
2.[Action resource replacement] basic gesture resource replacement
Replaced content.:
Standing standby posture (male/female)
Standing moving posture (male/female)

Croutching Stance(male/female)

Jumping stance (male/female)
Flying stance (male/female)

Underwater breaststroke (male/female)
Water Surface freestyle (male/female)

1.New project will use Sakura School 2 character images by default


2.[Humanoid objects] provide collision API between characters and other humanoid objects, allowing users to decide whether to turn on or off collision between characters
/**
* Whether to enable collision with other characters
* @ge
*/
get isCollisionWithOtherCharacter(): boolean;
/**
* Whether to enable collision with other characters
* @set
*/
set isCollisionWithOtherCharacter(inIsCollisionWithOtherCharacter: boolean);
Example effect:

3.[Humanoid Objects] Provide respectively: the client can specify the method to hide other players (without synchronization); the server can hide the specified player
/**
* whether the object is visible
* @get
*/
get isVisible(): boolean;
/**
* whether the object is visible
* @set
*/
set isVisible(inIsVisible: boolean);
/**
* whether the object is visible(local setting)
* @get
*/
get isVisible_Locally(): boolean;
/**
* @set
*/
set isVisible_Locally(inIsVisible: boolean);
4.[Humanoid Object Properties] GroundFriction parameter and SeparateBrakingFriction
/**
* ground friction
* @get
*/
get groundFriction(): number;
/**
* ground friction
* @set
*/
set groundFriction(inGroundFriction: number);
/**
* enable separate friction coefficient
* @get
*/
get bUseSeparateBrakingFriction(): boolean;
/**
* Use separate braking friction
* @set
*/
set bUseSeparateBrakingFriction(inbUseSeparateBrakingFriction: boolean);
5.API-Effects game function object add play completion callback
/*
Non loop effects callback after playback is complete
Loop effects do not support callbacks when playback is complete
*/
_effect.play(()=>{
console.log(`====effect play finished`);
}
6.API-Effects game function object add get time interface
//Get the duration of the effect, in seconds
_effect.getEffectLength():number
7.API-extended navigation interface MoveTo()
/*
1.Support the chararter of using the navigation interface
2.New active abort navigation interface
3.New navigation success callback
4.New navigation to the target point of the stopping range
moveTo(player: MWCore.GameObject, Location: Type.Vector,Radius?:number,OnSuccess?:()=>void,OnFail?:()=>void):void;
*/
@MWCore.MWClass
export default class Move extends MWCore.MWScript {
player: GamePlay.Player;
async onStart() {
if (GamePlay.isClient()) {
this.player = await GamePlay.asyncGetCurrentPlayer();
this.player.Character.OnSkill3Trigger.Add(() => {
this.Move(this.player);
})
this.player.Character.OnSkill4Trigger.Add(() => {
this.Stop(this.player);
})
}
}
//start navigating
@MWCore.MWFunction(MWCore.MWServer)
Move(trigger:MWCore.GameObject,location: Type.Vector) {
GamePlay.moveTo(trigger, location, 5, () => {
console.log("Success");
}, () => {
console.log("Failed!");
});
}
//end navigating
@MWCore.MWFunction(MWCore.MWServer)
Stop(trigger:MWCore.GameObject) {
GamePlay.clearMoveTo(trigger);
}
}
8.API-Rotating axis game function object repair interface function
//Restore the rotation axis to the initial angle
_rotator2.onReverse();
9.TS code standardization
Standardize TS scripting method, lower camel case will be used from now. For code standardization tool usage details, refer to https://gitlab.appshahe.com/metaApp/metaverse/plugins/typescript/-/blob/feature/format1.0/README.md Expose the distance parameter (scaling distance factor) for the near-large-far-small of the world UI
/** Get the distance scaling factor /
get distanceScaleFactor(): number;
/* Set the distance scaling factor */
set distanceScaleFactor(Value: number);
10.Resolved the skyhbox cloud stretching, and incorrect parameters and other issues

11.Throwing objects support dynamic modification of speed direction
Before change: Can't change the direction dynamically after Launch
After change: you can dynamically change the direction after Launch
Example:
this.projectile.Launch();
setTimeout(()=>{
this.projectile.rotation = changeRot;
this.projectile.InitailSpeed = changeSpeed;
},changeTime)
12.Mobile client version verification and connection exception prompt
In Online only, if the current Mobile version number does not match the RM version number, a prompt will be added during the loading process.
13.Loading page secondary optimization and Mobile end prompt box UI change
Optimize the background image of the loading page and the performance and text of the progress tips below
Optimize pop-up alert box UI
The above right figure is just a reference, the actual matching process will not pop up "Cancel Match"
14.Mobile side adds the function of switching multiple languages according to the system language
Prompts triggered during entry into the game and while playing will switch according to the device system language()
1.JS listening port fixed, easy to debug code directly in the IDE
server fixed por: 23300
Client fixed ports: 23301-23304 are four clients
2.Transform retains two decimal places for precision

Changed Transform to retain two decimal places will have an impact on the completed project, with parent-child relationship and parent object scaling parameters greater than two decimal places in the structure of the object, you need to manually modify the processing
3.API - New dynamic creation and deletion of scripts, and can be mounted on the GameObject
*
// can also create with ID
// MWCore.MWScript.spawnScript("Script ID");
// Create Script
let _script = await MWCore.MWScript.spawnScript(Test01);
_script.setTarget(this.obj);
// Delete Script
_script.destroy();
4.On-demand loading function for role modules
Resources used through the Role Editor or the Role Editor API do not need to be preloaded
/*Set the upper cloth resource, referencing the resource GUID without preload*/
GamePlay.GetCurrentPlayer().Character.V2_Tools.UpperCloth_Tools.SetMesh("Resource GUID")

【Editor】
1. Character Editor
2.Automatically format the code when creating a new script
Delete the 'ChangeClothes.ts' script file that comes with the new project by default
Change the New Script button to: New Script, New UI Script
Automatically format the script with the class name of the developer's new file name
Auto-formatted life cycle after new script creation
3. Editor Multilingual Function
Added multi-language function to the editor, you can modify the language settings through the toolbar (currently supports Simplified Chinese and English)
4.Main editor UI optimization
5.The editor synchronizes scripts through the refresh function
Project content - new refresh button in the right-click menu of the script category, used to refresh the external added scripts
6.Add the function of locating resources in the local repository to the resource reference control in the property column
The resource reference space has a new function to locate resources, click the locate button to locate the referenced resources in the local repository (Note: the resources hidden in the repository cannot be located, and the button is not responsive when clicked)
7.The editor supports multi-environment login and publishing
The editor supports overseas versions and adds regional options to the login screen
Note:
After supporting multiple environments, new projects under the editor will be saved under /MW/Saved/MetaWorld/Projects
If you want to move the project from the old path to the new path, you need to manually delete the tsconfig file in the project, and then compile it and use it normally
8.Added alerts in the local repository for resources with performance risks
In the current version, only resources with mask materials are judged as performance risk resources
9.World/Local Axis Transformation Function
Added world/local axis switching function in Editor toolbar
Toggle object world/local axis with the new function
10.Art resource upload tool (verision three)
Support for prefabricated bodies as standalone resources for tool upload
Support UI as standalone resource for tool upload
Support resource upload number display
11.Static mesh manual merge function
New static model merging function, developers can manually mark static models in groups during editing, and merge them into one static model as a group at runtime, thus reducing drawcall
Instructions
Create a merge object and mount the static model you want to merge under the merge object
Select the static mesh and execute the right-click menu [Include Selected Create Merged Objects].
Merge Effect
Comparison of drawcall before and after merging
Consolidated and unified movement
The merged static model as a whole, if you want to modify the merged static model by code, you need to set the merged object as dynamic
Sample Code
@MWCore.MWClass
export default class test extends MWCore.MWScript
{
protected OnStart(): void {
Events.OnKeyDown(Type.Keys.NumPadOne,()=>
{
let b =MWCore.GameObject.Find("Merge Object ID");
b.location=new Type.Vector(0,0,100);
}
)
}
}
Note
Number of facets: the number of static model facets under the merged object cannot be more than 65535
The static model merge function does not support dynamic merge at runtime yet
Developers need to create the merge object at edit time, and the subobjects (StaticMesh) under the merge object will be merged into one at runtime.
After merging, you can drag the code to transform the merged object as a whole, but you can't get the subobjects under the merged object and operate them by the object ID.
There is no practical effect after using the manual merge function under Prefab for the time being, this problem will be fixed as soon as possible.
Other optimization: on the basis of the original static StaticMesh automatic merge batch, add the dynamic StaticMesh DrawCall optimization strategy (multiple identical models in the screen except for transform will be merged into a draw call)
You can see that there are multiple of the same object without increasing drawcall
12. Resource priority loading
New "Priority Loading" area in Object Manager, resources mounted to "Priority Loading" area will be downloaded and loaded first when the game starts (Loading phase), and you can enter the game only after all the priority loading resources are loaded.
13.Editor frame rate limit when losing focus
The editor, which runs at a fixed 62 fps when active, will run at 10 fps when out of focus, reducing PC performance consumption when out of focus
14.Add grid display for surface material, with grid alignment function
After creating a new empty scene, the ground material will show the grid
Large grid corresponds to: move the alignment tool parameter 100,
Added Han clothing related resources
Compile and mount the script, PIE can run it, or use the role editor for dressing
@MWCore.MWClass
class TestAttach extends MWCore.MWScript {
@MWCore.MWProperty()
preloadAssets = "47666,47673,47668,47669,47671"
Character: GamePlay.Character;
OnStart() {
console.log("OnStart");
GamePlay.AsyncGetCurrentPlayer().then((player) => {
this.Character = player.Character;
this.ChangeCloth();
});
}
ChangeCloth(): void {
this.Character.V2_Tools.UpperCloth_Tools.SetMesh("47673");
this.Character.V2_Tools.LowerCloth_Tools.SetMesh("47666");
this.Character.V2_Tools.FrontHair_Tools.SetMesh("47668");
this.Character.V2_Tools.BehindHair_Tools.SetMesh("47669");
this.Character.V2_Tools.Shoe_Tools.SetMesh("47671");
}
};
export default TestAttach;
2.[Action resource replacement] basic gesture resource replacement
Replaced content.:
Standing standby posture (male/female)
Standing moving posture (male/female)

Croutching Stance(male/female)

Jumping stance (male/female)
Flying stance (male/female)

Underwater breaststroke (male/female)
Water Surface freestyle (male/female)

1.New project will use Sakura School 2 character images by default


2.[Humanoid objects] provide collision API between characters and other humanoid objects, allowing users to decide whether to turn on or off collision between characters
/**
* Whether to enable collision with other characters
* @ge
*/
get isCollisionWithOtherCharacter(): boolean;
/**
* Whether to enable collision with other characters
* @set
*/
set isCollisionWithOtherCharacter(inIsCollisionWithOtherCharacter: boolean);
Example effect:

3.[Humanoid Objects] Provide respectively: the client can specify the method to hide other players (without synchronization); the server can hide the specified player
/**
* whether the object is visible
* @get
*/
get isVisible(): boolean;
/**
* whether the object is visible
* @set
*/
set isVisible(inIsVisible: boolean);
/**
* whether the object is visible(local setting)
* @get
*/
get isVisible_Locally(): boolean;
/**
* @set
*/
set isVisible_Locally(inIsVisible: boolean);
4.[Humanoid Object Properties] GroundFriction parameter and SeparateBrakingFriction
/**
* ground friction
* @get
*/
get groundFriction(): number;
/**
* ground friction
* @set
*/
set groundFriction(inGroundFriction: number);
/**
* enable separate friction coefficient
* @get
*/
get bUseSeparateBrakingFriction(): boolean;
/**
* Use separate braking friction
* @set
*/
set bUseSeparateBrakingFriction(inbUseSeparateBrakingFriction: boolean);
5.API-Effects game function object add play completion callback
/*
Non loop effects callback after playback is complete
Loop effects do not support callbacks when playback is complete
*/
_effect.play(()=>{
console.log(`====effect play finished`);
}
6.API-Effects game function object add get time interface
//Get the duration of the effect, in seconds
_effect.getEffectLength():number
7.API-extended navigation interface MoveTo()
/*
1.Support the chararter of using the navigation interface
2.New active abort navigation interface
3.New navigation success callback
4.New navigation to the target point of the stopping range
moveTo(player: MWCore.GameObject, Location: Type.Vector,Radius?:number,OnSuccess?:()=>void,OnFail?:()=>void):void;
*/
@MWCore.MWClass
export default class Move extends MWCore.MWScript {
player: GamePlay.Player;
async onStart() {
if (GamePlay.isClient()) {
this.player = await GamePlay.asyncGetCurrentPlayer();
this.player.Character.OnSkill3Trigger.Add(() => {
this.Move(this.player);
})
this.player.Character.OnSkill4Trigger.Add(() => {
this.Stop(this.player);
})
}
}
//start navigating
@MWCore.MWFunction(MWCore.MWServer)
Move(trigger:MWCore.GameObject,location: Type.Vector) {
GamePlay.moveTo(trigger, location, 5, () => {
console.log("Success");
}, () => {
console.log("Failed!");
});
}
//end navigating
@MWCore.MWFunction(MWCore.MWServer)
Stop(trigger:MWCore.GameObject) {
GamePlay.clearMoveTo(trigger);
}
}
8.API-Rotating axis game function object repair interface function
//Restore the rotation axis to the initial angle
_rotator2.onReverse();
9.TS code standardization
Standardize TS scripting method, lower camel case will be used from now. For code standardization tool usage details, refer to https://gitlab.appshahe.com/metaApp/metaverse/plugins/typescript/-/blob/feature/format1.0/README.md Expose the distance parameter (scaling distance factor) for the near-large-far-small of the world UI
/** Get the distance scaling factor /
get distanceScaleFactor(): number;
/* Set the distance scaling factor */
set distanceScaleFactor(Value: number);
10.Resolved the skyhbox cloud stretching, and incorrect parameters and other issues

11.Throwing objects support dynamic modification of speed direction
Before change: Can't change the direction dynamically after Launch
After change: you can dynamically change the direction after Launch
Example:
this.projectile.Launch();
setTimeout(()=>{
this.projectile.rotation = changeRot;
this.projectile.InitailSpeed = changeSpeed;
},changeTime)
12.Mobile client version verification and connection exception prompt
In Online only, if the current Mobile version number does not match the RM version number, a prompt will be added during the loading process.
13.Loading page secondary optimization and Mobile end prompt box UI change
Optimize the background image of the loading page and the performance and text of the progress tips below
Optimize pop-up alert box UI
The above right figure is just a reference, the actual matching process will not pop up "Cancel Match"
14.Mobile side adds the function of switching multiple languages according to the system language
Prompts triggered during entry into the game and while playing will switch according to the device system language()
1.JS listening port fixed, easy to debug code directly in the IDE
server fixed por: 23300
Client fixed ports: 23301-23304 are four clients
2.Transform retains two decimal places for precision

Changed Transform to retain two decimal places will have an impact on the completed project, with parent-child relationship and parent object scaling parameters greater than two decimal places in the structure of the object, you need to manually modify the processing
3.API - New dynamic creation and deletion of scripts, and can be mounted on the GameObject
*
// can also create with ID
// MWCore.MWScript.spawnScript("Script ID");
// Create Script
let _script = await MWCore.MWScript.spawnScript(Test01);
_script.setTarget(this.obj);
// Delete Script
_script.destroy();
4.On-demand loading function for role modules
Resources used through the Role Editor or the Role Editor API do not need to be preloaded
/*Set the upper cloth resource, referencing the resource GUID without preload*/
GamePlay.GetCurrentPlayer().Character.V2_Tools.UpperCloth_Tools.SetMesh("Resource GUID")
No activity yet