You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			185 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			185 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C#
		
	
| 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<string> dirs = new List<string>();
 | |
|         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<Texture2D>(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<SpriteMetaData>();
 | |
|             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<Sprite>(resPath);
 | |
| 
 | |
|             var animClip = Resources.Load<AnimationClip>(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<AnimatorController>("Character/_common/animator");
 | |
|         string path = AssetDatabase.GetAssetPath(res);
 | |
|         var ac = AssetDatabase.LoadAssetAtPath<AnimatorController>(path);
 | |
|         var acLayers = ac.layers;
 | |
| 
 | |
|         foreach (AnimatorControllerLayer i in acLayers) //for each layer
 | |
|         {
 | |
|             var stateMachine = i.stateMachine;
 | |
|             var ch_animStates = new List<ChildAnimatorState>(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<AnimationClip>($"Character/_common/{j.state.name}");
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     clip = Resources.Load<AnimationClip>($"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<string> 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);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |