1. Dashboard
  2. Forum
  3. Filebase
  4. Lexikon
  5. Artikel
  6. Spieletest
  7. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  8. Zur Transport Fever Community
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Filebase-Eintrag
  • Lexikon
  • Artikel (Bewertungssystem)
  • Erweiterte Suche
  1. WiSim Welt
  2. Forum
  3. Spiele
  4. Cities in Motion 2
  5. Modding und Erweiterungen für CiM2
  6. Modding-Allgemein

Modifizierbarkeit von CiM2

  • lukiono
  • 3. April 2013 um 15:17
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 11. April 2013 um 18:35
    • #41

    Sehr komplex, wenn überhaupt machbar.
    Wie gesagt, jedes Bundle soll angeblich nur zum dem Projekt passen, wie genau so ein Bundle aufgebaut ist, konnte ich bis jetzt nicht herausfinden. UnityEngine scheint dafür extra Native Calls zu machen, das man das nicht so einfach herausfinden kann. Mal schauen ob die Unity Version eine Demo beinhaltet so das ich mal ein kleines Bundle erstellen kann um die Struktur zu erraten...

    -edit-
    Na Toll: "(disabled) Activate a free 30-day trial of Unity Pro"

    -edit2-
    CIM2.exe kann durch eine player_win.exe (Unity Player) ersetzt werden... Hmm.

    2 Mal editiert, zuletzt von eis_os (11. April 2013 um 20:03)

    • Zitieren
  • immi
    Gast
    • 13. April 2013 um 11:19
    • #42
    Zitat von immi

    werd die Zeit vorerst wohl ins spielen investieren :D


    ok ich zieh die Aussage zurück :p

    das .bundle Format scheint mir auf den zweiten Blick vielleicht doch nicht so schwer zu ergründen wie anfangs gedacht. Das hübsche ist, dass in der Datei selber die Information vermerkt ist, wie das Format der einzelnen Assets aussieht.

    Spoiler anzeigen
    Code
    [@ 0x1c1a] Typ: 1/0x1   'GameObject'
        GameObject:Base size:-1 idx:0 unk:0 unk:3 flag:0x8000
          vector:m_Component size:-1 idx:1 unk:0 unk:1 flag:0x10041
            Array:Array size:-1 idx:2 unk:1 unk:1 flag:0x10041
              SInt32:size size:4 idx:3 unk:0 unk:1 flag:0x10041
              pair:data size:12 idx:4 unk:0 unk:1 flag:0x10041
                SInt32:first size:4 idx:5 unk:0 unk:1 flag:0x10041
                PPtr<Component>:second size:8 idx:6 unk:0 unk:1 flag:0x10041
                  SInt32:m_FileID size:4 idx:7 unk:0 unk:1 flag:0x10041
                  SInt32:m_PathID size:4 idx:8 unk:0 unk:1 flag:0x10041
          UInt32:m_Layer size:4 idx:9 unk:0 unk:1 flag:0x0
          string:m_Name size:-1 idx:10 unk:0 unk:1 flag:0x8000
            Array:Array size:-1 idx:11 unk:1 unk:1 flag:0x4001
              SInt32:size size:4 idx:12 unk:0 unk:1 flag:0x1
              char:data size:1 idx:13 unk:0 unk:1 flag:0x1
          UInt16:m_Tag size:2 idx:14 unk:0 unk:1 flag:0x0
          UInt8:m_IsActive size:1 idx:15 unk:0 unk:1 flag:0x0
    Alles anzeigen

    Offen ist allerdings die Frage wie/ob man dem Spiel überhaupt eigene Assets untermogeln kann. Lädt es einfach alle .bundle Dateien in Reichweite? Oder ist die Information darüber irgendwo abgelegt?
    Der Eingangsposter erwähnt irgendeine "Lademethode": Weiss irgendjemand (er selber vielleicht :) ), was damit gemeint ist?

    • Zitieren
  • Duplicate SimComNet
    Schüler
    Beiträge
    84
    • 13. April 2013 um 11:59
    • #43

    eis_os hats komplett ignoriert und sich später selber wieder drauf bezogen. Entweder taugt die Info nichts oder er mag mich einfach nur nicht.
    Vielleicht hilft es aber trotzdem:

    Unity selbst benutzt folgendes:
    Unity - Loading resources from AssetBundles
    (im oberen Abschnitt, die drei Methoden)
    In diesem Zusammenhang möchte ich noch mal auf meinen ersten Unity Link hinweisen:
    Unity - AssetBundles (Pro only)
    Wo man unter den Bildern (die erklären was diese Bundle's eigentlich sind) Links zu weiteren Informationen findet.

    Was mich etwas irretiert, dass demnach ja nur weitere Asset-Dateien (also wiederum Archive) in den Bundles stecken sollen. Danach sieht es aber irgendwie nicht aus. Wenn man jedenfalls so ist, kann man diese asset-Dateien mit dem Tool was eis_os schon mal gezeigt hat (UnityAssetsExplorer) durch aus entpacken. Ob man jetzt was dazufügen kann weiss ich nicht. Hab auch leider kein anderes Unity-Spiel wo man das probieren könnte. Den das einzige was ich besitze und so offene Dateien hat, hat dadrin so undurchsichtige Dateiformate...

    - Kommentar-
    Wenn wir schon bei Merkwürdigkeiten sind.
    Wieso ist das (angeblich) für CO so ein mega Problem Mods zu laden und wird das alles auf Unity geschoben? Ein blick auf KSP (Unity - AssetBundles (Pro only)) sagt mir, das liegt nicht an Unity sondern ist Vorsatz. Ich finde, wenn man das schon macht, sollte man auch dazu stehen. Und nicht so komische Kommentare bringen wie "Gebt uns das nötige Geld". Da kann man nur hoffen, dass sie mit der Aussage auf die Fresse fliegen, ich fürchte nämlich die haben gedacht, keiner wird drauf reagieren oder direkt 20 Euro anbieten. (Das wollte ich mal los werden).
    - Kommentar Ende -

    "Life? Don't talk to me about life!" Marvin. (Hitchhiker's Guide To The Galaxy)
    "Comic Sans MS ist der Kevin unter den Schriftarten." Julius von Heyl.

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 13. April 2013 um 12:08
    • #44

    Das ist das serialisierte Container Format der C# Objekte, das steckt etwas tiefer im Bundle.
    Ein Bundle wird in der Unity Engine C Code geladen. Ein riesiger Broken Code. Ich bin eigentlich daran das umhüllende Container Format zu verstehen.

    Das Bundle hat einen Header, UnityRaw, dann kommt in big endian format die Größe. Scheinbar aber nicht aligned, was mich doch sehr verwundert.
    Dann die jeweilige genutzte Unity Version. Das wird auch von Unity abgefragt, bei falscher Version meckert er mit hard codieren Strings.
    Außerdem checkt der Code auch die Custom irgendetwas Strings.

    Eine Art Header, und dann die Chunks.
    Jedes Ingame C# Objekt hat einen bestimmten Typ. Unity + CIM2 haben keine Script Schicht mehr dazwischen, alles an Daten wird in die C# Objekte geladen. Sogar die UI besteht aus solchen Komponenten.

    Unity Script Reference – search

    Deswegen kann man auch kein bundle in ein anderes Spiel laden, das geht nicht weil ja die richtigen C# Objekte zum Aufnehmen der Daten fehlen. Der Unity Free Editor sagt die Datei wäre komprimiert, was so aber auch nicht stimmen kann. (Nicht alle Bundles haben die selbe Unity Version)

    Die normalen .assert Dateien sind viel einfacher aufgebaut, haben aber nicht sehr viel interessantes. Es gibt dafür den Unity Assets Explorer.

    -edit-
    SimComet:
    Weil CO im Endeffekt das Spiel mit Unity zusammengebaut hat und sich nicht um Modifikationen gekümmert hat. CIM2 ist für CO ein monolithisches Spiel, die Drücken auf "Build" und es kommt ein komplettes CIM2 mit allen Sachen raus.
    Der geplante Rules Patch der da kommen soll wird wohl einfach nach dem Bundle Laden einfach die Statistiken überschreiben.

    -edit2-

    Die Bundle Dateien werden einfach alle geladen per BundlesManager. Kann man auch sehen wenn CIM2.exe mit -console startet :)

    -edit3-
    SimComet: Ich hab mich in die Doku eingelesen, aber wie gesagt Unity Free erstellt keine Bundles und eine Unity Pro Test Version konnte ich nicht installieren. (Bei der Aktivierung war der Punkt deaktiviert)
    Du kannst aber gerne Versuchen diese irgendwie in Unity Pro/Free zu laden.

    mainData könnte auch wichtig sein, dort ist Game.unity, Intro.unity usw. angeben.

    4 Mal editiert, zuletzt von eis_os (13. April 2013 um 13:23)

    • Zitieren
  • immi
    Gast
    • 13. April 2013 um 13:43
    • #45

    bevor wir alle das gleiche zehnmal entschlüsseln, hier ist was ich bisher habe
    format doku steckt ganz am anfangs des scripts

    //edit

    Zitat von SimComet

    Unity selbst benutzt folgendes:
    Unity - Loading resources from AssetBundles
    (im oberen Abschnitt, die drei Methoden)


    das sind die Möglichkeiten um von innerhalb der UnityEngine AssetBundles nachzuladen. Aber bei CiM2 haben wir ja im Gegensatz zu CiM gar keine Möglichkeit irgendwie Code im Context der GameEngine auszuführen. ... soweit ich das sehe

    thx, für den Link zu dem AssetExplorer, der war mir bisher entgangen

    Zitat von SimComet

    Wieso ist das (angeblich) für CO so ein mega Problem Mods zu laden


    kostet halt Entwicklungszeit. Und wenn wir uns anzuschauen, wie unfertig unpoliert das Game sowieso schon released wurde, erklärt das warum für Mods keine Zeit mehr blieb ;)
    Und wenn ich lese dass zZ nur noch 2 Leute an CiM2 werkeln(davon 1 Programmierer) dann ist das Team sogar noch viel kleiner als ich gedacht hatte
    Wobei ich die Aussage etwas anzweifel, dass man 6Monate benötigen würde, für ein Tool was eigene Objekte lädt.


    Zitat von eis_os

    Die Bundle Dateien werden einfach alle geladen per BundlesManager. Kann man auch sehen wenn CIM2.exe mit -console startet


    wer ist der BundlesManager? Wo sitzt der? Und kann ich ihm sagen er soll 'immis_objekt.bundle' laden?

    3 Mal editiert, zuletzt von immi (13. April 2013 um 15:05)

    • Zitieren
  • rovapasi
    Gast
    • 13. April 2013 um 14:01
    • #46
    Zitat von immi

    Offen ist allerdings die Frage wie/ob man dem Spiel überhaupt eigene Assets untermogeln kann. Lädt es einfach alle .bundle Dateien in Reichweite? Oder ist die Information darüber irgendwo abgelegt?

    Ich denke, das Spiel lädt alle Bundles. Ob diese Nutzbar sind, wird dem Spiel über Steam mitgeteilt. So haben ja alle das erste DLC auf Ihrer Platte, können es aber nur dann selber nutzen, wenn es in Steam aktiviert ist.

    Wenn das Spiel ohne Steam geladen wird, kann das DLC auch genutzt werden, wenn es nicht gekauft wurde. Es ist ja bereits auf dem Rechner vorhanden.

    EDIT: Das könnte ein anderes Problem bedeuten. Wenn die Bundles über Steam "freigeschaltet" werden, könnte es ein Problem werden, Mods zu aktivieren - selbst wenn es uns gelingen sollte diese zu erstellen. Denn sollte das per Steam über eine "das darf das Spiel laden" Liste gelöst sein, könnte es sein, dass Mods nur mit "no-Steam" Versionen funktionieren. Somit müsste man das Spiel illegaler Weise von Steam "befreien" um Mods nicht nur zu laden, sondern auch zu nutzen.

    2 Mal editiert, zuletzt von rovapasi (13. April 2013 um 14:19)

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 13. April 2013 um 16:01
    • #47

    Nein, es ist kein Problem, das Steam System ist sehr einfach gehalten und wird das Bundle Laden kein Problem bereiten.
    Dein CIM2 lädt die DLC Daten sowieso, bauen darfst es einfach nicht. Ich kann dir auch ein Savegame geben mit einen vollen Depot ... :rolleyes:

    Der BundlesManager lädt alle Bundles, es gibt keinen Check. (bzw. nur das was die Unity Engine vielleicht macht, das habe ich noch nicht analysiert.

    -edit-
    Hmm, das Python hier mag nicht funktionieren, sagt es wäre keine UnityRaw Dateien... huh,
    Mal ein byte prefix setzen, dann geht der Check auch, ok, Python 2.7 funktioniert, hatte den falschen PATH gesetzt zu Python3


    -edit2-
    In \Unity\Editor\Data\Tools gibt es die Datei binary2text.exe die ein paar Infos zu .assets Dateien liefern kann, aber nix für bundle
    binary2text.exe funktioniert bei level* und mainData

    6 Mal editiert, zuletzt von eis_os (13. April 2013 um 17:48)

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 13. April 2013 um 19:32
    • #48

    Da ja hier genölt wurde, ich hätte mich mit Unity nicht auseinander gesetzt, brauchbare Ergebnisse gibt es bis jetzt nicht.

    Ein neues Unity Projekt aufmachen, ein Verzeichnis "Editor" erstellen, dort eine neue C# Datei mit diesen Inhalt:
    In UI gibt es dann einen neuen Menüpunkt, die Informationen landen in der Console.

    Code
    using UnityEngine;
    using System.Collections;
    
    
    using UnityEditor;
    using UnityEditorInternal;
    using System.IO;
    using System.Reflection;
    
    
    public class eisUncompressAssert : MonoBehaviour
    {
        [MenuItem("Assets/Dump Bundle %u")]
        static void Unpack ()
        {
            string file = EditorUtility.OpenFilePanel ("Select bundle file to unpack", "", "bundle");
            if (file.Length == 0)
                return;
    		AssetBundle bundle;
    		var wwwoobj = new WWW ("file:///" + file);
    
    		bundle = wwwoobj.assetBundle;
    
            Object[] objs1 = bundle.LoadAll();
    		foreach (Object obj in objs1) {
    			System.Type type = obj.GetType ();
    			string itemdata = "";
    			PropertyInfo[] properties = type.GetProperties();
    			itemdata = "Name: "+obj.name+"\n";
    			itemdata += "   Instanceid: "+obj.GetInstanceID() +"\n";
    			itemdata += "   HashCode: "+obj.GetHashCode() +"\n"; 
    			itemdata += "   Type: "+type.ToString() +"\n"; 
    			foreach (System.Reflection.PropertyInfo prop in properties) {
    				itemdata += "   Prop: "+prop.Name +"\n"; 
    			}
    			Debug.Log(itemdata);
    		}
    		bundle.Unload(true);
        }
     }
    Alles anzeigen
    • Zitieren
  • ArkenbergeJoe
    Gast
    • 14. April 2013 um 22:17
    • #49

    Also soweit, wie ich Kenntnisse hab, hab ich auch mal in den Bundles gebuddelt. Die Programmanweisungen sind für mich "Böhmische Dörfer", aber ich habe Hinweise auf gleiche Dateien wie in CIM1 gefunden. So gibt es bei den Menüs genauso _ho.dd und _se.dds als Grafik für die UIs. Noch garnicht hab ich irgendwelche .obj und anderes gefunden. Wohlmöglich gibt es hier eine TGI-Struktur, die Subdateien haben keine Namen mehr, sondern nur noch HEX-Nummern.
    Zumindest sind bei SC4 die .dat-Dateien so aufgebaut.

    • Zitieren
  • immi
    Gast
    • 14. April 2013 um 23:35
    • #50

    wenn noch Puzzlebedarf besteht ;)

    ich hänge mal eine extrahierte Texture an, bestehend aus Header + Bilddaten (pavilion-lod1.bin*). Die Erklärung für die Headerdaten haben wir, häng ich ebenfalls an (pavilion-lod1_header.txt)
    Die Bilddaten beginnen ab Offset 0x4C. Die Frage ist jetzt a) in was für einem Format sind die Bilddaten und b) wie kann man die Daten in eine "korrekte" Bilddatei reinwurschteln.

    Was das Format angeht liegt die Vermutung sehr nahe, dass es sich um DDS handelt. Wenn man jetzt also zu den Bilddaten einen hübschen DDS-Dateiheader dazubastelt, sollte das eigentlich als Bild im Bildbarbeitungsprogramm auftauchen ...
    Aber irgendwie wollte mir das nich gelingen.

    fröhliches puzzeln. Wer die Lösung findet kriegt nen Keks


    *) meh, Dateiendung nicht erlaubt. Deswegen als pavilion-lod1.bin.txt verkleidet :)

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 15. April 2013 um 07:17
    • #51

    Unity:

    Kein Wunder das sich Unity weigert mir die Daten als PNG zu extrahieren, da diese als nicht lesbar markiert sind. *grumel*
    Vielleicht hilft es den CIM2 Bundle Loader nachzubauen...
    Man kann die Daten (Objekte) in einem Bundle clonen, dabei geht bei mir aber noch die Zuordnung zwischen den einzelnen Teilen Kaputt.


    Der Unity Assets Expolorer macht aus TEX Daten Texturen, vielleicht hilft das.

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 15. April 2013 um 19:43
    • #52

    Also laut meinen Unity Script sollte die Textur eine DXT1 Format haben.

    Spoiler anzeigen
    Code
    Name: pavillion-lod1
       Instanceid: 5846
       HashCode: 5846
       Type: UnityEngine.Mesh
       Prop: vertices= UnityEngine.Vector3[]
       Prop: normals= UnityEngine.Vector3[]
       Prop: tangents= UnityEngine.Vector4[]
       Prop: uv= UnityEngine.Vector2[]
       Prop: uv2= UnityEngine.Vector2[]
       Prop: uv1= UnityEngine.Vector2[]
       Prop: bounds= Center: (0.0, 5.0, 0.0), Extents: (5.0, 5.0, 5.0)
       Prop: colors= UnityEngine.Color[]
       Prop: colors32= UnityEngine.Color32[]
       Prop: triangles= System.Int32[]
       Prop: vertexCount= 686
       Prop: subMeshCount= 1
       Prop: boneWeights= UnityEngine.BoneWeight[]
       Prop: bindposes= UnityEngine.Matrix4x4[]
       Prop: name= pavillion-lod1
       Prop: hideFlags= 0
    
    
    Name: pavilion-lod1
       Instanceid: 5858
       HashCode: 5858
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 9
       Prop: format= DXT1
       Prop: width= 256
       Prop: height= 256
       Prop: filterMode= Trilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= pavilion-lod1
       Prop: hideFlags= 0
    Textureformat: 10
    
    
    Name: pavilion-lod1-Material #27
       Instanceid: 5894
       HashCode: 5894
       Type: UnityEngine.Material
       Prop: shader=  (UnityEngine.Shader)
       Prop: color= RGBA(0.000, 0.000, 0.000, 0.000)
       Prop: mainTexture= pavilion-lod1 (UnityEngine.Texture2D)
       Prop: mainTextureOffset= (0.0, 0.0)
       Prop: mainTextureScale= (1.0, 1.0)
       Prop: passCount= 1
       Prop: renderQueue= 2000
       Prop: name= pavilion-lod1-Material #27
       Prop: hideFlags= 0
    
    
    Name: pavilion-lod1_c
       Instanceid: 5868
       HashCode: 5868
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 9
       Prop: format= DXT1
       Prop: width= 256
       Prop: height= 256
       Prop: filterMode= Trilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= pavilion-lod1_c
       Prop: hideFlags= 0
    Textureformat: 10
    
    
    Name: pavilion-lod1_s
       Instanceid: 5862
       HashCode: 5862
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 9
       Prop: format= DXT1
       Prop: width= 256
       Prop: height= 256
       Prop: filterMode= Trilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= pavilion-lod1_s
       Prop: hideFlags= 0
    Textureformat: 10
    
    
    Name: pavillion-lod2
       Instanceid: 5840
       HashCode: 5840
       Type: UnityEngine.Mesh
       Prop: vertices= UnityEngine.Vector3[]
       Prop: normals= UnityEngine.Vector3[]
       Prop: tangents= UnityEngine.Vector4[]
       Prop: uv= UnityEngine.Vector2[]
       Prop: uv2= UnityEngine.Vector2[]
       Prop: uv1= UnityEngine.Vector2[]
       Prop: bounds= Center: (0.0, 5.0, 0.0), Extents: (5.0, 5.0, 5.0)
       Prop: colors= UnityEngine.Color[]
       Prop: colors32= UnityEngine.Color32[]
       Prop: triangles= System.Int32[]
       Prop: vertexCount= 204
       Prop: subMeshCount= 1
       Prop: boneWeights= UnityEngine.BoneWeight[]
       Prop: bindposes= UnityEngine.Matrix4x4[]
       Prop: name= pavillion-lod2
       Prop: hideFlags= 0
    
    
    Name: pavilion-lod2
       Instanceid: 5834
       HashCode: 5834
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 7
       Prop: format= DXT1
       Prop: width= 64
       Prop: height= 64
       Prop: filterMode= Trilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= pavilion-lod2
       Prop: hideFlags= 0
    Textureformat: 10
    
    
    Name: pavilion-lod2-Material #27
       Instanceid: 5814
       HashCode: 5814
       Type: UnityEngine.Material
       Prop: shader=  (UnityEngine.Shader)
       Prop: color= RGBA(0.000, 0.000, 0.000, 0.000)
       Prop: mainTexture= pavilion-lod2 (UnityEngine.Texture2D)
       Prop: mainTextureOffset= (0.0, 0.0)
       Prop: mainTextureScale= (1.0, 1.0)
       Prop: passCount= 1
       Prop: renderQueue= 2000
       Prop: name= pavilion-lod2-Material #27
       Prop: hideFlags= 0
    
    
    Name: pavilion-lod2_c
       Instanceid: 5824
       HashCode: 5824
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 7
       Prop: format= DXT1
       Prop: width= 64
       Prop: height= 64
       Prop: filterMode= Trilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= pavilion-lod2_c
       Prop: hideFlags= 0
    Textureformat: 10
    
    
    Name: pavilion-lod2_s
       Instanceid: 5832
       HashCode: 5832
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 7
       Prop: format= DXT1
       Prop: width= 64
       Prop: height= 64
       Prop: filterMode= Trilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= pavilion-lod2_s
       Prop: hideFlags= 0
    Textureformat: 10
    
    
    Name: Pavillion
       Instanceid: 5904
       HashCode: 5904
       Type: UnityEngine.GameObject
       Prop: isStatic= False
       Prop: transform= Pavillion (UnityEngine.Transform)
       Prop: rigidbody= null
       Prop: camera= null
       Prop: light= null
       Prop: animation= null
       Prop: constantForce= null
       Prop: renderer= Pavillion (UnityEngine.MeshRenderer)
       Prop: audio= null
       Prop: guiText= null
       Prop: networkView= null
       Prop: guiElement= null
       Prop: guiTexture= null
       Prop: collider= null
       Prop: hingeJoint= null
       Prop: particleEmitter= null
       Prop: layer= 10
       Prop: active= False
       Prop: tag= Untagged
       Prop: gameObject= Pavillion (UnityEngine.GameObject)
       Prop: name= Pavillion
       Prop: hideFlags= 0
    
    
    Name: Pavillion
       Instanceid: 5826
       HashCode: 5826
       Type: UnityEngine.Transform
       Prop: position= (0.0, 0.0, 0.0)
       Prop: localPosition= (0.0, 0.0, 0.0)
       Prop: eulerAngles= (0.0, 0.0, 0.0)
       Prop: localEulerAngles= (0.0, 0.0, 0.0)
       Prop: right= (1.0, 0.0, 0.0)
       Prop: up= (0.0, 1.0, 0.0)
       Prop: forward= (0.0, 0.0, 1.0)
       Prop: rotation= (0.0, 0.0, 0.0, 1.0)
       Prop: localRotation= (0.0, 0.0, 0.0, 1.0)
       Prop: localScale= (1.0, 1.0, 1.0)
       Prop: parent= null
       Prop: worldToLocalMatrix= 1.00000	0.00000	0.00000	0.00000
    0.00000	1.00000	0.00000	0.00000
    0.00000	0.00000	1.00000	0.00000
    0.00000	0.00000	0.00000	1.00000
    
    
       Prop: localToWorldMatrix= 1.00000	0.00000	0.00000	0.00000
    0.00000	1.00000	0.00000	0.00000
    0.00000	0.00000	1.00000	0.00000
    0.00000	0.00000	0.00000	1.00000
    
    
       Prop: root= Pavillion (UnityEngine.Transform)
       Prop: childCount= 0
       Prop: lossyScale= (1.0, 1.0, 1.0)
       Prop: transform= Pavillion (UnityEngine.Transform)
       Prop: rigidbody= null
       Prop: camera= null
       Prop: light= null
       Prop: animation= null
       Prop: constantForce= null
       Prop: renderer= Pavillion (UnityEngine.MeshRenderer)
       Prop: audio= null
       Prop: guiText= null
       Prop: networkView= null
       Prop: guiElement= null
       Prop: guiTexture= null
       Prop: collider= null
       Prop: hingeJoint= null
       Prop: particleEmitter= null
       Prop: particleSystem= null
       Prop: gameObject= Pavillion (UnityEngine.GameObject)
       Prop: active= False
       Prop: tag= Untagged
       Prop: name= Pavillion
       Prop: hideFlags= 0
    
    
    Name: pavillion
       Instanceid: 5932
       HashCode: 5932
       Type: UnityEngine.Mesh
       Prop: vertices= UnityEngine.Vector3[]
       Prop: normals= UnityEngine.Vector3[]
       Prop: tangents= UnityEngine.Vector4[]
       Prop: uv= UnityEngine.Vector2[]
       Prop: uv2= UnityEngine.Vector2[]
       Prop: uv1= UnityEngine.Vector2[]
       Prop: bounds= Center: (0.0, 5.0, 0.0), Extents: (5.0, 5.0, 5.0)
       Prop: colors= UnityEngine.Color[]
       Prop: colors32= UnityEngine.Color32[]
       Prop: triangles= System.Int32[]
       Prop: vertexCount= 1216
       Prop: subMeshCount= 1
       Prop: boneWeights= UnityEngine.BoneWeight[]
       Prop: bindposes= UnityEngine.Matrix4x4[]
       Prop: name= pavillion
       Prop: hideFlags= 0
    
    
    Name: pavillion-Material #27
       Instanceid: 5918
       HashCode: 5918
       Type: UnityEngine.Material
       Prop: shader=  (UnityEngine.Shader)
       Prop: color= RGBA(0.000, 0.000, 0.000, 0.000)
       Prop: mainTexture= park-props (UnityEngine.Texture2D)
       Prop: mainTextureOffset= (0.0, 0.0)
       Prop: mainTextureScale= (1.0, 1.0)
       Prop: passCount= 1
       Prop: renderQueue= 2000
       Prop: name= pavillion-Material #27
       Prop: hideFlags= 0
    Alles anzeigen


    -edit-
    Der ObjExporter auf dem Unity Wiki erstellt keine richtigen Objekte wenn ich es mit dem UnityEngine.Mesh pavillion Objekt füttere.

    Einmal editiert, zuletzt von eis_os (15. April 2013 um 20:59)

    • Zitieren
  • mediziner
    Administrator
    Reaktionen
    2
    Beiträge
    1.924
    Filebase Einträge
    10
    Einträge
    4
    • 15. April 2013 um 21:07
    • Offizieller Beitrag
    • #53

    Ich hab den passenden Header für die Datei gefunden :)

    Die ersten 72 Bytes sind von der hier hochgeladenen Datei gehören allerdings nicht zum Bild. Um die Datei wieder zusammenzusetzen sind also die ersten 72 gegen die 126 Bytes aus dem Anhang hier zu ersetzen.

    Die Dokumentation des DDS-Headers gibt es übrigens hier: http://msdn.microsoft.com/en-us/library/…2(v=vs.85).aspx

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
    • Zitieren
  • immi
    Gast
    • 15. April 2013 um 21:34
    • #54

    eis_os
    hübsch. Versteh ich das richtig dass mit "Unity Script", du sowas in der Art meinst, wie du weiter oben gepostet hast? Was du dann im Unity Editor laufen lässt, um die Infos aus den Assets rauszufiltern?
    kannst du vielleicht auch noch mal die Texture 'park-props_n' (auch in Buildings07) beleuchten? Die hat nen anderes Textureformat(0xC). Die Vermutung DXT3 liegt ja nahe, aber ...

    Was ist an dem exportierten Objekt verkehrt? Sieht doch auf den ersten Blick gut aus.

    mediziner
    supi. Keks bitte bei der Administration abholen :p


    //edit:
    werd die nächste Zeit dem Internet fern sein, drum häng ich mal die letzte Version meines scripts an
    mittels: python asbundle.py -data -id xxxx datei.bundle kann das genau die Ausgabe erzeugen wie oben bei der Texture gesehen

    //edit2:
    noch nen Appetithappen zum Abend (Kekse hab ich nich ;) )
    wer sich noch über die zu kleinen Depots ärgert, schaut sich mal in der Datei Player.bundle im hex editor die Bytes an den folgenden Offsets an

    Code
    Bus Depot 1:  0x724eb0
    Tram Depot 1: 0x759564
    Metro Depot 1: 0x78be0

    2 Mal editiert, zuletzt von immi (15. April 2013 um 22:09)

    • Zitieren
  • mediziner
    Administrator
    Reaktionen
    2
    Beiträge
    1.924
    Filebase Einträge
    10
    Einträge
    4
    • 15. April 2013 um 22:01
    • Offizieller Beitrag
    • #55

    @immi: nicht mal selber die versprochenen Keks austeilen :S

    Die Bump Map, die du meinst ist im DXT3-Format. Die Farben sind komplett anders ... grau statt violett

    die anderen Texturen des Pavillions sind DXT1

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 15. April 2013 um 22:36
    • #56

    Ja, ich nutze die C# Interfaces + Reflection, d.h. ich nutze die RohDaten und die Sprachfeatures von C#.
    Unity Free kann zwar keine Bundles erstellen, laden kann es aber die Unity Basis Objekte daraus, aber eher schlecht als recht.
    Über einen Dump mit noch mehr Infos hab ich die Mesh Daten gesehen und hab Sie dann exportiert. Die Meshes konnte ich bis jetzt leider noch nicht in den Editor bringen,
    geschweige denn irgendwelche Texturen oder sonstige Objekte.

    Bei den Waverfront obj Dateien die mein Script gerade erstellt sind die Dächer alle kaputt. Hab auch mal die Vehicles.bundle getestet, selbes Problem. Autos ohne Dach.
    Irgendwie funktionieren die Verbindungen auch unter den einzelnen Objekte nicht richtig. (C# Pointer) Daher stolpert mein Script auch von einenm try catch block zum nächsten.

    • Zitieren
  • immi
    Gast
    • 15. April 2013 um 23:05
    • #57

    ja gut das Dach, KInderkrankheiten. aber sind immerhin schon halbwegs brauchbare Daten ;)
    Das Meshformat sieht sowieso arg komplex aus(im Vergleich zu CiM1), da hab ich noch gar nicht weiter reingeschaut.
    Mein erster anvisierte Meilenstein wären erstmal Repaints. Dadurch das man über die <GameObjects> Mesh und Material ziemlich flexibel verknüpfen kann, _hoff_ ich mal dass das mit relativ wenig Aufwand machbar ist.

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 16. April 2013 um 18:51
    • #58
    Code
    Name: park-props_n
       Instanceid: 5164
       HashCode: 5164
       Type: UnityEngine.Texture2D
       Prop: mipmapCount= 10
       Prop: format= DXT5
       Prop: width= 512
       Prop: height= 512
       Prop: filterMode= Bilinear
       Prop: anisoLevel= 4
       Prop: wrapMode= Repeat
       Prop: mipMapBias= 0
       Prop: texelSize= (0.0, 0.0)
       Prop: name= park-props_n
       Prop: hideFlags= 0
    Textureformat: 12
    
    
    Und hier alle Texturformate laut (Unity)MonoDevelop 
    public enum TextureFormat
    	{
    		Alpha8 = 1,
    		ARGB4444,
    		RGB24,
    		RGBA32,
    		ARGB32,
    		RGB565 = 7,
    		DXT1 = 10,
    		DXT5 = 12,
    		PVRTC_2BPP_RGB = 30,
    		PVRTC_2BPP_RGBA,
    		PVRTC_4BPP_RGB,
    		PVRTC_4BPP_RGBA,
    		PVRTC_RGB2 = 30,
    		PVRTC_RGBA2,
    		PVRTC_RGB4,
    		PVRTC_RGBA4,
    		ETC_RGB4,
    		ATC_RGB4,
    		ATC_RGBA8,
    		BGRA32,
    		ATF_RGB_DXT1,
    		ATF_RGBA_JPG,
    		ATF_RGB_JPG
    	}
    Alles anzeigen


    Nunja, brauchbar ist es nicht wenn ein Teil nicht da ist und der Exporter aus dem Unity Wiki kommt.
    An die Texturen komme ich bis jetzt nicht, da er immer meckert, kann nicht clonen oder nicht für die Scriptnutzung freigeschaltet

    2 Mal editiert, zuletzt von eis_os (16. April 2013 um 18:54)

    • Zitieren
  • eis_os
    Profi
    Beiträge
    1.025
    Filebase Einträge
    2
    • 16. April 2013 um 21:23
    • #59

    Hallo

    Die Mesh Objekte eines Bundles können nun ohne Materialien in ein Wavefront Objekt exportiert werden. 8)
    Unity 3D Bundle Mesh Exporter/Extract/UnCompressor:

    Empty Unity Projekt, Editor/eisUncompressBundle.cs

    Code
    using UnityEngine;
    using System.Collections;
    using System.Text;
    using System.Collections.Generic;
    
    
    using UnityEditor;
    using UnityEditorInternal;
    using System.IO;
    using System.Reflection;
    
    
    public class eisUncompressBundle : MonoBehaviour
    {
        [MenuItem("Assets/Dump Bundle %u")]
    
        static void Unpack ()
        {
            string file = EditorUtility.OpenFilePanel ("Select bundle file to unpack", "", "bundle");
            if (file.Length == 0)
                return;
    		string outdir = Path.GetFileNameWithoutExtension(file)+"_output/";
    		Directory.CreateDirectory(outdir);
    		AssetBundle bundle;
    		var wwwoobj = new WWW ("file:///" + file);
    
    		bundle = wwwoobj.assetBundle;
    		try {
    			ProcessBundle(file, outdir, bundle);
    		} catch {
    			bundle.Unload(true);
    			throw;
    		}
    		bundle.Unload(true);
    	}
    	static void ProcessBundle(string file, string outdir, AssetBundle bundle)
        {
    		StreamWriter sw = File.AppendText(Path.GetFileNameWithoutExtension(file)+".txt");
    		sw.AutoFlush = true;
    		sw.WriteLine("===================================================\n");
    
            Object[] objs1 = bundle.LoadAll();
    		foreach (Object obj in objs1) {
    			string filename = obj.name.Replace('/', '_');
    			System.Type type = obj.GetType ();
    			string itemdata = "";
    			PropertyInfo[] properties = type.GetProperties();
    			itemdata = "Name: "+obj.name+"\n";
    			itemdata += "   Instanceid: "+obj.GetInstanceID() +"\n";
    			itemdata += "   HashCode: "+obj.GetHashCode() +"\n"; 
    			itemdata += "   Type: "+type.ToString() +"\n";
    			foreach (System.Reflection.PropertyInfo prop in properties) {
    				try {
    					itemdata += "   Prop: "+prop.Name + "= "+ prop.GetValue(obj,null).ToString() + "\n"; 
    	            } catch {
    					itemdata += "   Prop: "+prop.Name + "= ?can't reflect?" + "\n"; 
    	            }
    
    			}
    
    			sw.WriteLine(itemdata);
    
    
    			if (type == typeof(Material) || (type.IsSubclassOf (typeof(Material)))) {
    
    
    			} else if (type == typeof(Texture2D ) || (type.IsSubclassOf (typeof(Texture2D )))) {
    
    
    			} else if (type == typeof(UnityEngine.Mesh)) {
    				ExportObj( (UnityEngine.Mesh)obj,outdir+filename+".obj");
    			} else {
    				//sw.WriteLine(StackOverflowObjectDumper.Dump(obj));
    			}
    			Debug.Log(itemdata);
    		}
    		sw.Close();
        }
     
    
    
    	static void ExportObj(UnityEngine.Mesh m, string filename) {
    
    
    		System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
    		file.WriteLine("g "+m.name);
    		file.WriteLine("# vertices");
    
    		var ver = m.vertices;
    		for(int i = 0; i < ver.Length; i++) {
    			//file.WriteLine(string.Format("#Index: {0}\n", i));
    			file.WriteLine(string.Format("v {0} {1} {2}\n",ver[i].x.ToString(),ver[i].y.ToString(),ver[i].z.ToString()));
    		}
    
    		file.WriteLine("# normals");
    		var vn = m.normals;
    		for(int i = 0; i < vn.Length; i++) {
    			file.WriteLine(string.Format("vn {0} {1} {2}\n",vn[i].x.ToString(),vn[i].y.ToString(),vn[i].z.ToString()));
    		}
    
    		file.WriteLine("# uv");
    		var uv = m.uv;
    		for(int i = 0; i < uv.Length; i++) {
    			file.WriteLine(string.Format("vt {0} {1}\n",uv[i].x.ToString(),uv[i].y.ToString()));
    		}
    
    		file.WriteLine("# uv1");
    		var uv1 = m.uv1;
    		for(int i = 0; i < uv1.Length; i++) {
    			file.WriteLine(string.Format("vt1 {0} {1}\n",uv1[i].x.ToString(),uv1[i].y.ToString()));
    		}
    
    		file.WriteLine("# uv2");
    		var uv2 = m.uv2;
    		for(int i = 0; i < uv1.Length; i++) {
    			file.WriteLine(string.Format("vt2 {0} {1}\n",uv2[i].x.ToString(),uv2[i].y.ToString()));
    		}
    
    		file.WriteLine("# colors");
    		foreach(Color c in m.colors) {
                file.WriteLine(string.Format("vc {0} {1} {2} {3}\n",c.r,c.g,c.b,c.a));
            }
    
            for (int material=0; material < m.subMeshCount; material ++) {
    		/*	file.WriteLine("#");
                file.WriteLine("usemtl "+mats[material].name);
                file.WriteLine("usemap "+mats[material].name);
     */
                int[] triangles = m.GetTriangles(material);
                for (int i=0;i<triangles.Length;i+=3) {
                    file.WriteLine(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n", 
                        triangles[i]+1, triangles[i+1]+1, triangles[i+2]+1));
                }
            }
    		file.Close();
    	}
    }
    Alles anzeigen
    • Zitieren
  • mediziner
    Administrator
    Reaktionen
    2
    Beiträge
    1.924
    Filebase Einträge
    10
    Einträge
    4
    • 16. April 2013 um 21:45
    • Offizieller Beitrag
    • #60

    Mir wäre ja ein Unity-unabhängiger Exporter fast lieber...

    Trotzdem, hervorragende Arbeit :thumbup:

    • Vorheriger offizieller Beitrag
    • Nächster offizieller Beitrag
    • Zitieren

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Twitch

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™