U5.5 Schlackenwacht: dritte Meshy-Figur (g03)

Schildplatten-Golem aus Icon, Phase-4-Bild und Kohlenbeißer-Konzept als
Stilvorlage, 68 Credits, Lane-Fassung inklusive. FigureViewsTests erkennt
Grund- und Aufwertungstruppen selbst. Stresstest 35 Schlackenwachten:
Mid 161,9 -> 148,5 fps, Karte unverändert 124,5. Tests grün,
Fingerabdrücke unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Martin Stickelbroeck 2026-10-09 17:29:30 +02:00
parent 714d0c697c
commit 4e2b6bc637
72 changed files with 57691 additions and 55641 deletions

View file

@ -0,0 +1,490 @@
{
"id": "schlackenwacht",
"group": "Characters",
"source": "tools/meshy/build_figure.py",
"exporter_version": 11,
"blender": "5.2.2 LTS",
"fbx_settings": {
"use_selection": true,
"use_visible": false,
"use_active_collection": false,
"global_scale": 1.0,
"apply_unit_scale": true,
"apply_scale_options": "FBX_SCALE_UNITS",
"axis_forward": "Y",
"axis_up": "Z",
"bake_space_transform": false,
"object_types": [
"ARMATURE",
"EMPTY",
"MESH"
],
"use_mesh_modifiers": true,
"use_mesh_modifiers_render": true,
"mesh_smooth_type": "OFF",
"use_subsurf": false,
"use_mesh_edges": false,
"use_tspace": false,
"use_triangles": false,
"colors_type": "LINEAR",
"prioritize_active_color": true,
"use_custom_props": false,
"add_leaf_bones": false,
"primary_bone_axis": "Y",
"secondary_bone_axis": "X",
"use_armature_deform_only": true,
"armature_nodetype": "NULL",
"bake_anim": true,
"bake_anim_use_all_bones": true,
"bake_anim_use_nla_strips": false,
"bake_anim_use_all_actions": true,
"bake_anim_force_startend_keying": true,
"bake_anim_step": 1.0,
"bake_anim_simplify_factor": 0.0,
"path_mode": "STRIP",
"embed_textures": false,
"batch_mode": "OFF"
},
"checks": [
{
"check": "turn_applied",
"ok": true,
"detail": "[]"
},
{
"check": "units_metric",
"ok": true,
"detail": "METRIC"
},
{
"check": "unit_scale_1",
"ok": true,
"detail": "1.0"
},
{
"check": "no_negative_scale",
"ok": true,
"detail": "{}"
},
{
"check": "object_scale_1",
"ok": true,
"detail": "{}"
},
{
"check": "mesh_names_unique",
"ok": true,
"detail": "['SchlackenwachtBody_LOD0', 'SchlackenwachtBody_LOD1']"
},
{
"check": "material_slots_filled",
"ok": true,
"detail": "{}"
},
{
"check": "normals_unit_length",
"ok": true,
"detail": "{}"
},
{
"check": "no_blend_shapes",
"ok": true,
"detail": "{}"
},
{
"check": "triangles_match_godot",
"ok": true,
"detail": "25142 fbx / 25142 godot"
},
{
"check": "one_armature",
"ok": true,
"detail": "['SchlackenwachtRig']"
},
{
"check": "single_root_bone",
"ok": true,
"detail": "['Root']"
},
{
"check": "root_bone_name",
"ok": true,
"detail": "['Root']"
},
{
"check": "bone_count_match_godot",
"ok": true,
"detail": "25 / 25"
},
{
"check": "bone_names_portable",
"ok": true,
"detail": "[]"
},
{
"check": "skinned_meshes_present",
"ok": true,
"detail": ""
},
{
"check": "clips_match_godot",
"ok": true,
"detail": "[]"
},
{
"check": "required_clips_present",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_mesh_names",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_triangles",
"ok": true,
"detail": "25142 / 25142"
},
{
"check": "roundtrip_materials",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_bones",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_clips",
"ok": true,
"detail": "['ability', 'attack_a', 'attack_b', 'death', 'hit', 'idle', 'walk']"
}
],
"generator": {
"clips": {
"idle": {
"source": "Idle",
"frames": [
0.0,
96.0
],
"seconds": 4.0,
"loop": true,
"contact_seconds": -1.0
},
"walk": {
"source": "Slow_Orc_Walk",
"frames": [
0.0,
132.0
],
"seconds": 2.7917,
"loop": true,
"contact_seconds": -1.0
},
"attack_a": {
"source": "Right_Hand_Sword_Slash",
"frames": [
0,
36
],
"seconds": 1.0417,
"loop": false,
"contact_seconds": 0.4051
},
"attack_b": {
"source": "Punch_Forward_with_Both_Fists",
"frames": [
18,
56
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.4737
},
"hit": {
"source": "Hit_Reaction",
"frames": [
0,
12
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
"ability": {
"source": "Charged_Ground_Slam",
"frames": [
6,
64
],
"seconds": 1.2083,
"loop": false,
"contact_seconds": 0.7292
},
"death": {
"source": "dying_backwards",
"frames": [
0.0,
52.80000305175781
],
"seconds": 2.2083,
"loop": false,
"contact_seconds": -1.0
}
},
"textures": {
"glow_share": 0.0087,
"palette_gains": {
"rock": [
1.1155,
1.2312,
1.5128
],
"metal": [
1.5139,
1.2913,
0.8064
]
},
"size": [
2048,
2048
]
},
"unit": 0.009999999776482582,
"lod": {
"lod0_triangles": 20145,
"lod1_triangles": 4997,
"lod1_vertices": 2505,
"welded_triangles": 20145,
"lod0_screen": 0.2
}
},
"inputs_sha256": {
"tools/meshy/g03/figure.json": "6934efc31f06faeafa189ba5f399b66d1c6662871aa9fce0e6b6c44a1add9dd8",
"assets-source/meshy/g03/schlackenwacht-skelett.glb": "0c6477bdcb262c36b5df2d7de1580742ea2dc6f51aa7259ef4273c97f9bb7b29",
"assets-source/meshy/g03/schlackenwacht-animationen.glb": "fdde8ad1b5ef713d4df1beb2c307054e1c83eaf552c8ddd986b11698aa159ec4"
},
"source_sha256": "9eb17a4e3dc7029b7031f3be85f6676877c521788835137eb199c352c5b35aa4",
"removed_modifiers": 0,
"kind": "skinned",
"fps": 24.0,
"objects": 3,
"meshes": {
"SchlackenwachtBody_LOD0": {
"mesh": "SchlackenwachtBody_LOD0",
"triangles": 20145,
"vertices": 23967,
"ngons": 0,
"materials": [
"AI_Schlackenwacht"
],
"uv_layers": [
"UVMap"
],
"color_attributes": [],
"active_color": null,
"custom_normals": true,
"normals_unit_length": true,
"bad_normals": 0,
"degenerate_triangles": 0,
"shape_keys": 0,
"skinned": true,
"scale": [
1.0,
1.0,
1.0
],
"bounds_unity": {
"min": [
-0.7712,
-0.0,
-0.3494
],
"max": [
0.7719,
1.35,
0.3443
]
}
},
"SchlackenwachtBody_LOD1": {
"mesh": "SchlackenwachtBody_LOD1",
"triangles": 4997,
"vertices": 2505,
"ngons": 0,
"materials": [
"AI_Schlackenwacht"
],
"uv_layers": [
"UVMap"
],
"color_attributes": [],
"active_color": null,
"custom_normals": false,
"normals_unit_length": true,
"bad_normals": 0,
"degenerate_triangles": 0,
"shape_keys": 0,
"skinned": true,
"scale": [
1.0,
1.0,
1.0
],
"bounds_unity": {
"min": [
-0.7708,
0.0013,
-0.3483
],
"max": [
0.7704,
1.3492,
0.3448
]
}
}
},
"armatures": {
"SchlackenwachtRig": {
"bones": [
"Root",
"Hips",
"Spine02",
"Spine01",
"Spine",
"neck",
"Head",
"head_end",
"headfront",
"LeftShoulder",
"LeftArm",
"LeftForeArm",
"LeftHand",
"RightShoulder",
"RightArm",
"RightForeArm",
"RightHand",
"LeftUpLeg",
"LeftLeg",
"LeftFoot",
"LeftToeBase",
"RightUpLeg",
"RightLeg",
"RightFoot",
"RightToeBase"
],
"roots": [
"Root"
]
}
},
"empties": {},
"bounds_unity": {
"min": [
-0.7712,
-0.0,
-0.3494
],
"max": [
0.7719,
1.35,
0.3448
]
},
"clips": [
{
"name": "ability",
"frames": [
0.0,
29.0
],
"seconds": 1.2083,
"loop": false,
"contact_seconds": 0.7292
},
{
"name": "attack_a",
"frames": [
0.0,
25.0
],
"seconds": 1.0417,
"loop": false,
"contact_seconds": 0.4051
},
{
"name": "attack_b",
"frames": [
0.0,
24.0
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.4737
},
{
"name": "death",
"frames": [
0.0,
53.0
],
"seconds": 2.2083,
"loop": false,
"contact_seconds": -1.0
},
{
"name": "hit",
"frames": [
0.0,
12.0
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
{
"name": "idle",
"frames": [
0.0,
96.0
],
"seconds": 4.0,
"loop": true,
"contact_seconds": -1.0
},
{
"name": "walk",
"frames": [
0.0,
67.0
],
"seconds": 2.7917,
"loop": true,
"contact_seconds": -1.0
}
],
"expected_from_godot": {
"triangles": 25142,
"bones": 25,
"clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death"
]
},
"meshes_with_ngons": {},
"meshes_without_uv": [],
"triangles": 25142,
"fbx": "Assets/Luneraria/Art/Characters/schlackenwacht.fbx",
"fbx_bytes": 3268972,
"ok": true
}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0f53dcc00c3204eac85646a59078a8ab
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View file

@ -0,0 +1,337 @@
fileFormatVersion: 2
guid: 2a144fe945cf34c34a772171ca5034b1
ModelImporter:
serializedVersion: 24300
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
searchTexturesGlobally: 0
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 0
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 0
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations:
- serializedVersion: 16
name: ability
takeName: SchlackenwachtRig|ability
internalID: -2819347402722904307
firstFrame: 0
lastFrame: 29
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.6034925
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: attack_a
takeName: SchlackenwachtRig|attack_a
internalID: -2160549880674491451
firstFrame: 0
lastFrame: 25
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.38888356
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: attack_b
takeName: SchlackenwachtRig|attack_b
internalID: 1691568016936313399
firstFrame: 0
lastFrame: 24
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.4737
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: death
takeName: SchlackenwachtRig|death
internalID: -3430208740213216668
firstFrame: 0
lastFrame: 53
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: hit
takeName: SchlackenwachtRig|hit
internalID: 8885316420147508437
firstFrame: 0
lastFrame: 12
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: idle
takeName: SchlackenwachtRig|idle
internalID: -8816640959135819507
firstFrame: 0
lastFrame: 96
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 1
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: walk
takeName: SchlackenwachtRig|walk
internalID: 8832924848793141138
firstFrame: 0
lastFrame: 67
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 1
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
isReadable: 1
meshes:
lODScreenPercentages:
- 0.25
- 0.01
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 0
importBlendShapes: 0
importCameras: 0
importLights: 0
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 1
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 1
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,246 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-8838160751718707870
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: hit
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 8885316420147508437, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-8381089576625902205
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 3750168924572829539}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: 8254581820847042861}
m_Position: {x: 235, y: 65, z: 0}
- serializedVersion: 1
m_State: {fileID: -3559729466661274620}
m_Position: {x: 270, y: 130, z: 0}
- serializedVersion: 1
m_State: {fileID: -2041191233393395951}
m_Position: {x: 305, y: 195, z: 0}
- serializedVersion: 1
m_State: {fileID: 3378992907968692340}
m_Position: {x: 340, y: 260, z: 0}
- serializedVersion: 1
m_State: {fileID: -8838160751718707870}
m_Position: {x: 375, y: 325, z: 0}
- serializedVersion: 1
m_State: {fileID: -1938754265435173914}
m_Position: {x: 410, y: 390, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 3750168924572829539}
--- !u!1102 &-3559729466661274620
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: attack_a
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -2160549880674491451, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-2041191233393395951
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: attack_b
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 1691568016936313399, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-1938754265435173914
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: walk
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 8832924848793141138, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: schlackenwacht
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -8381089576625902205}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &3378992907968692340
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: death
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -3430208740213216668, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &3750168924572829539
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: idle
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -8816640959135819507, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &8254581820847042861
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ability
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -2819347402722904307, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 34bd3ea42721340d7a9c58fa3585219a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: d1886f66889cc44a48f85e8a32d9a14b
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: ede0dc2b3ec3b4414aab31f3686c3a13
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 1
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: bd929244b68e34f2982ed76fd82236e2
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -189,6 +189,10 @@ MonoBehaviour:
Neutral: {fileID: 2100000, guid: d45c0cff6703140e089ea48ed9871dc5, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_Schlackenwacht
Neutral: {fileID: 2100000, guid: 93a8cf8007ee9440bb5da876affb71ff, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: BB_Basalt
Neutral: {fileID: 2100000, guid: 37c64b9b93d784d8ba407e7c9682aae4, type: 2}
Blau: {fileID: 0}

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AI_Schlackenwacht
m_Shader: {fileID: 4800000, guid: 9809bd5750e264586bd30e14a6f1bd4e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 0
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AlbedoMap:
m_Texture: {fileID: 2800000, guid: d1886f66889cc44a48f85e8a32d9a14b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: ede0dc2b3ec3b4414aab31f3686c3a13, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: bd929244b68e34f2982ed76fd82236e2, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StoneMap:
m_Texture: {fileID: 2800000, guid: 2e11a30a0df8143ab84722ec0a116b6d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _Cull: 2
- _Energy: 1
- _Flicker: 0
- _Glow: 1.25
- _Metallic: 1
- _Mode: 0
- _NormalStrength: 1
- _ObjectSpace: 0
- _Quality: 1
- _Relief: 0.016
- _Rim: 0.35
- _Roughness: 1
- _Seed: 0
- _ShadowNormalScale: 0
- _StoneScale: 1
- _UvMaps: 1
- _VertexColor: 0
m_Colors:
- _AlbedoMean: {r: 1, g: 1, b: 1, a: 1}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _OrmMean: {r: 1, g: 1, b: 1, a: 1}
- _RimColor: {r: 0.8, g: 0.86, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 93a8cf8007ee9440bb5da876affb71ff
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -59,8 +59,8 @@ MonoBehaviour:
Prefab: {fileID: 919132149155446097, guid: 0c290acf657e14113bb202a836b03242, type: 3}
Controller: {fileID: 9100000, guid: c833b53f8efae4cbe8d914eebcba8ceb, type: 2}
- Id: g03
Prefab: {fileID: 919132149155446097, guid: 183642226901e400bb094ee9249d9cd2, type: 3}
Controller: {fileID: 0}
Prefab: {fileID: 919132149155446097, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
Controller: {fileID: 9100000, guid: 34bd3ea42721340d7a9c58fa3585219a, type: 2}
- Id: g04
Prefab: {fileID: 919132149155446097, guid: 841c5b5333cc141a6bde6c22d3dc2884, type: 3}
Controller: {fileID: 9100000, guid: ec68488f0997c4a8185eea30724740ff, type: 2}
@ -193,6 +193,9 @@ MonoBehaviour:
- Id: schlackenklaue
Prefab: {fileID: 919132149155446097, guid: 0c290acf657e14113bb202a836b03242, type: 3}
Controller: {fileID: 9100000, guid: c833b53f8efae4cbe8d914eebcba8ceb, type: 2}
- Id: schlackenwacht
Prefab: {fileID: 919132149155446097, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
Controller: {fileID: 9100000, guid: 34bd3ea42721340d7a9c58fa3585219a, type: 2}
- Id: schlundkrone
Prefab: {fileID: 919132149155446097, guid: b2dd57798499c4b7b8698ee56e676c45, type: 3}
Controller: {fileID: 9100000, guid: 55d11e29be0134459bf261f2dad38f33, type: 2}

View file

@ -18,7 +18,7 @@ namespace Luneraria.UI.Tests
/// the preview rebuild. A capture tool, not part of the suite:
/// -testFilter "Luneraria.UI.Tests.FigureViewsTests"; LUNE_EVIDENCE names the folder below
/// docs/port/screenshots (default u5.5/spiel). LUNE_FIGURE names another Glutpakt troop
/// (default g01); an upgraded troop (g02) is bought as its base and upgraded.
/// (default g01); an upgraded troop (g02, g04, ...) is bought as its base and upgraded.
/// </summary>
[Explicit("Bildwerkzeug: nur gezielt per -testFilter")]
public sealed class FigureViewsTests
@ -57,7 +57,9 @@ namespace Luneraria.UI.Tests
string figure = Environment.GetEnvironmentVariable("LUNE_FIGURE");
if (string.IsNullOrEmpty(figure))
figure = "g01";
bool upgrade = figure != "g01";
// An upgraded troop has a base troop whose upgrade it is.
string baseId = ContentData.Units.Keys.FirstOrDefault(id => DataCatalog.UpgradeOf(id) == figure);
bool upgrade = baseId != null;
var s = new HudSession();
yield return s.Open(1920, 1080, seed: 4, bunds: Bunds);
s.Match.RoundNumber = 3;
@ -65,10 +67,10 @@ namespace Luneraria.UI.Tests
yield return s.Starter();
s.Leave();
for (int i = 0; i < 4; i++)
Send(s, Command.Buy("g01", s.Me.Lane));
Send(s, Command.Buy(upgrade ? baseId : figure, s.Me.Lane));
if (upgrade)
{
foreach (RosterEntry entry in s.Me.Draft.Roster.Where(e => e.TypeId == "g01").ToList())
foreach (RosterEntry entry in s.Me.Draft.Roster.Where(e => e.TypeId == baseId).ToList())
Send(s, Command.Upgrade(entry.Uid));
}
yield return new WaitForSecondsRealtime(.4f);

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

View file

@ -152,6 +152,17 @@ Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten
| Bild | `screenshots/u5.5-g02/` |
| Commits | `luneraria/u5.5-g02` |
## U5.5 · Schlackenwacht (g03)
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30, Asset-Prüfung 20/0 |
| Parität | Fingerabdrücke unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`) |
| Inhalt | Meshy-Figur für `g03` mit Lane-Fassung, 68 Credits |
| Leistung | Stresstest 35 Schlackenwachten: Mid 161,9 → 148,5 fps, Karte 124,5 → 124,5 fps. Rohdaten `logs/u5.5-g03/` |
| Bild | `screenshots/u5.5-g03/` |
| Commits | `luneraria/u5.5-g03` |
## Ausblick
Der Pilot entscheidet über eine Serie weiterer Meshy-Figuren (Kosten je Figur, Lizenz, Stilgleichheit). Offen bleiben außerdem Künstler-Sculpts für Anatomie/Gesicht/Haar, LOD und Material-Atlanten sowie die Build-Module für Windows und Linux.

View file

@ -1,6 +1,6 @@
# Port-Status · Champions of Luneraria in Unity
Stand: 9. Oktober 2026 (U5.5, zweite Figur).
Stand: 9. Oktober 2026 (U5.5, dritte Figur).
Referenz ist der Godot-Stand `luneraria/g3` (`1b540f2`) in `../saumwacht-godot`; er wird nicht mehr verändert. Engine: Unity 6.3 LTS (6000.3.20f1), Renderer URP. HDRP ist ausgeschlossen, bis ein Vergleich mit einer echten Szene etwas anderes nahelegt.
@ -13,7 +13,7 @@ Zielplattformen sind Fedora 44 und Windows 11; macOS ist die Entwicklungsplattfo
| U2 · Unity-Spielwelt | **fertig**: U2A Blender→FBX-Pipeline (9 Assets geprüft), U2B G1-Karte mit Materialsystem, U2C fester Takt und Ansichten (bildratenunabhängig nachgewiesen), U2D vollständige Bot-Partien sichtbar und gleich dem Kern; danach Batch-Import aller 86 Modelle, Einheiten mit eigenen Modellen | [U2-WORLD.md](U2-WORLD.md) |
| U3 · G3-HUD portieren | **fertig** (`luneraria/u3`): UI Toolkit, Sichtmodell mit Privatsphäre, menschlicher Sitz, alle HUD-Bereiche, Eingabe und Befehle, Prüfung 718/0, 14 G3-Motive, Spieltest, Leistung mit HUD | [U3-UI.md](U3-UI.md) |
| U4 · Netzwerk | **fertig** (`luneraria/u4` = `769e622`): LuneSession (Protokoll 4), TCP-Transport, Startbildschirm Host/Join, 43+12 Prüfungen, Mindestumfang M4. Nachtrag (`luneraria/u4-nachtrag`, in U5.3 zusammengeführt): Startbildschirm in der Szene, „Menü“ führt dorthin zurück | [U4-NETWORK.md](U4-NETWORK.md) |
| U5 · Visuelle Neuausrichtung (Vertical Slice Mid-Lane) | **fertig** (`luneraria/u5` = `2c1686b`, Stufen `luneraria/u5.2`): 6 PBR-Sätze, Surface-Shader mit Albedo/Normal/ORM, Stufen Lane/Rand, Hit- und Turm-VFX, 133/180 fps. **U5.3** (`luneraria/u5.3` = `07fa457`): Gebäude, Boss und Ringborkes Rinde auf PBR (11 Sätze); Bildfehler aus U5 behoben (doppelte Einfärbung, Datenkarten als sRGB, Streifen, bleichender Treffer-Flash, Nebel), Helligkeit und Grün wieder auf U3-Niveau **U5.4** (`luneraria/u5.4` = `4883d95`): Surface-Materialien für alle 146 Figurenmaterialien (Metalle metallisch, Randlicht, Struktur in den Porträts), SSAO (abschaltbar), Leistung −13 % Karte / −16 % Mid **U5.5-pilot** (`luneraria/u5.5-pilot` = `c386206`): Meshy-Figur für den Kohlenbeißer `g01` (Pipeline `tools/meshy/`, UV-Material mit Lava-Glut, Schatten ohne Normalen-Versatz), GPU-Batched-Skinning, Figuren-Stress −21 % Mid / −13 % Karte gegenüber Phase-4; **Lane-Fassung** (`luneraria/u5.5-lod`): 5.000-Dreiecke-LOD, Abstand −10 % Mid / −2 % Karte; **Schlackenklaue** `g02` (`luneraria/u5.5-g02`) als zweite Meshy-Figur, −11 % Mid / −1 % Karte | [U5-VISUAL.md](U5-VISUAL.md) |
| U5 · Visuelle Neuausrichtung (Vertical Slice Mid-Lane) | **fertig** (`luneraria/u5` = `2c1686b`, Stufen `luneraria/u5.2`): 6 PBR-Sätze, Surface-Shader mit Albedo/Normal/ORM, Stufen Lane/Rand, Hit- und Turm-VFX, 133/180 fps. **U5.3** (`luneraria/u5.3` = `07fa457`): Gebäude, Boss und Ringborkes Rinde auf PBR (11 Sätze); Bildfehler aus U5 behoben (doppelte Einfärbung, Datenkarten als sRGB, Streifen, bleichender Treffer-Flash, Nebel), Helligkeit und Grün wieder auf U3-Niveau **U5.4** (`luneraria/u5.4` = `4883d95`): Surface-Materialien für alle 146 Figurenmaterialien (Metalle metallisch, Randlicht, Struktur in den Porträts), SSAO (abschaltbar), Leistung −13 % Karte / −16 % Mid **U5.5-pilot** (`luneraria/u5.5-pilot` = `c386206`): Meshy-Figur für den Kohlenbeißer `g01` (Pipeline `tools/meshy/`, UV-Material mit Lava-Glut, Schatten ohne Normalen-Versatz), GPU-Batched-Skinning, Figuren-Stress −21 % Mid / −13 % Karte gegenüber Phase-4; **Lane-Fassung** (`luneraria/u5.5-lod`): 5.000-Dreiecke-LOD, Abstand −10 % Mid / −2 % Karte; **Schlackenklaue** `g02` (`luneraria/u5.5-g02`) als zweite Meshy-Figur, −11 % Mid / −1 % Karte; **Schlackenwacht** `g03` (`luneraria/u5.5-g03`), −8 % Mid / 0 % Karte | [U5-VISUAL.md](U5-VISUAL.md) |
QA je Meilenstein: [PORT-QA.md](PORT-QA.md).

View file

@ -476,3 +476,21 @@ Wie beim Kohlenbeißer bleibt in der Nahansicht der Animator als Mehrkosten (Hau
### Repository
Je Figur rund 40 MB: Lieferungen 21 MB (`assets-source/meshy/g02/`), Texturen 18 MB, FBX 3 MB. Für die übrigen Figuren ist Git LFS weiter offen.
## U5.5 · Dritte Figur: Schlackenwacht (g03)
Stand 9. Oktober 2026, Zweig `luneraria/u5.5-g03` (auf `luneraria/u5.5-g02`). Der Tank der Glutpakt, gleicher Ablauf wie bei der Schlackenklaue: ein Konzeptbild aus Icon, Phase-4-Bild und Kohlenbeißer-Konzept als Stilvorlage (12 Credits), Modell (30), Skelett mit 1,35 m (5), sieben Bewegungen (21), zusammen **68 Credits**.
- Entwurf: Der ganze Oberkörper ist eine Basalt-Schildplatte mit Goldrahmen und einem glühenden Lavaschlitz, ohne eigenen Kopf; große Steinfäuste mit Goldbändern. Das Auto-Rigging kam mit der kopflosen Form zurecht.
- `schlackenwacht.fbx`: 20.145 + 4.997 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar. Glut nur im Schlitz (0,9 % der Textur). Manifest `"replaces": "g03"`.
- `FigureViewsTests` (`LUNE_FIGURE`) erkennt jetzt selbst, ob eine Truppe gekauft oder aus ihrer Grundform aufgewertet wird.
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 20/0, 30/30 |
Stresstest mit 35 Schlackenwachten, je drei Läufe (`logs/u5.5-g03/`): Mid-Lane nah 161,9 → 148,5 fps (−8 %), Karte 124,5 → 124,5 fps (0 %). Bilder: `screenshots/u5.5-g03/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).
Bekannt: In der Leerlaufhaltung neigt sich die Schildplatte mit der Kopfbewegung der Bibliotheksbewegung leicht nach vorn.

View file

@ -1972,6 +1972,173 @@
]
}
},
{
"id": "schlackenwacht",
"kind": "skinned",
"ok": true,
"checks": [
{
"check": "blender_checks_passed",
"ok": true,
"detail": ""
},
{
"check": "imported",
"ok": true,
"detail": "\"Assets/Luneraria/Art/Characters/schlackenwacht.fbx\""
},
{
"check": "import_rules_applied",
"ok": true,
"detail": ""
},
{
"check": "root_transform_identity",
"ok": true,
"detail": "\"schlackenwacht pos (0.0000, 0.0000, 0.0000) rot (0.00, 0.00, 0.00) scale (1.0000, 1.0000, 1.0000)\""
},
{
"check": "node_transforms_axis_clean",
"ok": true,
"detail": "[]"
},
{
"check": "mesh_names",
"ok": true,
"detail": "[]"
},
{
"check": "triangles",
"ok": true,
"detail": "\"25142 unity / 25142 blender \""
},
{
"check": "material_slots",
"ok": true,
"detail": "[]"
},
{
"check": "normals_unit_length",
"ok": true,
"detail": "[]"
},
{
"check": "tangents_where_uv",
"ok": true,
"detail": "[]"
},
{
"check": "uvs_where_blender_has_uv",
"ok": true,
"detail": "[]"
},
{
"check": "vertex_colors",
"ok": true,
"detail": "[]"
},
{
"check": "bounds_axes_scale",
"ok": true,
"detail": "\"largest difference 0.00003 m; unity (-0.771, 0.000, -0.349) (0.772, 1.350, 0.345)\""
},
{
"check": "skinned_mesh",
"ok": true,
"detail": "2"
},
{
"check": "bone_names SchlackenwachtBody_LOD0",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone SchlackenwachtBody_LOD0",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names SchlackenwachtBody_LOD1",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone SchlackenwachtBody_LOD1",
"ok": true,
"detail": "\"Root\""
},
{
"check": "generic_avatar",
"ok": true,
"detail": "\"schlackenwachtAvatar\""
},
{
"check": "clips",
"ok": true,
"detail": "[]"
}
],
"facts": {
"triangles": 25142,
"renderers": 2,
"meshes_without_uv_and_tangents": 0,
"degenerate_triangles_dropped": 0,
"bounds_min": [
-0.771205068,
-2.109984E-07,
-0.349420339
],
"bounds_max": [
0.77192533,
1.35,
0.3447837
],
"clips": [
{
"name": "ability",
"length": 1.20833337,
"loop": false,
"events": 1
},
{
"name": "attack_a",
"length": 1.04166663,
"loop": false,
"events": 1
},
{
"name": "attack_b",
"length": 1.0,
"loop": false,
"events": 1
},
{
"name": "death",
"length": 2.20833325,
"loop": false,
"events": 0
},
{
"name": "hit",
"length": 0.5,
"loop": false,
"events": 0
},
{
"name": "idle",
"length": 4.0,
"loop": true,
"events": 0
},
{
"name": "walk",
"length": 2.79166675,
"loop": true,
"events": 0
}
]
}
},
{
"id": "schlundkrone",
"kind": "skinned",

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 5, army g03 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g03 35, w04 14, e04 12, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
"windows": [
{"view": "overview (zoom 64)", "frames": 2448, "fps": 122.3, "frame_ms_avg": 8.17, "frame_ms_median": 3.40, "frame_ms_p95": 24.60, "frame_ms_p99": 32.39, "frame_ms_max": 45.40, "frames_over_16_7_ms": 418, "of_them_with_simulation_step": 33, "gc_collections": 22, "simulation_ms_per_frame": 0.085, "views_ms_per_frame": 0.220, "ui_ms_per_frame": 0.077, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.64 / median 2.52 / p95 3.69 ms, render thread avg 1.89 / median 1.87 / p95 2.30 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.53 / median 0.22 / p95 21.95 ms
{"view": "mid lane close (zoom 22)", "frames": 1478, "fps": 147.3, "frame_ms_avg": 6.79, "frame_ms_median": 3.00, "frame_ms_p95": 22.06, "frame_ms_p99": 30.91, "frame_ms_max": 38.00, "frames_over_16_7_ms": 169, "of_them_with_simulation_step": 18, "gc_collections": 10, "simulation_ms_per_frame": 0.047, "views_ms_per_frame": 0.190, "ui_ms_per_frame": 0.061, "units_alive_max": 46}
// timings mid lane close (zoom 22): main thread avg 2.05 / median 1.98 / p95 2.99 ms, render thread avg 1.41 / median 1.41 / p95 1.64 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.73 / median 0.19 / p95 20.06 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 5, army g03 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g03 35, w04 14, e04 12, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
"windows": [
{"view": "overview (zoom 64)", "frames": 2516, "fps": 125.8, "frame_ms_avg": 7.95, "frame_ms_median": 3.19, "frame_ms_p95": 26.01, "frame_ms_p99": 32.62, "frame_ms_max": 38.90, "frames_over_16_7_ms": 432, "of_them_with_simulation_step": 34, "gc_collections": 23, "simulation_ms_per_frame": 0.083, "views_ms_per_frame": 0.206, "ui_ms_per_frame": 0.073, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.53 / median 2.41 / p95 3.50 ms, render thread avg 1.85 / median 1.83 / p95 2.21 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.40 / median 0.22 / p95 23.44 ms
{"view": "mid lane close (zoom 22)", "frames": 1489, "fps": 148.8, "frame_ms_avg": 6.72, "frame_ms_median": 3.01, "frame_ms_p95": 22.61, "frame_ms_p99": 30.49, "frame_ms_max": 37.31, "frames_over_16_7_ms": 167, "of_them_with_simulation_step": 11, "gc_collections": 9, "simulation_ms_per_frame": 0.047, "views_ms_per_frame": 0.189, "ui_ms_per_frame": 0.058, "units_alive_max": 46}
// timings mid lane close (zoom 22): main thread avg 2.03 / median 1.92 / p95 2.89 ms, render thread avg 1.40 / median 1.40 / p95 1.61 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.70 / median 0.28 / p95 20.49 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 5, army g03 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g03 35, w04 14, e04 12, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
"windows": [
{"view": "overview (zoom 64)", "frames": 2512, "fps": 125.5, "frame_ms_avg": 7.97, "frame_ms_median": 3.39, "frame_ms_p95": 25.59, "frame_ms_p99": 33.29, "frame_ms_max": 42.51, "frames_over_16_7_ms": 430, "of_them_with_simulation_step": 43, "gc_collections": 22, "simulation_ms_per_frame": 0.085, "views_ms_per_frame": 0.211, "ui_ms_per_frame": 0.074, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.57 / median 2.44 / p95 3.63 ms, render thread avg 1.86 / median 1.83 / p95 2.24 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.39 / median 0.25 / p95 23.14 ms
{"view": "mid lane close (zoom 22)", "frames": 1495, "fps": 149.5, "frame_ms_avg": 6.69, "frame_ms_median": 2.91, "frame_ms_p95": 22.99, "frame_ms_p99": 30.00, "frame_ms_max": 36.51, "frames_over_16_7_ms": 163, "of_them_with_simulation_step": 16, "gc_collections": 10, "simulation_ms_per_frame": 0.047, "views_ms_per_frame": 0.191, "ui_ms_per_frame": 0.060, "units_alive_max": 46}
// timings mid lane close (zoom 22): main thread avg 2.05 / median 1.97 / p95 2.90 ms, render thread avg 1.42 / median 1.41 / p95 1.64 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.65 / median 0.19 / p95 21.06 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 5, army g03 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g03 35, w04 14, e04 12, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
"windows": [
{"view": "overview (zoom 64)", "frames": 2476, "fps": 123.8, "frame_ms_avg": 8.08, "frame_ms_median": 3.30, "frame_ms_p95": 24.91, "frame_ms_p99": 32.32, "frame_ms_max": 48.59, "frames_over_16_7_ms": 414, "of_them_with_simulation_step": 25, "gc_collections": 22, "simulation_ms_per_frame": 0.087, "views_ms_per_frame": 0.210, "ui_ms_per_frame": 0.075, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.51 / median 2.38 / p95 3.66 ms, render thread avg 1.94 / median 1.90 / p95 2.40 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.58 / median 0.37 / p95 22.63 ms
{"view": "mid lane close (zoom 22)", "frames": 1580, "fps": 158.0, "frame_ms_avg": 6.33, "frame_ms_median": 2.91, "frame_ms_p95": 21.41, "frame_ms_p99": 28.31, "frame_ms_max": 39.58, "frames_over_16_7_ms": 151, "of_them_with_simulation_step": 11, "gc_collections": 10, "simulation_ms_per_frame": 0.048, "views_ms_per_frame": 0.198, "ui_ms_per_frame": 0.061, "units_alive_max": 46}
// timings mid lane close (zoom 22): main thread avg 1.97 / median 1.82 / p95 3.10 ms, render thread avg 1.39 / median 1.37 / p95 1.67 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.34 / median 0.26 / p95 18.91 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 5, army g03 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g03 35, w04 14, e04 12, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
"windows": [
{"view": "overview (zoom 64)", "frames": 2498, "fps": 124.9, "frame_ms_avg": 8.01, "frame_ms_median": 3.21, "frame_ms_p95": 26.01, "frame_ms_p99": 33.11, "frame_ms_max": 41.71, "frames_over_16_7_ms": 442, "of_them_with_simulation_step": 39, "gc_collections": 22, "simulation_ms_per_frame": 0.082, "views_ms_per_frame": 0.201, "ui_ms_per_frame": 0.071, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.41 / median 2.27 / p95 3.49 ms, render thread avg 1.88 / median 1.83 / p95 2.40 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.60 / median 0.40 / p95 23.74 ms
{"view": "mid lane close (zoom 22)", "frames": 1651, "fps": 164.9, "frame_ms_avg": 6.06, "frame_ms_median": 2.78, "frame_ms_p95": 20.42, "frame_ms_p99": 27.80, "frame_ms_max": 36.00, "frames_over_16_7_ms": 155, "of_them_with_simulation_step": 11, "gc_collections": 10, "simulation_ms_per_frame": 0.045, "views_ms_per_frame": 0.178, "ui_ms_per_frame": 0.050, "units_alive_max": 46}
// timings mid lane close (zoom 22): main thread avg 1.74 / median 1.67 / p95 2.59 ms, render thread avg 1.32 / median 1.31 / p95 1.53 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.32 / median 0.64 / p95 18.73 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 5, army g03 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g03 35, w04 14, e04 12, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4, g05 2
"windows": [
{"view": "overview (zoom 64)", "frames": 2495, "fps": 124.7, "frame_ms_avg": 8.02, "frame_ms_median": 3.38, "frame_ms_p95": 26.12, "frame_ms_p99": 32.49, "frame_ms_max": 47.91, "frames_over_16_7_ms": 431, "of_them_with_simulation_step": 36, "gc_collections": 22, "simulation_ms_per_frame": 0.086, "views_ms_per_frame": 0.203, "ui_ms_per_frame": 0.075, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.44 / median 2.29 / p95 3.63 ms, render thread avg 1.91 / median 1.87 / p95 2.40 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.57 / median 0.42 / p95 23.79 ms
{"view": "mid lane close (zoom 22)", "frames": 1628, "fps": 162.8, "frame_ms_avg": 6.14, "frame_ms_median": 2.85, "frame_ms_p95": 20.70, "frame_ms_p99": 29.81, "frame_ms_max": 38.51, "frames_over_16_7_ms": 141, "of_them_with_simulation_step": 15, "gc_collections": 10, "simulation_ms_per_frame": 0.048, "views_ms_per_frame": 0.186, "ui_ms_per_frame": 0.055, "units_alive_max": 46}
// timings mid lane close (zoom 22): main thread avg 1.86 / median 1.77 / p95 2.79 ms, render thread avg 1.32 / median 1.31 / p95 1.54 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.28 / median 0.50 / p95 18.84 ms
]
}

View file

@ -0,0 +1,11 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"seconds": 11.6,
"passed": ["Startbildschirm sichtbar", "Partie wartet: Spielcontroller und Treiber aus", "vor dem Start kein HUD", "„Allein spielen“ bedienbar", "Offline: Startbildschirm verborgen", "Offline: Spielcontroller und Treiber laufen", "Offline: HUD sichtbar", "Offline: neue Partie, Sitz 1 (Mid)", "Offline: Planung", "Offline: lokale Sitzung", "„Startaufstellung“ bedienbar", "Startaufstellung gekauft (3 Einheiten)", "„Bereit“ bedienbar", "Bereit: Kampf beginnt", "Kampf: Figuren im Feld", "„Menü“ bedienbar", "Verlassen-Dialog mit „Zum Menü“", "Zurück: Startbildschirm sichtbar", "Zurück: HUD verborgen", "Zurück: Spielcontroller und Treiber aus", "Zurück: Sitzung beendet", "Zurück: keine Figuren im Feld", "Zurück: Kamera ruht", "Zurück: „Allein spielen“ bedienbar", "Zweite Partie: Startbildschirm verborgen, HUD sichtbar", "Zweite Partie: neue Partie in der Planung", "SSAO folgt der Einstellung", "Option „Umgebungsverdeckung“ sichtbar", "Option schaltet SSAO um", "Option stellt SSAO zurück"],
"failed": [],
"photos": ["00-startbildschirm.jpg", "01-planung.jpg", "02-kampf.jpg", "03-verlassen.jpg", "04-zurueck-im-startbildschirm.jpg", "05-zweite-partie.jpg", "06-optionen.jpg"],
"result": "PASS"
}

View file

@ -0,0 +1,11 @@
{
"match": "seed 2, bots, speed 24x",
"core_hash": "DCE95C96556F3A1A",
"core_steps": 12690,
"runs": [
{"target": "30 fps", "frames": 816, "seconds": 27.187, "measured_fps": 30.015, "max_steps_per_frame": 17, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "60 fps", "frames": 1625, "seconds": 27.083, "measured_fps": 60.001, "max_steps_per_frame": 16, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "120 fps", "frames": 3225, "seconds": 26.903, "measured_fps": 119.874, "max_steps_per_frame": 6, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "unlimited", "frames": 85071, "seconds": 26.829, "measured_fps": 3170.854, "max_steps_per_frame": 6, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true}
]
}

View file

@ -0,0 +1,16 @@
{
"runs": [
{"label": "match-seed2", "seed": 2, "start_round": 1, "extra_gold": 0, "speed": 6, "winner": 1, "end_note": "Ancient von Blau zerstört.", "steps": 12690, "hash": "DCE95C96556F3A1A", "core_hash": "DCE95C96556F3A1A", "same_as_core": true,
"units_alive_max": 84, "heroes_alive_max": 4, "boss_log": ["round 8: won team 1 ", "round 9: deployed team 1 bot"],
"rounds": [{"round": 1, "combat_seconds": 44.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 2, "combat_seconds": 57.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 3, "combat_seconds": 54.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 4, "combat_seconds": 62.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 5, "combat_seconds": 60.7, "lost": [], "boss": "none", "end": "cleared"}, {"round": 6, "combat_seconds": 62.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 7, "combat_seconds": 66.5, "lost": ["blau_bot_outer"], "boss": "none", "end": "cleared"}, {"round": 8, "combat_seconds": 89.65, "lost": ["rot_top_outer", "rot_top_inner"], "boss": "won", "end": "cleared"}, {"round": 9, "combat_seconds": 136.55, "lost": ["blau_bot_inner", "blau_base_2", "blau_base_1", "blau_ancient"], "boss": "deployed", "end": "core"}],
"events": ["round 7: blau_bot_outer destroyed", "round 8: rot_top_outer destroyed", "round 8: rot_top_inner destroyed", "round 8: grotto boss won", "round 9: blau_bot_inner destroyed", "round 9: blau_base_2 destroyed", "round 9: blau_base_1 destroyed", "round 9: blau_ancient destroyed", "round 9: grotto boss deployed"],
"shots": ["01-runde1-aufmarsch", "02-runde1-mid-kampf", "03-turm-faellt", "04-turm-ruine", "05-grotte-bosskampf", "06-held-kaempft", "07-boss-auf-der-lane", "08-ancient-faellt", "09-ancient-ruine", "10-ende-uebersicht"],
"performance": null},
{"label": "match-seed9-round21", "seed": 9, "start_round": 21, "extra_gold": 4000, "speed": 6, "winner": 0, "end_note": "Ancient von Rot zerstört.", "steps": 4195, "hash": "7B8E43AEFC0D60C5", "core_hash": "7B8E43AEFC0D60C5", "same_as_core": true,
"units_alive_max": 125, "heroes_alive_max": 6, "boss_log": [],
"rounds": [{"round": 21, "combat_seconds": 121.8, "lost": ["rot_mid_outer", "rot_top_outer", "rot_mid_inner"], "boss": "none", "end": "cleared"}, {"round": 22, "combat_seconds": 87.95, "lost": ["rot_top_inner", "rot_base_1", "blau_bot_outer", "rot_base_2", "rot_ancient"], "boss": "none", "end": "core"}],
"events": ["round 21: rot_mid_outer destroyed", "round 21: rot_top_outer destroyed", "round 21: rot_mid_inner destroyed", "round 22: rot_top_inner destroyed", "round 22: rot_base_1 destroyed", "round 22: blau_bot_outer destroyed", "round 22: rot_base_2 destroyed", "round 22: rot_ancient destroyed"],
"shots": ["11-welle21-uebersicht", "12-welle21-kampf", "13-ancient-rot-faellt", "14-welle-ende"],
"performance": {"window": "20 s real time at 1x speed, unlimited frame rate, round 21", "frames": 51551, "fps": 2577.535, "frame_ms_avg": 0.388, "frame_ms_p95": 0.415, "simulation_ms_per_frame": 0.004, "views_ms_per_frame": 0.129, "units_alive_max": 116}}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 717 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 KiB

View file

@ -1675,6 +1675,51 @@
"death"
]
}
},
{
"id": "schlackenwacht",
"group": "Characters",
"kind": "skinned",
"representative": "U5.5 series: Schlackenwacht (g03) from Meshy (image to 3D, auto rig, library clips)",
"source": "tools/meshy/build_figure.py",
"source_root": "unity",
"generator": {
"args": [
"tools/meshy/g03/figure.json"
],
"inputs": [
"tools/meshy/g03/figure.json",
"assets-source/meshy/g03/schlackenwacht-skelett.glb",
"assets-source/meshy/g03/schlackenwacht-animationen.glb"
]
},
"replaces": "g03",
"expect": {
"triangles": 25142,
"bones": 25,
"clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death"
]
},
"rules": {
"rest_action": null,
"root_bone": "Root",
"required_clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death"
]
}
}
],
"aliases": {

View file

@ -0,0 +1,10 @@
{
"ai_model": "gpt-image-2",
"prompt": "Full-body concept of the creature in the first two references for a 3D fantasy strategy game, painted in exactly the same art style and materials as the third reference (a fellow unit of its faction). The Schlackenwacht, a defensive guardian golem: its whole torso is one massive tall slab of black basalt shaped like a tower shield, framed and riveted with worn gold bands, with one narrow vertical slit in the center glowing with molten orange lava; no separate head, the shield slab rises above the shoulders; broad stone shoulder blocks with gold caps, thick stone arms ending in huge blocky fists wrapped in gold bands, short sturdy legs with heavy stone feet. Stylized realism, hand-sculpted detailed forms, chunky readable silhouette. Standing in a symmetric A-pose, front view, arms held away from the body, legs apart, entire figure visible head to feet, centered. Plain light grey background, soft even studio light, no ground shadow, no text.",
"aspect_ratio": "1:1",
"reference_image_urls": [
"@../saumwacht-godot/assets-source/phase3/masters/glutpakt/unit_g03_schlackenwacht_icon.png",
"@tools/meshy/g03/ref-g03-phase4.png",
"@assets-source/meshy/g01/kohlenbeisser-konzept.png"
]
}

View file

@ -0,0 +1,16 @@
{
"input_task_id": "01a12135-bc83-718d-9b59-f139b12a7302",
"ai_model": "latest",
"should_texture": true,
"enable_pbr": true,
"texture_resolution": "2k",
"should_remesh": true,
"topology": "triangle",
"target_polycount": 20000,
"save_pre_remeshed_model": true,
"pose_mode": "a-pose",
"target_formats": [
"glb"
],
"multi_view_thumbnails": true
}

View file

@ -0,0 +1,4 @@
{
"input_task_id": "01a12136-b052-7687-ac77-b38450da5a1f",
"height_meters": 1.35
}

View file

@ -0,0 +1,4 @@
{
"rig_task_id": "01a12138-5b87-7290-b8b6-2d6fdb0f6598",
"action_ids": [0, 119, 219, 214, 178, 127, 189]
}

View file

@ -0,0 +1,21 @@
{
"id": "schlackenwacht",
"replaces": "g03",
"rig": "assets-source/meshy/g03/schlackenwacht-skelett.glb",
"animations": "assets-source/meshy/g03/schlackenwacht-animationen.glb",
"material": "AI_Schlackenwacht",
"textures": "Assets/Luneraria/Art/Textures/ai-schlackenwacht",
"root_bone": "Root",
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
"palette": {"rock": {"color": "41434b", "strength": 0.8}, "metal": {"color": "c99645", "strength": 1.0}},
"clips": {
"idle": {"source": "Idle", "loop": true},
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
"attack_a": {"source": "Right_Hand_Sword_Slash", "frames": [0, 36], "seconds": 1.05, "contact_frame": 14},
"attack_b": {"source": "Punch_Forward_with_Both_Fists", "frames": [18, 56], "seconds": 1.0, "contact_frame": 36},
"hit": {"source": "Hit_Reaction", "frames": [0, 12], "seconds": 0.5},
"ability": {"source": "Charged_Ground_Slam", "frames": [6, 64], "seconds": 1.2, "contact_frame": 41},
"death": {"source": "dying_backwards"}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 MiB

View file

@ -0,0 +1,20 @@
{
"id": "01a12138-e9c2-743c-bcda-02a95b3d7d23",
"type": "animate",
"name": "",
"status": "SUCCEEDED",
"created_at": 1791558740707,
"progress": 100,
"started_at": 1791558740714,
"finished_at": 1791558766131,
"expires_at": 1791817966131,
"task_error": null,
"result": {
"animation_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-e9c2-743c-bcda-02a95b3d7d23/output/merged_animations.glb",
"animation_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-e9c2-743c-bcda-02a95b3d7d23/output/merged_animations.fbx",
"processed_usdz_url": "",
"processed_armature_fbx_url": "",
"processed_animation_fps_fbx_url": ""
},
"consumed_credits": 21
}

View file

@ -0,0 +1,16 @@
{
"id": "01a12135-bc83-718d-9b59-f139b12a7302",
"type": "image-to-image",
"ai_model": "gpt-image-2",
"prompt": "Full-body concept of the creature in the first two references for a 3D fantasy strategy game, painted in exactly the same art style and materials as the third reference (a fellow unit of its faction). The Schlackenwacht, a defensive guardian golem: its whole torso is one massive tall slab of black basalt shaped like a tower shield, framed and riveted with worn gold bands, with one narrow vertical slit in the center glowing with molten orange lava; no separate head, the shield slab rises above the shoulders; broad stone shoulder blocks with gold caps, thick stone arms ending in huge blocky fists wrapped in gold bands, short sturdy legs with heavy stone feet. Stylized realism, hand-sculpted detailed forms, chunky readable silhouette. Standing in a symmetric A-pose, front view, arms held away from the body, legs apart, entire figure visible head to feet, centered. Plain light grey background, soft even studio light, no ground shadow, no text.",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1791558534447,
"started_at": 1791558534457,
"finished_at": 1791558572131,
"expires_at": 1791817772131,
"image_urls": [
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/image_01a12135-bc83-718d-9b59-f139b12a7302_0.png"
],
"consumed_credits": 12
}

View file

@ -0,0 +1,41 @@
{
"id": "01a12136-b052-7687-ac77-b38450da5a1f",
"type": "image-to-3d",
"name": "",
"art_style": "",
"object_prompt": "",
"style_prompt": "",
"negative_prompt": "",
"texture_prompt": "",
"texture_image_url": "",
"text_style_prompt": "",
"image_style_url": "",
"status": "SUCCEEDED",
"created_at": 1791558595152,
"progress": 100,
"started_at": 1791558595159,
"finished_at": 1791558700924,
"expires_at": 1791817900924,
"task_error": null,
"model_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/model.glb",
"model_urls": {
"glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/model.glb",
"pre_remeshed_glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/pre_remeshed_model.glb"
},
"thumbnail_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/preview.png",
"thumbnail_urls": {
"back": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/preview_back.png",
"front": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/preview_front.png",
"left": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/preview_left.png",
"right": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/preview_right.png"
},
"texture_urls": [
{
"base_color": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/texture_0.png",
"metallic": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/texture_0_metallic.png",
"roughness": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/texture_0_roughness.png",
"normal": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12136-b052-7687-ac77-b38450da5a1f/output/texture_0_normal.png"
}
],
"consumed_credits": 30
}

View file

@ -0,0 +1,25 @@
{
"id": "01a12138-5b87-7290-b8b6-2d6fdb0f6598",
"type": "rig",
"name": "",
"status": "SUCCEEDED",
"created_at": 1791558707349,
"progress": 100,
"started_at": 1791558707356,
"finished_at": 1791558724863,
"expires_at": 1791817924863,
"task_error": null,
"result": {
"rigged_character_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Character_output.fbx",
"rigged_character_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Character_output.glb",
"basic_animations": {
"walking_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Animation_Walking_withSkin.glb",
"walking_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Animation_Walking_withSkin.fbx",
"walking_armature_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Animation_Walking_withSkin_armature.glb",
"running_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Animation_Running_withSkin.glb",
"running_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Animation_Running_withSkin.fbx",
"running_armature_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12138-5b87-7290-b8b6-2d6fdb0f6598/output/Animation_Running_withSkin_armature.glb"
}
},
"consumed_credits": 5
}