U5.5 Funkenlanze: vierte Meshy-Figur (g05 und Heldin)

Figur und Lanze getrennt von Meshy; build_figure legt die Lanze in die
rechte Hand und bindet sie an RightHand (props), Lanzenstoß aus dem Stand
(in_place). Ersetzungen gelten nach den Godot-Zuordnungen. HUD-Porträts
zeichnen Skelettfiguren als gebackenes Netz: mit GPU-Skinning blieben
Karten leer. 110 Credits. Stresstest 38 Funkenlanzen gegen Phase 18:
Mid 128,6 -> 147,6 fps, Karte 112,4 -> 128,0. 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-10 13:19:24 +02:00
parent 4e2b6bc637
commit eddf49dc88
89 changed files with 61674 additions and 58835 deletions

View file

@ -0,0 +1,597 @@
{
"id": "funkenlanze_meshy",
"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": "['FunkenlanzeLanze_LOD0', 'FunkenlanzeLanze_LOD1', 'Funkenlanze_meshyBody_LOD0', 'Funkenlanze_meshyBody_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": "29045 fbx / 29045 godot"
},
{
"check": "one_armature",
"ok": true,
"detail": "['Funkenlanze_meshyRig']"
},
{
"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": "29045 / 29045"
},
{
"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": "Walk_Fight_Forward",
"frames": [
0.0,
40.0
],
"seconds": 1.2917,
"loop": true,
"contact_seconds": -1.0
},
"attack_a": {
"source": "Thrust_Slash",
"frames": [
4,
30
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.6538
},
"attack_b": {
"source": "Right_Hand_Sword_Slash",
"frames": [
0,
36
],
"seconds": 1.0417,
"loop": false,
"contact_seconds": 0.4051
},
"hit": {
"source": "Hit_Reaction",
"frames": [
0,
12
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
"ability": {
"source": "Charged_Slash",
"frames": [
0.0,
52.80000305175781
],
"seconds": 1.2083,
"loop": false,
"contact_seconds": 0.2975
},
"death": {
"source": "Shot_and_Fall_Backward",
"frames": [
0.0,
84.0
],
"seconds": 2.4167,
"loop": false,
"contact_seconds": -1.0
}
},
"textures": {
"glow_share": 0.0104,
"palette_gains": {
"rock": [
0.8951,
1.1038,
1.4391
],
"metal": [
2.0845,
1.7399,
0.7883
]
},
"size": [
2048,
2048
]
},
"unit": 0.009999999776482582,
"lod": {
"lod0_triangles": 20372,
"lod1_triangles": 4997,
"lod1_vertices": 2464,
"welded_triangles": 20372,
"lod0_screen": 0.2
},
"props": [
{
"name": "FunkenlanzeLanze",
"triangles": 3077,
"textures": {
"glow_share": 0.098,
"palette_gains": {
"rock": [
0.7881,
1.0317,
1.2699
],
"metal": [
2.1491,
1.8245,
0.8038
]
},
"size": [
2048,
2048
]
},
"lod": {
"lod0_triangles": 3077,
"lod1_triangles": 599,
"lod1_vertices": 292,
"welded_triangles": 3077,
"lod0_screen": 0.2
}
}
]
},
"inputs_sha256": {
"tools/meshy/g05/figure.json": "ec5cadcedc85c63ae7bea78912ad86b1c3f4efa1567fd1ce6b555743c130b085",
"assets-source/meshy/g05/funkenlanze-skelett.glb": "d7f93f79ae7993afaab8924b310307d38ec0c5e8b39f230826a10d79b33f91c1",
"assets-source/meshy/g05/funkenlanze-animationen.glb": "c47d742ee9379dee380ad2b1d4003778a56f301e38ea004c363901fd0065b383",
"assets-source/meshy/g05/funkenlanze-lanze.glb": "79406f8f6e5a51a449e2b55dde310ade8b17ebbfb0857092dae5829fc2aa902d"
},
"source_sha256": "d9ce9bca5de4e49a3b4e01f3304bebefc9a69497493699647c4ad9bcc40b2331",
"removed_modifiers": 0,
"kind": "skinned",
"fps": 24.0,
"objects": 5,
"meshes": {
"Funkenlanze_meshyBody_LOD0": {
"mesh": "Funkenlanze_meshyBody_LOD0",
"triangles": 20372,
"vertices": 24114,
"ngons": 0,
"materials": [
"AI_Funkenlanze"
],
"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.5654,
-0.0,
-0.1531
],
"max": [
0.565,
1.8,
0.1649
]
}
},
"FunkenlanzeLanze_LOD0": {
"mesh": "FunkenlanzeLanze_LOD0",
"triangles": 3077,
"vertices": 4763,
"ngons": 0,
"materials": [
"AI_FunkenlanzeLanze"
],
"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.2956,
0.8369,
-0.6454
],
"max": [
0.5814,
1.1601,
1.0769
]
}
},
"Funkenlanze_meshyBody_LOD1": {
"mesh": "Funkenlanze_meshyBody_LOD1",
"triangles": 4997,
"vertices": 2464,
"ngons": 0,
"materials": [
"AI_Funkenlanze"
],
"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.5657,
0.0002,
-0.1539
],
"max": [
0.5653,
1.8005,
0.1654
]
}
},
"FunkenlanzeLanze_LOD1": {
"mesh": "FunkenlanzeLanze_LOD1",
"triangles": 599,
"vertices": 292,
"ngons": 0,
"materials": [
"AI_FunkenlanzeLanze"
],
"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.2952,
0.8349,
-0.6468
],
"max": [
0.5829,
1.1619,
1.0777
]
}
}
},
"armatures": {
"Funkenlanze_meshyRig": {
"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.5657,
-0.0,
-0.6468
],
"max": [
0.5829,
1.8005,
1.0777
]
},
"clips": [
{
"name": "ability",
"frames": [
0.0,
29.0
],
"seconds": 1.2083,
"loop": false,
"contact_seconds": 0.2975
},
{
"name": "attack_a",
"frames": [
0.0,
24.0
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.6538
},
{
"name": "attack_b",
"frames": [
0.0,
25.0
],
"seconds": 1.0417,
"loop": false,
"contact_seconds": 0.4051
},
{
"name": "death",
"frames": [
0.0,
58.0
],
"seconds": 2.4167,
"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,
31.0
],
"seconds": 1.2917,
"loop": true,
"contact_seconds": -1.0
}
],
"expected_from_godot": {
"triangles": 29045,
"bones": 25,
"clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death"
]
},
"meshes_with_ngons": {},
"meshes_without_uv": [],
"triangles": 29045,
"fbx": "Assets/Luneraria/Art/Characters/funkenlanze_meshy.fbx",
"fbx_bytes": 3395228,
"ok": true
}

View file

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

Binary file not shown.

View file

@ -0,0 +1,337 @@
fileFormatVersion: 2
guid: 70c39c469a6fa406f85b60c8407d95c9
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: Funkenlanze_meshyRig|ability
internalID: 422813326786192609
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.24621369
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: Funkenlanze_meshyRig|attack_a
internalID: -1618003157874489814
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.6538
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: Funkenlanze_meshyRig|attack_b
internalID: -725341257585236887
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: death
takeName: Funkenlanze_meshyRig|death
internalID: 8241753305621923878
firstFrame: 0
lastFrame: 58
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: Funkenlanze_meshyRig|hit
internalID: -5223465465739027890
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: Funkenlanze_meshyRig|idle
internalID: 6872073163229914391
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: Funkenlanze_meshyRig|walk
internalID: 6401172072802503362
firstFrame: 0
lastFrame: 31
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 &-6986314372875093466
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: -5223465465739027890, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-2465235324230030958
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: 8241753305621923878, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-1537806687701676047
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: 6401172072802503362, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-966094004428431164
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: 681452014891737801}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: 5876526836096243017}
m_Position: {x: 235, y: 65, z: 0}
- serializedVersion: 1
m_State: {fileID: 3263760726816847817}
m_Position: {x: 270, y: 130, z: 0}
- serializedVersion: 1
m_State: {fileID: 2350197593209530011}
m_Position: {x: 305, y: 195, z: 0}
- serializedVersion: 1
m_State: {fileID: -2465235324230030958}
m_Position: {x: 340, y: 260, z: 0}
- serializedVersion: 1
m_State: {fileID: -6986314372875093466}
m_Position: {x: 375, y: 325, z: 0}
- serializedVersion: 1
m_State: {fileID: -1537806687701676047}
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: 681452014891737801}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: funkenlanze_meshy
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -966094004428431164}
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 &681452014891737801
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: 6872073163229914391, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &2350197593209530011
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: -725341257585236887, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &3263760726816847817
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: -1618003157874489814, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &5876526836096243017
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: 422813326786192609, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 44426d34820fe40da91e59336999b8a9
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: 7fc4b2c8899894a4cb7ead6a1f068d4d
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 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 4d6594844ce3d4745ab0f633a576f5ad
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: 3.7 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 2aa4e88af629e4aae8a06d60868fc76f
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:

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: dd29fb09dd4194e018c48d364cef5a28
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: 5.4 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: d7453004059694969b7dbf5f7e300f32
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: 3 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: e168b52d1d8384a719170e5cfad65e4d
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

@ -72,6 +72,9 @@ namespace Luneraria.EditorTools
var manifest = Newtonsoft.Json.Linq.JObject.Parse(File.ReadAllText(Path.Combine(Path.GetDirectoryName(Application.dataPath), "tools/blender/export_manifest.json")));
var models = new List<LuneUnitLibrary.UnitModel>();
var aliases = new List<LuneUnitLibrary.UnitModel>();
// The port's own replacements ("replaces", the Meshy figures of U5.5) come after the
// Godot aliases: g05 is the skinned Funkenlanze of phase 18 and then the Meshy one.
var replacements = new List<LuneUnitLibrary.UnitModel>();
foreach (var asset in manifest["assets"])
{
string id = (string)asset["id"];
@ -84,12 +87,15 @@ namespace Luneraria.EditorTools
bool skinned = (string)asset["kind"] == "skinned";
var model = new LuneUnitLibrary.UnitModel { Id = id, Prefab = prefab, Controller = skinned ? Controller(id, Art + group + "/" + id + ".fbx") : null };
models.Add(model);
string godotId = (string)asset["godot_manifest"]?["id"] ?? (string)asset["replaces"];
string godotId = (string)asset["godot_manifest"]?["id"];
if (skinned && godotId != null && godotId != id)
aliases.Add(new LuneUnitLibrary.UnitModel { Id = godotId, Prefab = prefab, Controller = model.Controller });
string replaced = (string)asset["replaces"];
if (skinned && replaced != null)
replacements.Add(new LuneUnitLibrary.UnitModel { Id = replaced, Prefab = prefab, Controller = model.Controller });
}
// Skinned figures replace the rigid model of the same Godot id.
foreach (LuneUnitLibrary.UnitModel alias in aliases)
foreach (LuneUnitLibrary.UnitModel alias in aliases.Concat(replacements))
{
models.RemoveAll(m => m.Id == alias.Id);
models.Add(alias);

View file

@ -181,6 +181,14 @@ MonoBehaviour:
Neutral: {fileID: 2100000, guid: 5a6942f0733ed4ba0bc5c60732179c3d, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_Funkenlanze
Neutral: {fileID: 2100000, guid: d5a88e3321a884b30bd8a8606b78090d, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_FunkenlanzeLanze
Neutral: {fileID: 2100000, guid: 3e39141c45e974506afc4dc46f6b2ac2, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_Kohlenbeisser
Neutral: {fileID: 2100000, guid: 19529a85bbe534478a40059f9505d897, 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_Funkenlanze
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: 7fc4b2c8899894a4cb7ead6a1f068d4d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 4d6594844ce3d4745ab0f633a576f5ad, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: 2aa4e88af629e4aae8a06d60868fc76f, 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: d5a88e3321a884b30bd8a8606b78090d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

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_FunkenlanzeLanze
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: dd29fb09dd4194e018c48d364cef5a28, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: d7453004059694969b7dbf5f7e300f32, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: e168b52d1d8384a719170e5cfad65e4d, 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: 3e39141c45e974506afc4dc46f6b2ac2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -52,6 +52,9 @@ MonoBehaviour:
- Id: funkenlanze
Prefab: {fileID: 919132149155446097, guid: 652ee682a82c34ff99c2eb11cd218f5e, type: 3}
Controller: {fileID: 9100000, guid: b0e33b10cf38a4aca9b6a03585a5ef2d, type: 2}
- Id: funkenlanze_meshy
Prefab: {fileID: 919132149155446097, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
Controller: {fileID: 9100000, guid: 44426d34820fe40da91e59336999b8a9, type: 2}
- Id: g01
Prefab: {fileID: 919132149155446097, guid: cb652a88669c64f4d98a351c01bf9642, type: 3}
Controller: {fileID: 9100000, guid: 26a63e3ffbfe94d109316067e70ea293, type: 2}
@ -65,8 +68,8 @@ MonoBehaviour:
Prefab: {fileID: 919132149155446097, guid: 841c5b5333cc141a6bde6c22d3dc2884, type: 3}
Controller: {fileID: 9100000, guid: ec68488f0997c4a8185eea30724740ff, type: 2}
- Id: g05
Prefab: {fileID: 919132149155446097, guid: 652ee682a82c34ff99c2eb11cd218f5e, type: 3}
Controller: {fileID: 9100000, guid: b0e33b10cf38a4aca9b6a03585a5ef2d, type: 2}
Prefab: {fileID: 919132149155446097, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
Controller: {fileID: 9100000, guid: 44426d34820fe40da91e59336999b8a9, type: 2}
- Id: g06
Prefab: {fileID: 919132149155446097, guid: 71588361ff1ed4a72a13d46d2f3753be, type: 3}
Controller: {fileID: 9100000, guid: 25806d20be161460284fa5cd0affc84b, type: 2}

View file

@ -34,6 +34,7 @@ namespace Luneraria.UI
readonly Dictionary<string, Texture> _textures = new Dictionary<string, Texture>();
readonly List<string> _queue = new List<string>();
readonly List<Mesh> _baked = new List<Mesh>();
Camera _camera;
readonly Light[] _lights = new Light[3];
@ -179,6 +180,9 @@ namespace Luneraria.UI
// of the same frame would show it too.
model.SetActive(false);
Destroy(model);
foreach (Mesh baked in _baked)
Destroy(baked);
_baked.Clear();
_textures[key] = target;
Rendered++;
PortraitReady?.Invoke(key);
@ -196,10 +200,6 @@ namespace Luneraria.UI
foreach (Transform node in model.GetComponentsInChildren<Transform>(true))
node.gameObject.layer = Layer;
Library.Materials?.Dress(model, 2);
// A figure with a lane copy (U5.5) shows its full mesh: the portrait is a close-up, and
// the LOD choice of a model rendered in the frame it was made in left the card empty.
foreach (LODGroup group in model.GetComponentsInChildren<LODGroup>(true))
group.ForceLOD(0);
ShowDetail(model);
// Skinned figures stand in their idle pose (Godot preview("idle", .4)).
if (entry.Controller != null)
@ -209,9 +209,43 @@ namespace Luneraria.UI
if (idle != null)
idle.SampleAnimation(animator != null ? animator.gameObject : model, Mathf.Min(.4f, idle.length));
}
Bake(model);
return model;
}
/// <summary>
/// Skinned figures are drawn as a baked mesh of their sampled pose (U5.5). With GPU skinning
/// a skinned mesh rendered in the frame it was made in had no deformed vertices yet, and
/// some cards stayed empty. A figure with a lane copy (_LOD0/_LOD1) shows its full mesh.
/// </summary>
void Bake(GameObject model)
{
foreach (LODGroup group in model.GetComponentsInChildren<LODGroup>(true))
UnityEngine.Object.DestroyImmediate(group);
foreach (SkinnedMeshRenderer skinned in model.GetComponentsInChildren<SkinnedMeshRenderer>(true))
{
skinned.enabled = false;
if (skinned.name.EndsWith("_LOD1", StringComparison.Ordinal) || skinned.sharedMesh == null)
continue;
var baked = new Mesh { name = skinned.sharedMesh.name + " (portrait)" };
skinned.BakeMesh(baked, true);
var copy = new GameObject(skinned.name + "_Portrait") { layer = Layer };
copy.transform.SetParent(skinned.transform, false);
copy.AddComponent<MeshFilter>().sharedMesh = baked;
var renderer = copy.AddComponent<MeshRenderer>();
renderer.sharedMaterials = skinned.sharedMaterials;
var block = new MaterialPropertyBlock();
for (int i = 0; i < renderer.sharedMaterials.Length; i++)
{
if (!skinned.HasPropertyBlock())
break;
skinned.GetPropertyBlock(block, i);
renderer.SetPropertyBlock(block, i);
}
_baked.Add(baked);
}
}
/// <summary>
/// The portrait is the close-up of a figure: its surface detail (the family's PBR set in the
/// figure's own space, U5.4) is switched on here, while the field skips it for frame rate.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Binary file not shown.

View file

@ -163,6 +163,17 @@ Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten
| Bild | `screenshots/u5.5-g03/` |
| Commits | `luneraria/u5.5-g03` |
## U5.5 · Funkenlanze (g05)
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30, Asset-Prüfung 24/0 |
| Parität | Fingerabdrücke unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`) |
| Inhalt | Meshy-Figur für `g05` und die Heldin, Lanze als eigenes Modell an der rechten Hand, 110 Credits; Porträts aus gebackenem Netz (behebt leere Karten bei GPU-Skinning) |
| Leistung | Stresstest 38 Funkenlanzen gegen die Phase-18-Figur: Mid 128,6 → 147,6 fps, Karte 112,4 → 128,0 fps. Rohdaten `logs/u5.5-g05/` |
| Bild | `screenshots/u5.5-g05/` |
| Commits | `luneraria/u5.5-g05` |
## 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, dritte Figur).
Stand: 10. Oktober 2026 (U5.5, vierte 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; **Schlackenwacht** `g03` (`luneraria/u5.5-g03`), −8 % Mid / 0 % 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; **Funkenlanze** `g05` mit Lanze als eigenem Modell (`luneraria/u5.5-g05`), +15 % gegenüber der Phase-18-Figur | [U5-VISUAL.md](U5-VISUAL.md) |
QA je Meilenstein: [PORT-QA.md](PORT-QA.md).

View file

@ -494,3 +494,45 @@ Stand 9. Oktober 2026, Zweig `luneraria/u5.5-g03` (auf `luneraria/u5.5-g02`). De
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.
## U5.5 · Vierte Figur: Funkenlanze (g05 und Heldin)
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-g05` (auf `luneraria/u5.5-g03`). Die Fernkämpferin der Glutpakt. Anders als die drei Vorgänger ersetzt sie keine starre Phase-4-Figur, sondern die Skelettfigur aus Phase 18 (`funkenlanze`), die Truppe `g05` und Heldin `held_funkenlanze` gemeinsam nutzen (`Model = "g05"`).
### Neu: Waffe als eigenes Modell
Eine gehaltene Lanze würde das Auto-Rigging an Hand und Bein zugleich binden. Figur und Lanze kommen deshalb getrennt von Meshy (zwei Konzeptbilder, zwei Modelle); `build_figure.py` setzt die Lanze ein (`props` in `figure.json`, `attach_prop`):
- auf ihre Länge skaliert (1,75 m), in der Ruhepose in die Faust des Knochens `RightHand` gelegt: Achse nach vorn und senkrecht zum Handknochen, Spitze voraus, Griff bei 40 % ab dem Ende;
- allein an `RightHand` gebunden (Gewicht 1), so trägt jede Bewegung sie mit; eigenes Material `AI_FunkenlanzeLanze` mit eigenen Karten, eigene Lane-Fassung (3.077 → 599 Dreiecke).
Weitere Änderungen:
- Stoß aus dem Stand (`in_place`): Der Bibliotheksstoß macht einen Ausfallschritt von 0,9 m; die waagrechte Bewegung der Hüfte wird herausgerechnet.
- `LuneUnitLibraryBuilder`: Ersetzungen des Ports (`replaces`) gelten nach den Godot-Zuordnungen; `g05` zeigt damit sicher die Meshy-Figur, die Phase-18-Figur bleibt unter `funkenlanze` im Projekt.
- **HUD-Porträts aus gebackenem Netz** (`LunePortraits.Bake`): Mit GPU-Skinning blieb eine Skelettfigur, die im selben Bild erzeugt und gerendert wird, ohne verformte Eckpunkte; seit dieser Serie waren so die Karten der Schlackenwacht leer. Das Porträt zeichnet jetzt die gebackene Pose als normales Netz (volle Fassung).
### Ablauf und Kosten
Zwei Konzeptbilder (24), Figur und Lanze als Modell (60), Skelett 1,8 m (5), sieben Bewegungen (21): **110 Credits**. Bewegungen: Idle, Kampfgang (1,3 s), Lanzenstoß aus dem Stand (`attack_a`, 1,0 s), Rechtshieb (`attack_b`), Trefferreaktion, aufgeladener Hieb (`ability`, 1,2 s), getroffen nach hinten fallen (`death`, 2,4 s).
`funkenlanze_meshy.fbx`: Körper 20.372 + 4.997, Lanze 3.077 + 599 Dreiecke, 25 Knochen; Export 23 Prüfungen, bytegleich wiederholbar.
### Prüfung
| Test | Ergebnis |
| --- | --- |
| EditMode / PlayMode | 29/29, 14/14, Verify A–I 718/0 |
| Fingerabdrücke | `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`, unverändert |
| Asset-Prüfung / Player-Selbsttest | 24/0, 30/30 |
### Leistung
Stresstest mit 38 Funkenlanzen (`-luneBenchmarkArmy g05`), je drei Läufe (`logs/u5.5-g05/`); verglichen mit der bisherigen Skelettfigur aus Phase 18:
| Ansicht | Phase 18 | Meshy |
| --- | ---: | ---: |
| Mid-Lane nah | 128,6 | 147,6 (+15 %) |
| ganze Karte | 112,4 | 128,0 (+14 %) |
Die Meshy-Figur ist hier schneller: Die Phase-18-Figur hat 24.000 Dreiecke ohne Lane-Fassung.
Bilder: `screenshots/u5.5-g05/` (Figur, vorher/nachher im Spiel, Übersichten, Kampfmomente).

View file

@ -1131,6 +1131,193 @@
]
}
},
{
"id": "funkenlanze_meshy",
"kind": "skinned",
"ok": true,
"checks": [
{
"check": "blender_checks_passed",
"ok": true,
"detail": ""
},
{
"check": "imported",
"ok": true,
"detail": "\"Assets/Luneraria/Art/Characters/funkenlanze_meshy.fbx\""
},
{
"check": "import_rules_applied",
"ok": true,
"detail": ""
},
{
"check": "root_transform_identity",
"ok": true,
"detail": "\"funkenlanze_meshy 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": "\"29045 unity / 29045 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.00005 m; unity (-0.566, 0.000, -0.647) (0.583, 1.801, 1.078)\""
},
{
"check": "skinned_mesh",
"ok": true,
"detail": "4"
},
{
"check": "bone_names Funkenlanze_meshyBody_LOD0",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone Funkenlanze_meshyBody_LOD0",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names Funkenlanze_meshyBody_LOD1",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone Funkenlanze_meshyBody_LOD1",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names FunkenlanzeLanze_LOD0",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone FunkenlanzeLanze_LOD0",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names FunkenlanzeLanze_LOD1",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone FunkenlanzeLanze_LOD1",
"ok": true,
"detail": "\"Root\""
},
{
"check": "generic_avatar",
"ok": true,
"detail": "\"funkenlanze_meshyAvatar\""
},
{
"check": "clips",
"ok": true,
"detail": "[]"
}
],
"facts": {
"triangles": 29045,
"renderers": 4,
"meshes_without_uv_and_tangents": 0,
"degenerate_triangles_dropped": 0,
"bounds_min": [
-0.5657289,
-3.29370877E-08,
-0.646835
],
"bounds_max": [
0.582856357,
1.80054533,
1.07768822
],
"clips": [
{
"name": "ability",
"length": 1.20833337,
"loop": false,
"events": 1
},
{
"name": "attack_a",
"length": 1.0,
"loop": false,
"events": 1
},
{
"name": "attack_b",
"length": 1.04166663,
"loop": false,
"events": 1
},
{
"name": "death",
"length": 2.41666675,
"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": 1.29166663,
"loop": true,
"events": 0
}
]
}
},
{
"id": "glasballiste",
"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 g05 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g05 38, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4
"windows": [
{"view": "overview (zoom 64)", "frames": 2573, "fps": 128.6, "frame_ms_avg": 7.77, "frame_ms_median": 3.21, "frame_ms_p95": 24.19, "frame_ms_p99": 31.30, "frame_ms_max": 44.01, "frames_over_16_7_ms": 418, "of_them_with_simulation_step": 73, "gc_collections": 21, "simulation_ms_per_frame": 0.072, "views_ms_per_frame": 0.211, "ui_ms_per_frame": 0.070, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.59 / median 2.49 / p95 3.52 ms, render thread avg 1.87 / median 1.86 / p95 2.18 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.18 / median 0.25 / p95 21.63 ms
{"view": "mid lane close (zoom 22)", "frames": 1467, "fps": 146.7, "frame_ms_avg": 6.82, "frame_ms_median": 3.01, "frame_ms_p95": 23.09, "frame_ms_p99": 29.90, "frame_ms_max": 36.90, "frames_over_16_7_ms": 160, "of_them_with_simulation_step": 18, "gc_collections": 9, "simulation_ms_per_frame": 0.044, "views_ms_per_frame": 0.191, "ui_ms_per_frame": 0.059, "units_alive_max": 41}
// timings mid lane close (zoom 22): main thread avg 2.12 / median 2.02 / p95 3.09 ms, render thread avg 1.45 / median 1.44 / p95 1.70 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.70 / median 0.19 / p95 20.87 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 g05 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g05 38, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4
"windows": [
{"view": "overview (zoom 64)", "frames": 2557, "fps": 127.7, "frame_ms_avg": 7.83, "frame_ms_median": 3.29, "frame_ms_p95": 25.10, "frame_ms_p99": 31.80, "frame_ms_max": 42.00, "frames_over_16_7_ms": 419, "of_them_with_simulation_step": 37, "gc_collections": 21, "simulation_ms_per_frame": 0.076, "views_ms_per_frame": 0.215, "ui_ms_per_frame": 0.072, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.68 / median 2.51 / p95 3.83 ms, render thread avg 1.90 / median 1.89 / p95 2.23 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.13 / median 0.22 / p95 22.42 ms
{"view": "mid lane close (zoom 22)", "frames": 1483, "fps": 148.2, "frame_ms_avg": 6.75, "frame_ms_median": 3.22, "frame_ms_p95": 21.80, "frame_ms_p99": 30.32, "frame_ms_max": 37.70, "frames_over_16_7_ms": 158, "of_them_with_simulation_step": 10, "gc_collections": 9, "simulation_ms_per_frame": 0.044, "views_ms_per_frame": 0.189, "ui_ms_per_frame": 0.057, "units_alive_max": 41}
// timings mid lane close (zoom 22): main thread avg 2.08 / median 1.99 / p95 3.09 ms, render thread avg 1.44 / median 1.43 / p95 1.68 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.68 / median 0.48 / p95 19.82 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 g05 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g05 38, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4
"windows": [
{"view": "overview (zoom 64)", "frames": 2557, "fps": 127.8, "frame_ms_avg": 7.82, "frame_ms_median": 3.29, "frame_ms_p95": 24.49, "frame_ms_p99": 31.80, "frame_ms_max": 44.71, "frames_over_16_7_ms": 415, "of_them_with_simulation_step": 43, "gc_collections": 21, "simulation_ms_per_frame": 0.074, "views_ms_per_frame": 0.218, "ui_ms_per_frame": 0.071, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.65 / median 2.53 / p95 3.73 ms, render thread avg 1.90 / median 1.88 / p95 2.21 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.16 / median 0.23 / p95 21.71 ms
{"view": "mid lane close (zoom 22)", "frames": 1478, "fps": 147.8, "frame_ms_avg": 6.77, "frame_ms_median": 2.85, "frame_ms_p95": 21.80, "frame_ms_p99": 30.59, "frame_ms_max": 39.59, "frames_over_16_7_ms": 165, "of_them_with_simulation_step": 11, "gc_collections": 9, "simulation_ms_per_frame": 0.045, "views_ms_per_frame": 0.190, "ui_ms_per_frame": 0.056, "units_alive_max": 41}
// timings mid lane close (zoom 22): main thread avg 2.09 / median 2.01 / p95 2.97 ms, render thread avg 1.43 / median 1.41 / p95 1.69 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.69 / median 0.16 / p95 19.88 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 g05 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g05 38, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4
"windows": [
{"view": "overview (zoom 64)", "frames": 2248, "fps": 112.4, "frame_ms_avg": 8.90, "frame_ms_median": 3.96, "frame_ms_p95": 26.11, "frame_ms_p99": 32.10, "frame_ms_max": 40.61, "frames_over_16_7_ms": 407, "of_them_with_simulation_step": 72, "gc_collections": 20, "simulation_ms_per_frame": 0.082, "views_ms_per_frame": 0.231, "ui_ms_per_frame": 0.080, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.86 / median 2.69 / p95 4.10 ms, render thread avg 2.53 / median 2.43 / p95 3.35 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 6.04 / median 1.02 / p95 22.99 ms
{"view": "mid lane close (zoom 22)", "frames": 1303, "fps": 130.3, "frame_ms_avg": 7.67, "frame_ms_median": 3.02, "frame_ms_p95": 25.48, "frame_ms_p99": 35.10, "frame_ms_max": 45.08, "frames_over_16_7_ms": 193, "of_them_with_simulation_step": 29, "gc_collections": 10, "simulation_ms_per_frame": 0.051, "views_ms_per_frame": 0.187, "ui_ms_per_frame": 0.061, "units_alive_max": 41}
// timings mid lane close (zoom 22): main thread avg 2.14 / median 2.03 / p95 3.02 ms, render thread avg 1.79 / median 1.78 / p95 2.09 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.55 / median 0.52 / p95 23.25 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 g05 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g05 38, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4
"windows": [
{"view": "overview (zoom 64)", "frames": 2246, "fps": 112.3, "frame_ms_avg": 8.91, "frame_ms_median": 3.89, "frame_ms_p95": 25.79, "frame_ms_p99": 31.99, "frame_ms_max": 40.51, "frames_over_16_7_ms": 403, "of_them_with_simulation_step": 40, "gc_collections": 21, "simulation_ms_per_frame": 0.080, "views_ms_per_frame": 0.226, "ui_ms_per_frame": 0.078, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.76 / median 2.62 / p95 3.74 ms, render thread avg 2.53 / median 2.45 / p95 3.27 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 6.15 / median 0.99 / p95 22.77 ms
{"view": "mid lane close (zoom 22)", "frames": 1286, "fps": 128.6, "frame_ms_avg": 7.78, "frame_ms_median": 3.30, "frame_ms_p95": 24.61, "frame_ms_p99": 32.40, "frame_ms_max": 42.31, "frames_over_16_7_ms": 208, "of_them_with_simulation_step": 20, "gc_collections": 9, "simulation_ms_per_frame": 0.048, "views_ms_per_frame": 0.199, "ui_ms_per_frame": 0.066, "units_alive_max": 41}
// timings mid lane close (zoom 22): main thread avg 2.21 / median 2.09 / p95 3.30 ms, render thread avg 1.83 / median 1.81 / p95 2.15 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.56 / median 0.54 / p95 22.40 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 g05 x36, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: g05 38, w04 14, e04 11, w06 11, w02 7, e01 4, e02 4, w08 4, w10 4
"windows": [
{"view": "overview (zoom 64)", "frames": 2248, "fps": 112.4, "frame_ms_avg": 8.90, "frame_ms_median": 3.80, "frame_ms_p95": 26.51, "frame_ms_p99": 32.52, "frame_ms_max": 35.90, "frames_over_16_7_ms": 404, "of_them_with_simulation_step": 51, "gc_collections": 20, "simulation_ms_per_frame": 0.082, "views_ms_per_frame": 0.224, "ui_ms_per_frame": 0.077, "units_alive_max": 97},
// timings overview (zoom 64): main thread avg 2.76 / median 2.62 / p95 3.89 ms, render thread avg 2.53 / median 2.43 / p95 3.27 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 6.13 / median 1.00 / p95 23.28 ms
{"view": "mid lane close (zoom 22)", "frames": 1271, "fps": 127.0, "frame_ms_avg": 7.87, "frame_ms_median": 3.09, "frame_ms_p95": 26.19, "frame_ms_p99": 35.81, "frame_ms_max": 44.78, "frames_over_16_7_ms": 211, "of_them_with_simulation_step": 26, "gc_collections": 10, "simulation_ms_per_frame": 0.049, "views_ms_per_frame": 0.205, "ui_ms_per_frame": 0.067, "units_alive_max": 41}
// timings mid lane close (zoom 22): main thread avg 2.31 / median 2.17 / p95 3.29 ms, render thread avg 1.79 / median 1.77 / p95 2.08 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 5.58 / median 0.42 / p95 24.05 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": 815, "seconds": 27.153, "measured_fps": 30.015, "max_steps_per_frame": 21, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "60 fps", "frames": 1626, "seconds": 27.095, "measured_fps": 60.01, "max_steps_per_frame": 11, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "120 fps", "frames": 3225, "seconds": 26.915, "measured_fps": 119.82, "max_steps_per_frame": 7, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "unlimited", "frames": 85389, "seconds": 26.824, "measured_fps": 3183.307, "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": 48968, "fps": 2448.375, "frame_ms_avg": 0.408, "frame_ms_p95": 0.421, "simulation_ms_per_frame": 0.004, "views_ms_per_frame": 0.128, "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: 534 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: 624 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: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 717 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 KiB

View file

@ -1720,6 +1720,52 @@
"death"
]
}
},
{
"id": "funkenlanze_meshy",
"group": "Characters",
"kind": "skinned",
"representative": "U5.5 series: Funkenlanze (g05 and hero) from Meshy, lance as separate model in the right hand",
"source": "tools/meshy/build_figure.py",
"source_root": "unity",
"generator": {
"args": [
"tools/meshy/g05/figure.json"
],
"inputs": [
"tools/meshy/g05/figure.json",
"assets-source/meshy/g05/funkenlanze-skelett.glb",
"assets-source/meshy/g05/funkenlanze-animationen.glb",
"assets-source/meshy/g05/funkenlanze-lanze.glb"
]
},
"replaces": "g05",
"expect": {
"triangles": 29045,
"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

@ -24,7 +24,7 @@ import sys
from pathlib import Path
import numpy as np
from mathutils import Matrix
from mathutils import Matrix, Vector
FPS = 24
CLIP_ORDER = ['idle', 'walk', 'attack_a', 'attack_b', 'hit', 'ability', 'death']
@ -231,6 +231,73 @@ def textures(material, prefix, rule, colours):
return {'glow_share': round(float(mask.mean()), 4), 'palette_gains': gains, 'size': list(found['albedo'].size)}
def attach_prop(arm, prop, source_root, unity_root, figure):
"""A weapon generated as its own Meshy model (the auto rig would bind a held lance to hand and
leg at once): scaled to its length, laid into the fist of the bone in the rest pose (axis along
the figure's forward, perpendicular to the hand bone, tip forward, grip at a share of its
length from the butt) and skinned to that bone alone, so every clip carries it."""
objects = import_glb(source_root / prop['glb'])
mesh = next(o for o in objects if o.type == 'MESH')
for obj in objects:
if obj is not mesh:
bpy.data.objects.remove(obj, do_unlink=True)
bpy.ops.object.select_all(action='DESELECT')
mesh.select_set(True)
bpy.context.view_layer.objects.active = mesh
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
data = mesh.data
coords = np.empty(len(data.vertices) * 3)
data.vertices.foreach_get('co', coords)
coords = coords.reshape(-1, 3)
axis = int(np.argmax(coords.max(0) - coords.min(0)))
low, high = coords[:, axis].min(), coords[:, axis].max()
tip_positive = prop.get('tip', '+') == '+'
# Lance frame: u along the shaft from butt to tip, origin at the grip.
u = np.zeros(3)
u[axis] = 1.0 if tip_positive else -1.0
butt = low if tip_positive else high
scale = prop['length'] / (high - low)
grip = butt + (high - low) * prop.get('grip', 0.4) * (1 if tip_positive else -1)
centre = coords.mean(0)
centre[axis] = grip
bone = arm.data.bones[prop['bone']]
head = arm.matrix_world @ bone.head_local
tail = arm.matrix_world @ bone.tail_local
d = (tail - head).normalized()
forward = Vector((0.0, -1.0, 0.0))
shaft = (forward - d * forward.dot(d)).normalized()
side = d.cross(shaft).normalized()
target = head + d * prop.get('palm', 0.07)
# Rotation taking the lance's own axes (u, two others) to (shaft, d, side).
a = [i for i in range(3) if i != axis]
src = np.zeros((3, 3))
src[:, 0] = u
src[a[0], 1] = 1.0
src[a[1], 2] = 1.0
dst = np.array([shaft[:], d[:], side[:]]).T
rot = dst @ np.linalg.inv(src)
if np.linalg.det(rot) < 0:
dst[:, 2] *= -1
rot = dst @ np.linalg.inv(src)
moved = ((coords - centre) * scale) @ rot.T + np.array(target[:])
data.vertices.foreach_set('co', moved.ravel())
data.update()
mesh.name = data.name = prop['name']
group = mesh.vertex_groups.new(name=prop['bone'])
group.add(list(range(len(data.vertices))), 1.0, 'REPLACE')
modifier = mesh.modifiers.new('Armature', 'ARMATURE')
modifier.object = arm
mesh.parent = arm
mesh.matrix_parent_inverse = Matrix.Identity(4)
material = mesh.material_slots[0].material
maps = textures(material, str(unity_root / prop['textures']), figure['glow'], figure.get('palette', {}))
material.name = prop['material']
for node in list(material.node_tree.nodes):
if node.type not in ('BSDF_PRINCIPLED', 'OUTPUT_MATERIAL'):
material.node_tree.nodes.remove(node)
return mesh, {'name': prop['name'], 'triangles': sum(len(poly.vertices) - 2 for poly in data.polygons), 'textures': maps}
def lane_lod(body, rule):
"""The lane-distance copy (LOD1): the seam copies welded (Meshy splits the mesh along its UV
seams), decimated to the target triangle count, sharp edges from the angle instead of Meshy's
@ -306,7 +373,16 @@ def build(figure_path, source_root, unity_root):
source = bpy.data.actions[spec['source']]
first, last = spec.get('frames', list(source.frame_range))
seconds = spec.get('seconds', (last - first) / FPS)
sampled[name] = (spec, sample_clip(arm_anim, source, (first, last), seconds), (first, last))
samples = sample_clip(arm_anim, source, (first, last), seconds)
if spec.get('in_place'):
# The lunge of a library clip without its step: Hips keeps its horizontal place
# (bone X and Z; the bone points up), so the figure strikes from where it stands.
start = samples[0]['Hips'].to_translation()
for pose in samples:
hips = pose['Hips']
hips[0][3] = start.x
hips[2][3] = start.z
sampled[name] = (spec, samples, (first, last))
for obj in loose:
bpy.data.objects.remove(obj, do_unlink=True)
for action in list(bpy.data.actions):
@ -372,11 +448,18 @@ def build(figure_path, source_root, unity_root):
for node in list(tree.nodes):
if node.type not in ('BSDF_PRINCIPLED', 'OUTPUT_MATERIAL'):
tree.nodes.remove(node)
props = []
for prop in figure.get('props', []):
mesh, facts = attach_prop(arm, prop, source_root, unity_root, figure)
props.append((mesh, prop, facts))
for image in list(bpy.data.images):
bpy.data.images.remove(image)
lod = lane_lod(body, figure['lod']) if 'lod' in figure else None
for mesh, prop, facts in props:
if 'lod' in figure:
facts['lod'] = lane_lod(mesh, dict(figure['lod'], triangles=prop.get('lod_triangles', 600)))
scene.frame_set(0)
return {'clips': clips, 'textures': maps, 'unit': unit, 'lod': lod}
return {'clips': clips, 'textures': maps, 'unit': unit, 'lod': lod, 'props': [facts for _, _, facts in props]}
figure_file, source_dir, unity_dir, save_to = options()

View file

@ -0,0 +1,10 @@
{
"ai_model": "gpt-image-2",
"prompt": "Product concept of only the weapon from 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 spark lance, a long straight dark basalt-black staff banded with worn gold rings and glowing orange seams, a gold collar with small spikes, and a long faceted crystal spearhead glowing molten orange. The whole weapon lies horizontally, tip pointing right, seen exactly from the side, completely visible, centered, no hands, no figure. Plain light grey background, soft even studio light, no shadow, no text.",
"aspect_ratio": "1:1",
"reference_image_urls": [
"@../saumwacht-godot/assets-source/phase3/masters/glutpakt/unit_g05_funkenlanze_icon.png",
"@tools/meshy/g05/ref-g05-funkenlanze.png",
"@assets-source/meshy/g01/kohlenbeisser-konzept.png"
]
}

View file

@ -0,0 +1,10 @@
{
"ai_model": "gpt-image-2",
"prompt": "Full-body concept of the figure 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 Funkenlanze, a slender female lancer warrior of the ember faction in sleek dark basalt-black armor plates edged with worn gold, a visored helmet with two swept-back gold horn crests and a glowing orange visor slit, glowing molten orange seams on the chest core, waist and legs, pointed gold shoulder guards, gold knee and ankle rings. She carries NO weapon: both hands are empty and closed as if gripping a staff. Stylized realism, hand-sculpted detailed forms, 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_g05_funkenlanze_icon.png",
"@tools/meshy/g05/ref-g05-funkenlanze.png",
"@assets-source/meshy/g01/kohlenbeisser-konzept.png"
]
}

View file

@ -0,0 +1,15 @@
{
"input_task_id": "01a12565-6a41-753c-b9b3-78a393f56f66",
"ai_model": "latest",
"should_texture": true,
"enable_pbr": true,
"texture_resolution": "2k",
"should_remesh": true,
"topology": "triangle",
"target_polycount": 3000,
"save_pre_remeshed_model": true,
"target_formats": [
"glb"
],
"multi_view_thumbnails": true
}

View file

@ -0,0 +1,16 @@
{
"input_task_id": "01a12565-5d78-7464-8969-99fb31d79634",
"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": "01a12566-54b4-70c5-9513-4f8afe8bf9f1",
"height_meters": 1.8
}

View file

@ -0,0 +1,4 @@
{
"rig_task_id": "01a12569-545c-7774-8c02-4d006f5b61aa",
"action_ids": [0, 21, 240, 219, 178, 242, 183]
}

View file

@ -0,0 +1,24 @@
{
"id": "funkenlanze_meshy",
"replaces": "g05",
"rig": "assets-source/meshy/g05/funkenlanze-skelett.glb",
"animations": "assets-source/meshy/g05/funkenlanze-animationen.glb",
"material": "AI_Funkenlanze",
"textures": "Assets/Luneraria/Art/Textures/ai-funkenlanze",
"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}},
"props": [{"glb": "assets-source/meshy/g05/funkenlanze-lanze.glb", "name": "FunkenlanzeLanze", "material": "AI_FunkenlanzeLanze",
"textures": "Assets/Luneraria/Art/Textures/ai-funkenlanzelanze", "bone": "RightHand", "tip": "+",
"length": 1.75, "grip": 0.4, "palm": 0.07, "lod_triangles": 600}],
"clips": {
"idle": {"source": "Idle", "loop": true},
"walk": {"source": "Walk_Fight_Forward", "seconds": 1.3, "loop": true},
"attack_a": {"source": "Thrust_Slash", "frames": [4, 30], "seconds": 1.0, "contact_frame": 21, "in_place": true},
"attack_b": {"source": "Right_Hand_Sword_Slash", "frames": [0, 36], "seconds": 1.05, "contact_frame": 14},
"hit": {"source": "Hit_Reaction", "frames": [0, 12], "seconds": 0.5},
"ability": {"source": "Charged_Slash", "seconds": 1.2, "contact_frame": 13},
"death": {"source": "Shot_and_Fall_Backward", "seconds": 2.4}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 KiB

View file

@ -0,0 +1,20 @@
{
"id": "01a12569-bbba-73dc-8cb4-da774f9df42c",
"type": "animate",
"name": "",
"status": "SUCCEEDED",
"created_at": 1791629049056,
"progress": 100,
"started_at": 1791629049064,
"finished_at": 1791629079557,
"expires_at": 1791888279557,
"task_error": null,
"result": {
"animation_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-bbba-73dc-8cb4-da774f9df42c/output/merged_animations.glb",
"animation_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-bbba-73dc-8cb4-da774f9df42c/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": "01a12565-6a41-753c-b9b3-78a393f56f66",
"type": "image-to-image",
"ai_model": "gpt-image-2",
"prompt": "Product concept of only the weapon from 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 spark lance, a long straight dark basalt-black staff banded with worn gold rings and glowing orange seams, a gold collar with small spikes, and a long faceted crystal spearhead glowing molten orange. The whole weapon lies horizontally, tip pointing right, seen exactly from the side, completely visible, centered, no hands, no figure. Plain light grey background, soft even studio light, no shadow, no text.",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1791628767717,
"started_at": 1791628767730,
"finished_at": 1791628800223,
"expires_at": 1791888000223,
"image_urls": [
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/image_01a12565-6a41-753c-b9b3-78a393f56f66_0.png"
],
"consumed_credits": 12
}

View file

@ -0,0 +1,16 @@
{
"id": "01a12565-5d78-7464-8969-99fb31d79634",
"type": "image-to-image",
"ai_model": "gpt-image-2",
"prompt": "Full-body concept of the figure 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 Funkenlanze, a slender female lancer warrior of the ember faction in sleek dark basalt-black armor plates edged with worn gold, a visored helmet with two swept-back gold horn crests and a glowing orange visor slit, glowing molten orange seams on the chest core, waist and legs, pointed gold shoulder guards, gold knee and ankle rings. She carries NO weapon: both hands are empty and closed as if gripping a staff. Stylized realism, hand-sculpted detailed forms, 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": 1791628764527,
"started_at": 1791628764547,
"finished_at": 1791628800843,
"expires_at": 1791888000843,
"image_urls": [
"https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/uploads/image_01a12565-5d78-7464-8969-99fb31d79634_0.png"
],
"consumed_credits": 12
}

View file

@ -0,0 +1,41 @@
{
"id": "01a12566-5a8c-74a4-bda0-f15d41327ef1",
"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": 1791628827822,
"progress": 100,
"started_at": 1791628827834,
"finished_at": 1791628947059,
"expires_at": 1791888147059,
"task_error": null,
"model_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/model.glb",
"model_urls": {
"glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/model.glb",
"pre_remeshed_glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/pre_remeshed_model.glb"
},
"thumbnail_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/preview.png",
"thumbnail_urls": {
"back": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/preview_back.png",
"front": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/preview_front.png",
"left": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/preview_left.png",
"right": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/preview_right.png"
},
"texture_urls": [
{
"base_color": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/texture_0.png",
"metallic": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/texture_0_metallic.png",
"roughness": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/texture_0_roughness.png",
"normal": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-5a8c-74a4-bda0-f15d41327ef1/output/texture_0_normal.png"
}
],
"consumed_credits": 30
}

View file

@ -0,0 +1,41 @@
{
"id": "01a12566-54b4-70c5-9513-4f8afe8bf9f1",
"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": 1791628826400,
"progress": 100,
"started_at": 1791628826411,
"finished_at": 1791629011694,
"expires_at": 1791888211694,
"task_error": null,
"model_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/model.glb",
"model_urls": {
"glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/model.glb",
"pre_remeshed_glb": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/pre_remeshed_model.glb"
},
"thumbnail_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/preview.png",
"thumbnail_urls": {
"back": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/preview_back.png",
"front": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/preview_front.png",
"left": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/preview_left.png",
"right": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/preview_right.png"
},
"texture_urls": [
{
"base_color": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/texture_0.png",
"metallic": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/texture_0_metallic.png",
"roughness": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/texture_0_roughness.png",
"normal": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12566-54b4-70c5-9513-4f8afe8bf9f1/output/texture_0_normal.png"
}
],
"consumed_credits": 30
}

View file

@ -0,0 +1,25 @@
{
"id": "01a12569-545c-7774-8c02-4d006f5b61aa",
"type": "rig",
"name": "",
"status": "SUCCEEDED",
"created_at": 1791629025839,
"progress": 100,
"started_at": 1791629025845,
"finished_at": 1791629038653,
"expires_at": 1791888238653,
"task_error": null,
"result": {
"rigged_character_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Character_output.fbx",
"rigged_character_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Character_output.glb",
"basic_animations": {
"walking_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Animation_Walking_withSkin.glb",
"walking_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Animation_Walking_withSkin.fbx",
"walking_armature_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Animation_Walking_withSkin_armature.glb",
"running_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Animation_Running_withSkin.glb",
"running_fbx_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Animation_Running_withSkin.fbx",
"running_armature_glb_url": "https://assets.meshy.ai/c8cdc243-64e1-4e9d-9fa1-3bd5ed731d84/tasks/01a12569-545c-7774-8c02-4d006f5b61aa/output/Animation_Running_withSkin_armature.glb"
}
},
"consumed_credits": 5
}