Reimporting an asset from Editor Code
Hi, I'm actually trying to make a script that takes an excel document, analyses it and then takes out arrays with the data in it.
So I took a base decoding excel documents: https://unitylist.com/p/28t/Unity-excel-importer.
How it works is :
-Detects an xlsx document has been imported
-Asks user to create a class to organize the data in arrays
-Make a script that's gonna associate the .xlsx to that class
-Reimport the .xlsx document, a .asset has been created with all your data here.
Since I'm working for a "classic" company, I tried making it automatic.
What I got so far is:
-Detects an xlsx document has been imported, creates the scripts with the good class associated
-Reimport the.xlsx document etc...
You got it, I need to reimport my document from script to make it automatic.
Problem is, AssetDatabase.Refresh(); isn't enough and using AssetDatabase.ImportAsset(excelPath, ImportAssetOptions.ForceUpdate); makes unity loop the "Import small assets" phase, forcing me to close from task manager.
TL;DR: I need to reimport my excel document, but I either end up in an infinite "Import small assets" loop, either end up with nothing.
Here is the part of the script I think is the most interesting: (the AssetDatabase.ImportAsset(excelPath, ImportAssetOptions.ForceUpdate); line is the one making it freeze.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;
using System;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
public class ExcelAssetScriptMenu
{
const string ScriptTemplateName = "ExcelAssetScriptTemplete.cs.txt";
const string FieldTemplete = "\tpublic List<TableauCollaborateursUpdate> #FIELDNAME#;";
[MenuItem("Assets/Create/ExcelAssetScript", false)]
public static void CreateScript(string excel)
{
bool hasReloaded = false;
//string savePath = EditorUtility.SaveFolderPanel("Save ExcelAssetScript", Application.dataPath, "");
string savePath = "Assets/Excel Files";
if(savePath == "") return;
//var selectedAssets = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets);
//string excelPath = AssetDatabase.GetAssetPath(selectedAssets[0]);
string excelPath = "Assets/Excel Files/" + excel + ".xlsx";
string excelName = Path.GetFileNameWithoutExtension(excelPath);
List<string> sheetNames = GetSheetNames(excelPath);
string scriptString = BuildScriptString(excelName, sheetNames);
string path = Path.ChangeExtension(Path.Combine(savePath, excelName), "cs");
File.WriteAllText(path, scriptString);
AssetDatabase.Refresh();
if (!hasReloaded)
{
AssetDatabase.ImportAsset(excelPath, ImportAssetOptions.ForceUpdate);
hasReloaded = true;
}
}
PS: Sorry for the long post, it's the first time I try coding outside Play mode and find myself really lost, thanks in advance !
Your answer
Follow this Question
Related Questions
Is it normal for Unity assets to take 24 hours to import? 4 Answers
Models for unity 1 Answer
ScriptableObjects inside another ScriptableObject not saving changes in Custom Editor Window 0 Answers
How can I get a sub asset? 1 Answer
Transferring assets from my mac to my PC breaks everything, please help! 0 Answers