using UnityEngine; using UnityEditor; public class ModelResourcesBuilder : ResourcesBuilder { public void BuildModelRes(int id, bool isHighMesh = false) { ModelResConfig _modelRes = ModelResConfig.Get(id); if (_modelRes == null) { Debug.LogWarningFormat("要生成的ModelRes资源id: {0} 并不存在于配置表中, 请确认是否填写有错.", id); return; } switch ((E_ModelResType)_modelRes.Type) { case E_ModelResType.Suit: BuildClothes(id, isHighMesh); break; case E_ModelResType.Wing: BuildWing(id, isHighMesh); break; case E_ModelResType.Weapon: BuildWeapon(id, isHighMesh); break; case E_ModelResType.Horse: BuildHorse(id, isHighMesh); break; case E_ModelResType.Secondary: BuildSecondary(id, isHighMesh); break; case E_ModelResType.Hand: BuildHand(id, isHighMesh); break; } } public void BuildClothes(int id, bool isHighMesh) { BuildAnimationClip(id); BuildAnimatorController(id, "Temple_AnimatorController_Hero", "animatorBuildConfig"); BuildPrefab(id, InstanceResourcesLoader.raceSuffix, isHighMesh); } public void BuildWeapon(int id, bool isHighMesh) { BuildPrefab(id, InstanceResourcesLoader.weaponSuffix, isHighMesh); } public void BuildSecondary(int id, bool isHighMesh) { BuildPrefab(id, InstanceResourcesLoader.secondarySuffix, isHighMesh); } public void BuildHand(int id, bool isHighMesh) { BuildPrefab(id, InstanceResourcesLoader.handSuffix, isHighMesh); } public void BuildHorse(int id, bool isHighMesh) { BuildAnimationClip(id); BuildAnimatorController(id, "Temple_AnimatorController_Horse", "animatorBuildConfig"); BuildPrefab(id, InstanceResourcesLoader.horseSuffix, isHighMesh); } public void BuildWing(int id, bool isHighMesh) { BuildAnimationClip(id); BuildAnimatorController(id, "Temple_AnimatorController_Wing", "animatorBuildConfig_Wing"); BuildPrefab(id, InstanceResourcesLoader.wingSuffix, isHighMesh); } private void BuildPrefab(int id, string suffix, bool isHighMesh = false) { if (!IsBuildPrefab) { return; } ModelResConfig _modelRes = ModelResConfig.Get(id); string _path = _modelRes.ResourcesName; string _resName = _modelRes.ResourcesName; if (_path.IndexOf('/') != -1) { _resName = _path.Substring(_path.IndexOf("/") + 1); _path = _path.Substring(0, _modelRes.ResourcesName.IndexOf('/')); } if (suffix.Equals(InstanceResourcesLoader.raceSuffix)) { HandleMaterial(_path, _resName, _modelRes.Material_Fight_Normal); HandleMaterial(_path, _resName, _modelRes.Material_UI_Normal); HandleMaterial(_path, _resName, _modelRes.Material_Fight_Suit); HandleMaterial(_path, _resName, _modelRes.Material_UI_Suit); } BuildPrefab(_path, _resName, suffix, null, isHighMesh); } public static void HandleMaterial(string path, string bunedleName, string assetName) { if (string.IsNullOrEmpty(assetName)) { return; } string _originalePath = string.Format("Assets/ART/Role/{0}/Materials/{1}.mat", path, assetName); var _old = AssetDatabase.LoadAssetAtPath(_originalePath); var _material = Object.Instantiate(_old); AssetDatabase.CreateAsset(_material, "Assets/ResourcesOut/Mob/" + path + "/Materials/" + assetName + ".mat"); var _importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(_material)); _importer.assetBundleName = ResourcesPath.MOB_FOLDER_NAME + (InstanceResourcesLoader.raceSuffix + bunedleName).ToLower(); EditorUtility.SetDirty(_material); } public static void BuildAnimationClip(int id) { if (!IsBuildAnimationClip) { return; } ModelResConfig _modelRes = ModelResConfig.Get(id); string _path = _modelRes.ResourcesName; if (_path.IndexOf('/') != -1) { _path = _path.Substring(0, _modelRes.ResourcesName.IndexOf('/')); } BuildAnimationClip(_path); } public static void BuildAnimatorController(int id, string templeName, string configName) { if (!IsBuildAnimatorController && !IsBuildAnimatorUIController) { return; } ModelResConfig _modelRes = ModelResConfig.Get(id); string _path = _modelRes.ResourcesName; if (_path.IndexOf('/') != -1) { _path = _path.Substring(0, _modelRes.ResourcesName.IndexOf('/')); } BuildAnimatorController(_path, templeName, configName); if (ResourcesBuilder.IsBuildAnimatorUIController) { BuildAnimatorController(_path, "Temple_AnimatorController_UI", "animatorBuildConfig", null); } } protected override void OnSetupRenderer(string path, string resName, ref Renderer renderer) {//Assets/ART/Role/A_Zs_Sb/Materials/A_Zs05_Sb.mat string _originalPath = path; if (path.EndsWith("_Sb")) { path = path.Replace("_Sb", ""); resName = resName.Replace("_Sb", ""); } string _materialPath = string.Format("Assets/ART/Role/{0}/Materials/{1}.mat", path, resName); Material _material = AssetDatabase.LoadAssetAtPath(_materialPath); if (!_material) { return; } // 设置为不接受阴影 renderer.receiveShadows = false; if (_originalPath.Equals("A_Zs") || _originalPath.Equals("A_Fs")) { renderer.material = renderer.sharedMaterial = null; renderer.materials = renderer.sharedMaterials = new Material[0]; } else { renderer.material = renderer.sharedMaterial = AssetDatabase.LoadAssetAtPath(_materialPath); } // 这里是对翅膀的特殊处理 Transform _parent = renderer.transform.parent; if (_parent == null) { return; } // 翅膀的第二个节点 Transform _node = _parent.Find(resName + "b"); if (_node == null) { return; } _materialPath = string.Format("Assets/ART/Role/{0}/Materials/{1}_glow.mat", path, resName); Renderer _renderer = _node.GetComponent(); _renderer.receiveShadows = false; _renderer.materials = new Material[0]; _renderer.sharedMaterial = AssetDatabase.LoadAssetAtPath(_materialPath); } }