using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEditor.Animations; using System.IO; public class AdjustTexture : MonoBehaviour { [MenuItem("Tools/AdjustTexture/AdjustBasic")] static void AdjustBasic() { // Adjust("/Resources/Character/basic/"); DealBasicAnimatior(); Debug.Log("AdjustBasic Done"); } [MenuItem("Tools/AdjustTexture/AdjustCharacter")] static void AdjustCharacter() { Adjust("/Resources/Character/hero/"); Adjust("/Resources/Character/monster/"); Debug.Log("AdjustCharacter Done"); } [MenuItem("Tools/AdjustTexture/AdjustMonster")] static void AdjustMonster() { Adjust("/Resources/Character/monster/"); Debug.Log("AdjustMonster Done"); } [MenuItem("Tools/AdjustTexture/AdjustHero01Long")] static void AdjustHero01Long() { Adjust("/Resources/Character/hero/", "Character/hero/hero01\\hero01_long"); Debug.Log("AdjustHero01Long Done"); } [MenuItem("Tools/AdjustTexture/AdjustHero01Short")] static void AdjustHero01Short() { Adjust("/Resources/Character/hero/", "Character/hero/hero01\\hero01_short"); Debug.Log("AdjustHero01Short Done"); } static void Adjust(string pathRoot, string prefix = "") { List dirs = new List(); GetDirs(Application.dataPath + pathRoot, ref dirs); var FRAME_RATE = 12; foreach (var fileDir in dirs) { var resPath = fileDir.Replace("Assets/Resources/", "").Replace(".png", ""); if (!string.IsNullOrEmpty(prefix) && !resPath.StartsWith(prefix)) { continue; } Debug.Log(fileDir); var textures = Resources.Load(resPath); var path = AssetDatabase.GetAssetPath(textures); var ti = AssetImporter.GetAtPath(path) as TextureImporter; //调整资源参数 ti.isReadable = true; ti.spritePixelsPerUnit = 64; ti.filterMode = FilterMode.Point; ti.textureCompression = TextureImporterCompression.Uncompressed; ti.textureType = TextureImporterType.Sprite; ti.spriteImportMode = SpriteImportMode.Multiple; //切片 var textureSettings = new TextureImporterSettings(); ti.ReadTextureSettings(textureSettings); textureSettings.spriteMeshType = SpriteMeshType.FullRect; textureSettings.spriteExtrude = 0; ti.SetTextureSettings(textureSettings); int SliceWidth = 128; int SliceHeight = 64; var newData = new List(); for (int i = 0; i < textures.width; i += SliceWidth) { for (int j = textures.height; j > 0; j -= SliceHeight) { var smd = new SpriteMetaData(); smd.alignment = 9; smd.pivot = new Vector2(0.5f, 0.5f); smd.name = (textures.height - j) / SliceHeight + ", " + i / SliceWidth; smd.rect = new Rect(i, j - SliceHeight, SliceWidth, SliceHeight); newData.Add(smd); } } ti.spritesheet = newData.ToArray(); AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate); //生成动画文件 var animPath = fileDir.Replace(".png", ".anim"); var spriteNum = newData.Count; var timeTotal = (float)spriteNum / FRAME_RATE; var sprites = Resources.LoadAll(resPath); var animClip = Resources.Load(animPath); var isCreateNew = animClip == null; if (isCreateNew) { animClip = new AnimationClip(); } animClip.frameRate = FRAME_RATE; var clipSetting = AnimationUtility.GetAnimationClipSettings(animClip); clipSetting.loopTime = resPath.EndsWith("_loop"); AnimationUtility.SetAnimationClipSettings(animClip, clipSetting); var spriteBinding = new EditorCurveBinding(); spriteBinding.type = typeof(SpriteRenderer); spriteBinding.path = ""; spriteBinding.propertyName = "m_Sprite"; var spriteKeyFrames = new ObjectReferenceKeyframe[sprites.Length]; for (int i = 0; i < (sprites.Length); i++) { spriteKeyFrames[i] = new ObjectReferenceKeyframe(); spriteKeyFrames[i].time = i / animClip.frameRate; spriteKeyFrames[i].value = sprites[i]; } AnimationUtility.SetObjectReferenceCurve(animClip, spriteBinding, spriteKeyFrames); AssetDatabase.CreateAsset(animClip, animPath); } AssetDatabase.SaveAssets(); } static void DealBasicAnimatior() { var res = Resources.Load("Character/_common/animator"); string path = AssetDatabase.GetAssetPath(res); var ac = AssetDatabase.LoadAssetAtPath(path); var acLayers = ac.layers; foreach (AnimatorControllerLayer i in acLayers) //for each layer { var stateMachine = i.stateMachine; var ch_animStates = new List(stateMachine.states); foreach (var sm in stateMachine.stateMachines) { ch_animStates.AddRange(sm.stateMachine.states); } foreach (ChildAnimatorState j in ch_animStates) //for each state { AnimationClip clip = null; if (j.state.name.StartsWith("timeline")) { clip = Resources.Load($"Character/_common/{j.state.name}"); } else { clip = Resources.Load($"Character/basic/basic_{j.state.name}"); } j.state.motion = clip; ac.SetStateEffectiveMotion(j.state, clip); Debug.Log(i.name + "." + j.state.name + "."); } } AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } //参数1 为要查找的总路径, 参数2 保存路径 private static void GetDirs(string dirPath, ref List dirs) { foreach (string path in Directory.GetFiles(dirPath)) { //获取所有文件夹中包含后缀为 .png 的路径 if (System.IO.Path.GetExtension(path) == ".png") { dirs.Add(path.Substring(path.IndexOf("Assets"))); } } if (Directory.GetDirectories(dirPath).Length > 0) //遍历所有文件夹 { foreach (string path in Directory.GetDirectories(dirPath)) { GetDirs(path, ref dirs); } } } }