public static void ReplaceTexture(TrainCar trainCar) { string findSkin = ""; if (trainCar.carType == TrainCarType.Tender && lastSteamerSkin != null) { findSkin = lastSteamerSkin.name; } Skin skin = FindTrainCarSkin(trainCar, findSkin); if (trainCar.carType == TrainCarType.LocoSteamHeavy) { lastSteamerSkin = skin; } else { lastSteamerSkin = null; } if (skin == null) { return; } var cmps = trainCar.gameObject.GetComponentsInChildren <MeshRenderer>(); foreach (var cmp in cmps) { if (!cmp.material) { continue; } var diffuse = GetMaterialTexture(cmp, "_MainTex"); var normal = GetMaterialTexture(cmp, "_BumpMap"); var specular = GetMaterialTexture(cmp, "_MetallicGlossMap"); var emission = GetMaterialTexture(cmp, "_EmissionMap"); var occlusion = GetMaterialTexture(cmp, "_OcclusionMap"); if (!defaultSkins.TryGetValue(trainCar.carType, out Skin defSkin)) { defSkin = null; } if (diffuse != null) { if (skin.ContainsTexture(diffuse.name)) { var skinTexture = skin.GetTexture(diffuse.name); cmp.material.SetTexture("_MainTex", skinTexture.textureData); } else if ((defSkin != null) && defSkin.ContainsTexture(diffuse.name)) { var skinTexture = defSkin.GetTexture(diffuse.name); cmp.material.SetTexture("_MainTex", skinTexture.textureData); } } if (normal != null) { if (skin.ContainsTexture(normal.name)) { var skinTexture = skin.GetTexture(normal.name); cmp.material.SetTexture("_BumpMap", skinTexture.textureData); } else if ((defSkin != null) && defSkin.ContainsTexture(normal.name)) { var skinTexture = defSkin.GetTexture(normal.name); cmp.material.SetTexture("_BumpMap", skinTexture.textureData); } } if (specular != null) { if (skin.ContainsTexture(specular.name)) { var skinTexture = skin.GetTexture(specular.name); cmp.material.SetTexture("_MetallicGlossMap", skinTexture.textureData); if (occlusion != null) { // occlusion is in green channel of specular map cmp.material.SetTexture("_OcclusionMap", skinTexture.textureData); } } else if ((defSkin != null) && defSkin.ContainsTexture(specular.name)) { var skinTexture = defSkin.GetTexture(specular.name); cmp.material.SetTexture("_MetallicGlossMap", skinTexture.textureData); if (occlusion != null) { // occlusion is in green channel of specular map cmp.material.SetTexture("_OcclusionMap", skinTexture.textureData); } } } if (emission != null) { if (skin.ContainsTexture(emission.name)) { var skinTexture = skin.GetTexture(emission.name); cmp.material.SetTexture("_EmissionMap", skinTexture.textureData); } else if ((defSkin != null) && defSkin.ContainsTexture(emission.name)) { var skinTexture = defSkin.GetTexture(emission.name); cmp.material.SetTexture("_EmissionMap", skinTexture.textureData); } } } }
static void LoadSkins() { foreach (var prefab in prefabMap) { Skin defSkin = CreateDefaultSkin(prefab.Key, prefab.Value); defaultSkins.Add(prefab.Key, defSkin); var dir = modPath + "Skins\\" + prefab.Value; if (Directory.Exists(dir)) { var subDirectories = Directory.GetDirectories(dir); var skinGroup = new SkinGroup(prefab.Key); var carPrefab = CarTypes.GetCarPrefab(prefab.Key); var cmps = carPrefab.gameObject.GetComponentsInChildren <MeshRenderer>(); MeshRenderer[] interiorCmps = null; var trainCar = carPrefab.GetComponent <TrainCar>(); if (trainCar.interiorPrefab != null) { interiorCmps = trainCar.interiorPrefab.GetComponentsInChildren <MeshRenderer>(); } foreach (var subDir in subDirectories) { var dirInfo = new DirectoryInfo(subDir); var files = Directory.GetFiles(subDir); var skin = new Skin(dirInfo.Name); foreach (var file in files) { FileInfo fileInfo = new FileInfo(file); string fileName = Path.GetFileNameWithoutExtension(fileInfo.Name); byte[] fileData = File.ReadAllBytes(file); foreach (var cmp in cmps) { if (!cmp.material) { continue; } var diffuse = GetMaterialTexture(cmp, "_MainTex"); var normal = GetMaterialTexture(cmp, "_BumpMap"); var specular = GetMaterialTexture(cmp, "_MetallicGlossMap"); var emission = GetMaterialTexture(cmp, "_EmissionMap"); if (diffuse != null) { if ((diffuse.name == fileName || aliasNames.ContainsKey(diffuse.name) && aliasNames[diffuse.name] == fileName) && !skin.ContainsTexture(diffuse.name)) { var texture = new Texture2D(diffuse.width, diffuse.height); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(diffuse.name, texture)); } } if (normal != null) { if ((normal.name == fileName || aliasNames.ContainsKey(normal.name) && aliasNames[normal.name] == fileName) && !skin.ContainsTexture(normal.name)) { var texture = new Texture2D(normal.width, normal.height, TextureFormat.ARGB32, true, true); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(normal.name, texture)); } } if (specular != null) { if ((specular.name == fileName || aliasNames.ContainsKey(specular.name) && aliasNames[specular.name] == fileName) && !skin.ContainsTexture(specular.name)) { var texture = new Texture2D(specular.width, specular.height); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(specular.name, texture)); } } if (emission != null) { if ((emission.name == fileName || aliasNames.ContainsKey(emission.name) && aliasNames[emission.name] == fileName) && !skin.ContainsTexture(emission.name)) { var texture = new Texture2D(emission.width, emission.height); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(emission.name, texture)); } } } if (interiorCmps != null) { foreach (var cmp in interiorCmps) { if (!cmp.material) { continue; } var diffuse = GetMaterialTexture(cmp, "_MainTex"); var normal = GetMaterialTexture(cmp, "_BumpMap"); var specular = GetMaterialTexture(cmp, "_MetallicGlossMap"); var emission = GetMaterialTexture(cmp, "_EmissionMap"); if (diffuse != null) { if ((diffuse.name == fileName || aliasNames.ContainsKey(diffuse.name) && aliasNames[diffuse.name] == fileName) && !skin.ContainsTexture(diffuse.name)) { var texture = new Texture2D(diffuse.width, diffuse.height); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(diffuse.name, texture)); } } if (normal != null) { if ((normal.name == fileName || aliasNames.ContainsKey(normal.name) && aliasNames[normal.name] == fileName) && !skin.ContainsTexture(normal.name)) { var texture = new Texture2D(normal.width, normal.height, TextureFormat.ARGB32, true, true); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(normal.name, texture)); } } if (specular != null) { if ((specular.name == fileName || aliasNames.ContainsKey(specular.name) && aliasNames[specular.name] == fileName) && !skin.ContainsTexture(specular.name)) { var texture = new Texture2D(specular.width, specular.height); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(specular.name, texture)); } } if (emission != null) { if ((emission.name == fileName || aliasNames.ContainsKey(emission.name) && aliasNames[emission.name] == fileName) && !skin.ContainsTexture(emission.name)) { var texture = new Texture2D(emission.width, emission.height); texture.name = fileName; texture.LoadImage(fileData); texture.Apply(true, true); SetTextureOptions(texture); skin.skinTextures.Add(new SkinTexture(emission.name, texture)); } } } } } skinGroup.skins.Add(skin); } skinGroups.Add(prefab.Key, skinGroup); } } }