Skip to content

Instantly share code, notes, and snippets.

@whaison
Last active August 29, 2015 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save whaison/6d25bbb433c7adaa89f3 to your computer and use it in GitHub Desktop.
Save whaison/6d25bbb433c7adaa89f3 to your computer and use it in GitHub Desktop.
using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Linq;
using DMM.MB.Battle.Effect;
//public class SdDataToEffectPrefabMaker : MonoBehaviour {
public class Ef_pngToParticleAnimation : EditorWindow {
//string FolderName="sd_0000_name";
//Object SelectionObject;
TextAsset text;
Texture inputTexture;
Texture outTexture;
TextureImporter textureImporter;
string[] DirArr;
string[] SDCharaNameArr;
string[] Fix_DirArr;
string Fix_ef_png_filename;
string[] Fix_CharaNameArr;
string Fix_ef_charaName;
string CharaFolderName;
string CreatedFolder;
string ef_Dir;
string DirStr;
string ef_Id ;
string ef_charaId;
string ef_charaNam;
string ef_charaName;
string ef_png_filename;
AnimatorStateMachine BaseLayerStateMachine;
UnityEditor.Animations.AnimatorController AnimatorControllerRef;
AnimationClip AnimationClipRef;
List<GameObject> Sprite2dGameObjectRefList = new List<GameObject>();
Material myMaterial;
private int selGridInt = 0;
private string[] selCaptions = new string[] {
"attack",
"skill",
};
string AttackOrSkill;
void OnGUI ()
{
GUILayout.Label ("png To Particle Animation", EditorStyles.boldLabel);
/*
GUILayout.Space (10f);
csvAsset = EditorGUILayout.ObjectField ("CSV Text", csvAsset, typeof(TextAsset), false) as TextAsset;
if (csvAsset == null) {
GUILayout.Label ("Set CSV Data. Extension need .txt");
}
GUILayout.Space (10f);
modelAsset = EditorGUILayout.ObjectField ("3D Model", modelAsset, typeof(GameObject), false) as GameObject;
if (modelAsset == null) {
GUILayout.Label ("Set FBX or other 3D model object.");
}
*/
GUILayout.Space (10f);
selGridInt = GUILayout.SelectionGrid(selGridInt, selCaptions, 2, "Toggle");
GUILayout.Space (10f);
inputTexture = EditorGUILayout.ObjectField ("png", inputTexture, typeof(Texture), false) as Texture;
if (inputTexture == null) {
GUILayout.Label ("Set png or other image object.");
}
//go = Selection.activeGameObject;
//FolderName = go.name;
//GUILayout.Label ("SD Data Folder To Effect Folder and Prefab", EditorStyles.boldLabel);
GUILayout.Space (20f);
if (GUILayout.Button ("png To Particle Animation", GUILayout.Width (300f))) {
pngToParticleAnimation ();
}
}
void pngToParticleAnimation(){
//foreach (Object selectedObject in Selection.objects) {
// Debug.Log ("Crate selectedObject=" + selectedObject);
// SelectionObject = selectedObject;
// FolderName = SelectionObject.name;
//}
AttackOrSkill = selCaptions [selGridInt];
Debug.Log ("AttackOrSkill=" + AttackOrSkill);
//string DirStr = AssetDatabase.GetAssetPath (texture);
DirStr = AssetDatabase.GetAssetPath (inputTexture);
Debug.Log ("DirStr=" + DirStr);
//Close ();
Debug.Log ("------MakeFolderStart------");
string[] DirArr;
DirArr = DirStr.Split ("/" [0]);
string buildDir = DirArr [0];
for (int i = 1; i < DirArr.Length - 1; i++) {
buildDir = buildDir + "/" + DirArr [i];
}
ef_Dir = buildDir;
Debug.Log ("ef_Dir=" + ef_Dir);
ef_png_filename = DirArr [DirArr.Length - 1];
Debug.Log ("ef_png_filename=" + ef_png_filename);//ef_60110_gina_png.png
string[] ef_png_filename_arr;
ef_png_filename_arr = ef_png_filename.Split ("_" [0]);
ef_Id = ef_png_filename_arr [1];
Debug.Log ("ef_Id=" + ef_Id);
ef_charaId = ef_png_filename_arr [0] + "_" + ef_png_filename_arr [1];
Debug.Log ("ef_charaId=" + ef_charaId);
ef_charaName = ef_png_filename_arr [0] + "_" + ef_png_filename_arr [1] + "_" + ef_png_filename_arr [2]+"_"+AttackOrSkill;
Debug.Log ("ef_charaName=" + ef_charaName);
// Create a simple material asset
myMaterial = new Material (Shader.Find("Mobile/Particles/Additive"));
//myMaterial.SetTexture ("Particle Texture",inputTexture);
myMaterial.mainTexture = inputTexture;
string MaterialPath = ef_Dir +"/"+ ef_png_filename_arr [0] + "_" + ef_png_filename_arr [1] + "_" + ef_png_filename_arr [2] + "_mat.mat";
Debug.Log ("--------------MaterialPath="+MaterialPath+"---------------------");
AssetDatabase.CreateAsset(myMaterial,MaterialPath);
//------------texture2d-----------------------------------------------
//texture2d.mo
//TextureImporterSettings textureImporterSettings;
//TextureImporter.SetTextureSettings (textureImporterSettings);
//TextureImporter.textureType = TextureImporterType.Sprite;
string texturePath = DirStr;
//TextureImporter importer
textureImporter = TextureImporter.GetAtPath (texturePath) as TextureImporter;
textureImporter.textureType = TextureImporterType.Sprite;
textureImporter.spriteImportMode = SpriteImportMode.Multiple;
textureImporter.filterMode = FilterMode.Point;
EditorUtility.SetDirty (textureImporter);
AssetDatabase.ImportAsset (texturePath, ImportAssetOptions.ForceUpdate);
//Texture texture
Texture outTexture = AssetDatabase.LoadAssetAtPath (texturePath, typeof(Texture)) as Texture;
//importer.spritePixelsPerUnit = Mathf.Max (texture.width / horizontalCount, texture.height / verticalCount);
textureImporter.spritePixelsPerUnit = 1.0f;
textureImporter.spritesheet = CreateSpriteMetaDataArray (outTexture);
EditorUtility.SetDirty (textureImporter);
AssetDatabase.ImportAsset (texturePath, ImportAssetOptions.ForceUpdate);
//------------texture2d-----------------------------------------------
sprite2dInstanciate ();
}
SpriteMetaData[] CreateSpriteMetaDataArray (Texture texture)
{
List<SpriteMetaData> SpriteMetaDataList = new List<SpriteMetaData>();
for (int i = 0; i < 6+1; i++) {
string namestr = texture.name + "_" + i;
Rect rectBox = new Rect (0, 0, 0, 0);
switch(i){
case 0:
rectBox = new Rect (128,128, 128, 128);break;
case 1:
rectBox = new Rect (0,128, 128, 128);break;
case 2:
rectBox = new Rect (128,0, 128, 128);break;
case 3:
rectBox = new Rect (64,64, 64, 64);break;
case 4:
rectBox = new Rect (0,64, 64, 64);break;
case 5:
rectBox = new Rect (64,0, 64, 64);break;
case 6:
rectBox = new Rect (0, 0, 64, 64);break;
default:
break;
}
//rect = new Rect (spriteWidth * x, texture.height - spriteHeight * (y + 1), spriteWidth, spriteHeight);
SpriteMetaData spriteMetaData = new SpriteMetaData ();
spriteMetaData.name=namestr;
spriteMetaData.rect = rectBox;
SpriteMetaDataList.Add (spriteMetaData);
}
return SpriteMetaDataList.ToArray ();
}
void sprite2dInstanciate(){
Debug.Log ("--------sprite2dInstanciate-----------");
//string[] TextureDependencies = AssetDatabase.GetDependencies( DirStr);
// Create
//GameObject gameObject = new GameObject();
string ef_instanceName = ef_charaName;
string ef_gameObjectName=ef_instanceName+".prefab";
//AssetDatabase.CreateAsset(gameObject, CreateEffectFolderName+"/"+EffectFolderName+"/"+gameObjectName);
//string ef_gameObjectPath = ef_Dir+ "/" + ef_gameObjectName;
//################################################################################################
string ef_gameObjectPath = getSavePath (ef_instanceName, "", ".prefab");
Debug.Log ("ef_gameObjectPath getSavePath = "+ef_gameObjectPath);
Fix_DirArr = ef_gameObjectPath.Split ("/" [0]);
Fix_ef_png_filename = Fix_DirArr [Fix_DirArr.Length - 1];
Fix_CharaNameArr= Fix_ef_png_filename.Split ("." [0]);
Fix_ef_charaName = Fix_CharaNameArr [0];
ef_instanceName = Fix_ef_charaName;
ef_gameObjectName=ef_instanceName+".prefab";
//################################################################################################
GameObject ef_Instance = EditorUtility.CreateGameObjectWithHideFlags (ef_gameObjectName, HideFlags.HideInHierarchy);
//PrefabUtility.CreateEmptyPrefab (fe_gameObjectPath, ef_Instance);
GameObject ef_prefab=PrefabUtility.CreatePrefab (ef_gameObjectPath, ef_Instance);
//AddComponent
BasicEffectController ef_basicEffectController =ef_prefab.AddComponent<BasicEffectController> ();
ef_basicEffectController.useEndOfTime = true;
ef_basicEffectController.endOfTime = 1.5f;
//プレファブをインスタンシエイト
GameObject ef_InstanceAttachedPrefab=PrefabUtility.InstantiateAttachedAsset (ef_prefab)as GameObject;
ef_InstanceAttachedPrefab.name = ef_instanceName;
//プレハブをApplyする
PrefabUtility.ReplacePrefab (ef_InstanceAttachedPrefab, ef_prefab, ReplacePrefabOptions.ConnectToPrefab);
//Assetをリロードする。
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
/**/
//GameObject ef_Instance = EditorUtility.CreateGameObjectWithHideFlags (ef_instanceName, HideFlags.None);
//Debug.Log ("--------TextureDependencies-----="+TextureDependencies.Length+"");
Debug.Log ("--------textureImporter.spritesheet.Length-----------"+textureImporter.spritesheet.Length);
for (int i = 0; i < textureImporter.spritesheet.Length; i++)
{
string sprit2dName=textureImporter.spritesheet [i].name;
Debug.Log ("--------sprit2dName-----------"+sprit2dName);
GameObject sprite_Instance = EditorUtility.CreateGameObjectWithHideFlags (sprit2dName, HideFlags.HideInHierarchy);
sprite_Instance.name = sprit2dName;
string sprit2dprefabPath=ef_Dir+ "/" + sprit2dName+"_prefab.prefab";
//PrefabUtility.CreateEmptyPrefab (fe_gameObjectPath, ef_Instance);
//プレファブ作る
GameObject sprite_prefab=PrefabUtility.CreatePrefab (sprit2dprefabPath, sprite_Instance);
//SpriteRenderer sprite_SpriteRenderer = sprite_prefab.AddComponent<SpriteRenderer> ();
ParticleSystemRenderer sprite_ParticleSystemRenderer =sprite_prefab.AddComponent<ParticleSystemRenderer> ();
sprite_ParticleSystemRenderer.material = myMaterial;
ParticleSystem sprite_ParticleSystem =sprite_prefab.AddComponent<ParticleSystem> ();
/*
//string sprite2dAssetPass=ef_Dir+ "/" + sprit2dName;
string sprite2dAssetPass=ef_Dir+"/"+ef_png_filename;
Debug.Log ("sprite2dAssetPass= "+sprite2dAssetPass+" の中身は");
Sprite mysprite= seachAseet (sprite2dAssetPass, sprit2dName) as Sprite;
Debug.Log ("mysprite="+mysprite);
sprite_SpriteRenderer.sprite=mysprite;
//マテリアルを設定
sprite_SpriteRenderer.material = myMaterial;
*/
Component[] sprite_ParticleSystem_compo=sprite_ParticleSystem.gameObject.GetComponents<Component>();
Debug.Log("---------sprite_ParticleSystem_compo.Length----------"+sprite_ParticleSystem_compo.Length);
for(int p = 0; p < sprite_ParticleSystem_compo.Length; p++)
{
Debug.Log("----sprite_ParticleSystem_comp["+p+"]"+sprite_ParticleSystem_compo[p].name+"---");
}
/*
switch(i){
case 0:
rectBox = new Rect (128,128, 128, 128);break;
case 1:
rectBox = new Rect (0,128, 128, 128);break;
case 2:
rectBox = new Rect (128,0, 128, 128);break;
case 3:
rectBox = new Rect (64,64, 64, 64);break;
case 4:
rectBox = new Rect (0,64, 64, 64);break;
case 5:
rectBox = new Rect (64,0, 64, 64);break;
case 6:
rectBox = new Rect (0, 0, 64, 64);break;
default:
break;
}
*/
//プレファブをインスタンシエイト
GameObject spriteInstantiateAttachePrefab=PrefabUtility.InstantiateAttachedAsset (sprite_prefab)as GameObject;
spriteInstantiateAttachePrefab.name = sprit2dName;
//親を設定
spriteInstantiateAttachePrefab.transform.parent = ef_InstanceAttachedPrefab.transform;
//リストに参照を保存。
Sprite2dGameObjectRefList.Add (spriteInstantiateAttachePrefab);
//いらないプレファブ消す
AssetDatabase.DeleteAsset (sprit2dprefabPath);
//ef_Dir
}
//プレハブをApplyする
PrefabUtility.ReplacePrefab (ef_InstanceAttachedPrefab, ef_prefab, ReplacePrefabOptions.ConnectToPrefab);
//Assetをリロードする。
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
}
public UnityEngine.Object seachAseet (string filepath,string seachName){
UnityEngine.Object MyObject=new UnityEngine.Object();;
//Sprite mysprite = UnityEditor.AssetDatabase.LoadAssetsAtPath(sprite2dAssetPass, typeof(Sprite)) as Sprite;
UnityEngine.Object[] FolderAssetArr = UnityEditor.AssetDatabase.LoadAllAssetsAtPath (filepath);
//UnityEngine.Object[] FolderAssetArr = UnityEditor.AssetDatabase.LoadAllAssetRepresentationsAtPath (sprite2dAssetPass);
Debug.Log ("FolderAssetArr.Length="+FolderAssetArr.Length+"です。");
for (int j = 0; j< FolderAssetArr.Length;j++) {
string AssetName=FolderAssetArr [j].name;
Debug.Log ("AssetName="+AssetName);
if (seachName == AssetName) {
Debug.Log ("HIT!!!!! seachName="+seachName+" AssetName="+AssetName+"-------OK");
MyObject = FolderAssetArr [j];
}
}
/*
if (MyObject == null) {
MyObject=new UnityEngine.Object();
Debug.Log("エラー発生です。");
}
*/
return MyObject;
}
string[] labels = {"Data", "ScriptableObject"};
void CreateAnimationClip(string filename){
string path = getSavePath (filename,"",".anim");
AnimationClip newClip = new AnimationClip();
newClip.name = name;
AssetDatabase.CreateAsset(newClip, path);
// add label
AnimationClip obj = AssetDatabase.LoadAssetAtPath (path, typeof(AnimationClip)) as AnimationClip;
//sobj = AssetDatabase.LoadAssetAtPath (path, typeof(ScriptableObject)) as ScriptableObject;
AssetDatabase.SetLabels (obj, labels);
EditorUtility.SetDirty (obj);
AnimationClipRef = obj;
}
string getSavePath (string filename,string folderName,string filetype)
{
string undot_filetype=filetype.Substring (1);
//string under_filetype="_"+undot_filetype;
Debug.Log("------- getSavePath ----- filename="+filename);
//string objectName = selectedObject.name;
//string objectName = selectedObject.name;
string objectName = filename;
//string objectName = selectedObject.name+"_AnimationClipEventData";
if (filetype == ".asset") {
//objectName = selectedObject.name+"_"+AnimationNameStr+"_"+AnimationClipEventNameStr;
}
if (filetype == ".anim") {
//objectName =AnimationNameStr+"_event";
}
//Debug.Log("------- getSavePath ----- objectName="+objectName);
//string dirPath = Path.GetDirectoryName (AssetDatabase.GetAssetPath (selectedObject));
////////////
string dirPath = ef_Dir;
//string dirPath = CharaDir+"/AnimationClipEventData";
//////////
//string path = string.Format ("{0}/{1}.asset", dirPath, objectName);
//string path = dirPath+"/"+objectName+".asset";
string path = dirPath+"/"+objectName+"_1"+"_"+undot_filetype+filetype;
Debug.Log ("------ getSavePath -----path="+path);
//string AnimationEventDir = dirPath + "/AnimationEvent";
string MakeDir;
if (folderName == "") {
MakeDir = dirPath;
} else {
MakeDir = dirPath + "/" + folderName;
if (AssetDatabase.IsValidFolder (MakeDir)) {
Debug.Log (MakeDir + " ありました!");
} else {
Debug.Log (MakeDir + " ないのでつくりますです!");
string guid = AssetDatabase.CreateFolder (dirPath, folderName);
string newFolderPath = AssetDatabase.GUIDToAssetPath (guid);
Debug.Log (newFolderPath + " = newFolderPath 作りました!");
Debug.Log (MakeDir + " = MakeDir 作りました!");
}
//path= MakeDir+"/"+objectName+".asset";
path= MakeDir+"/"+objectName+"_1"+"_"+undot_filetype+filetype;
}
Debug.Log ("------ getSavePath -----path="+path);
if (File.Exists (path)) {
Debug.Log ("------ getSavePath -----path=" + path + "あったので");
for (int i = 1;; i++) {
//path = string.Format ("{0}/{1}({2}).asset", dirPath, objectName, i);
path = MakeDir + "/" + objectName + "_" + i + "_" + undot_filetype + filetype;
Debug.Log ("------ getSavePath -----path=" + path + "足しました。");
if (!File.Exists (path)) {
break;
}
}
} else {
Debug.Log ("------ getSavePath -----path=" + path + "なかったのでそのままです。");
}
Debug.Log("------ getSavePath --------- path="+path);
return path;
}
public void templateCode()
{
}
/// <summary>
/// 指定したパスにディレクトリが存在しない場合
/// すべてのディレクトリとサブディレクトリを作成します
/// </summary>
public System.IO.DirectoryInfo SafeCreateDirectory(string path,string foldername)
{
string dirpathName = path +"/"+ foldername;
if (Directory.Exists(dirpathName))
{
Debug.Log ("そのフォルダはすでに存在してます。");
return null;
}
return Directory.CreateDirectory(dirpathName);
}
////////////////////////////////////////////////////////////////////////////////
#region Static
/// <summary>
/// Open the tool window
/// </summary>
[MenuItem("Tools/Effect/png To Particle Animation")]
static public void OpenWindow3 ()
{
EditorWindow.GetWindow<Ef_pngToParticleAnimation> (true, "png To particle", true);
}
#endregion
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment