Help translating this C# to Unityscript? I'm stuck at one part...

Hello,

I’m trying to translate the code written here (the bottom thread has the full code): Substance ProceduralMaterial to Material? Possible? - Unity Engine - Unity Discussions

I’ve gotten to one part and got stuck, and I’m not sure exactly how to go about fixing it. The lines below I’m unsure how to translate. Anyone know how? Thanks!!

System.Type substanceImporterType = typeof( SubstanceImporter );
    MethodInfo exportBitmaps = substanceImporterType.GetMethod( "ExportBitmaps", BindingFlags.Instance | BindingFlags.NonPublic );
 
    foreach ( ProceduralMaterial substanceMaterial in substanceMaterials ) {
        exportBitmaps.Invoke( substanceImporter, new object[] { substanceMaterial } );
}

And my code, including where I’m stuck @ the bottom. Lines 28/29 are probably wrong.

@MenuItem ("Window/Save Texture %#t")
static function SaveTexture () {
    print (Selection.activeObject.GetType());
    if (Selection.activeObject.GetType() == UnityEditor.SubstanceArchive)
    {
        var substance                 : SubstanceArchive        = Selection.activeObject as SubstanceArchive;
        print ("substance: " + substance.name);
        var substancePath            : String                = AssetDatabase.GetAssetPath( substance.GetInstanceID() );
        print ("substancePath: " + substancePath);
        var substanceImporter        : SubstanceImporter        = AssetImporter.GetAtPath( substancePath ) as SubstanceImporter;
        var substanceMaterialCount    : int                    = substanceImporter.GetMaterialCount();
        print ("substanceMaterialCount: " + substanceMaterialCount);
        var substanceMaterials        : ProceduralMaterial[]    = substanceImporter.GetMaterials();
        print ("substanceMaterials.Length: " + substanceMaterials.Length);
        var basePath                : String                = substancePath.Replace( "/" + substance.name + ".sbsar", "" );
        print ("basePath: " + basePath);
        var characters                 : String                 = "0123456789abcdefghijklmnopqrstuvwxABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var code                     : String                 = "";
        var codeLength                : int                    = 8;
        for (var i : int = 0; i < codeLength; i++) {
            var a : int = Random.Range(0, characters.Length);
            code = code + characters[a];
        }
        print ("code: " + code);
        AssetDatabase.CreateFolder( basePath, substance.name + "_" + code );
        AssetDatabase.ImportAsset( basePath + "/" + substance.name + "_" + code);
      
        var substanceImporterType    : System.Type            = typeof( SubstanceImporter );
        var exportBitmaps                                    = substanceImporterType.GetMethod( "ExportBitmaps");
      
        for (var s : int = 0; s < substanceMaterials.Length; s++) {
            var substanceMaterial                                = substanceMaterials[s];
            var generateAllOutputs        : boolean                = substanceImporter.GetGenerateAllOutputs(substanceMaterial);
            var materialPath            : String                = basePath + "/" + substance.name + "_" + code + "/";
            var newMaterial                : Material                = new Material(substanceMaterial.shader);
            AssetDatabase.CreateAsset( newMaterial, materialPath + substanceMaterial.name + ".mat" );
            AssetDatabase.ImportAsset( materialPath + substanceMaterial.name + ".mat" );
            newMaterial.CopyPropertiesFromMaterial(substanceMaterial);
            substanceImporter.SetGenerateAllOutputs(substanceMaterial, true);
          
          
          
      
          
          
        //    exportBitmaps.Invoke( substanceImporter);
          
          
            if (!generateAllOutputs)
                substanceImporter.SetGenerateAllOutputs(substanceMaterial, false);
        }
      
      
      
      
    }
}

The Unityscript translation of the C# lines you posted would be (untested):

var substanceImporterType = typeof(SubstanceImporter);
var exportBitmaps = substanceImporterType.GetMethod("ExportBitmaps", BindingFlags.Instance | BindingFlags.NonPublic);
for (var substanceMaterial in substanceMaterials) {
    exportBitmaps.Invoke(substanceImporter, [substanceMaterial]);
}

–Eric

1 Like

Thanks! My super smart programmer but not unity programmer brother helped me hack a version that calls part of the original C# script, which is working. However, I’ll test this code later and see if I can finish what I started. Thank you!!

Ah – well, error near the start: “Unknown identifier: ‘BindingFlags’.” I had gotten it before, so removed the code to see what happens, didn’t put it back in before posting this question.