unity3d
輸入者および(ポスト)プロセッサ
サーチ…
構文
- AssetPostprocessor.OnPreprocessTexture()
備考
String.Contains()
を使用して、指定された文字列をアセット・パスに持つアセットのみを処理します。
if (assetPath.Contains("ProcessThisFolder"))
{
// Process asset
}
テクスチャポストプロセッサ
Assetsフォルダの任意の場所にTexturePostProcessor.cs
ファイルを作成します。
using UnityEngine;
using UnityEditor;
public class TexturePostProcessor : AssetPostprocessor
{
void OnPostprocessTexture(Texture2D texture)
{
TextureImporter importer = assetImporter as TextureImporter;
importer.anisoLevel = 1;
importer.filterMode = FilterMode.Bilinear;
importer.mipmapEnabled = true;
importer.npotScale = TextureImporterNPOTScale.ToLarger;
importer.textureType = TextureImporterType.Advanced;
}
}
今、Unityがテクスチャをインポートするたびに、以下のパラメータがあります:
ポストプロセッサーを使用する場合、エディターでのインポート設定を操作してテクスチャーパラメーターを変更することはできません。
[ 適用 ]ボタンを押すとテクスチャが再インポートされ、ポストプロセッサコードが再び実行されます。
基本的な輸入業者
インポータを作成するカスタムファイルがあるとします。それは.xlsファイルなんでもかまいません。この場合はJSONファイルを使用しますが、これは簡単ですが、カスタム拡張を選択して、どのファイルが私たちのものであるかを簡単に判別できるようにします。
JSONファイルの形式が
{
"someValue": 123,
"someOtherValue": 456.297,
"someBoolValue": true,
"someStringValue": "this is a string",
}
Example.test
として資産の外のどこかに保存しましょう。
次に、データ用のカスタムクラスを持つMonoBehaviour
を作成します。カスタムクラスは、JSONの逆シリアル化を容易にするためのものです。カスタムクラスを使用する必要はありませんが、この例は短くなります。これをTestData.cs
保存しTestData.cs
using UnityEngine;
using System.Collections;
public class TestData : MonoBehaviour {
[System.Serializable]
public class Data {
public int someValue = 0;
public float someOtherValue = 0.0f;
public bool someBoolValue = false;
public string someStringValue = "";
}
public Data data = new Data();
}
そのスクリプトをGameObjectに手動で追加する場合は、
次に、 Assets
下にEditor
フォルダを作成します。私はどんなレベルでもよい。エディターフォルダー内にTestDataAssetPostprocessor.cs
ファイルを作成し、これを配置します。
using UnityEditor;
using UnityEngine;
using System.Collections;
public class TestDataAssetPostprocessor : AssetPostprocessor
{
const string s_extension = ".test";
// NOTE: Paths start with "Assets/"
static bool IsFileWeCareAbout(string path)
{
return System.IO.Path.GetExtension(path).Equals(
s_extension,
System.StringComparison.Ordinal);
}
static void HandleAddedOrChangedFile(string path)
{
string text = System.IO.File.ReadAllText(path);
// should we check for error if the file can't be parsed?
TestData.Data newData = JsonUtility.FromJson<TestData.Data>(text);
string prefabPath = path + ".prefab";
// Get the existing prefab
GameObject existingPrefab =
AssetDatabase.LoadAssetAtPath(prefabPath, typeof(Object)) as GameObject;
if (!existingPrefab)
{
// If no prefab exists make one
GameObject newGameObject = new GameObject();
newGameObject.AddComponent<TestData>();
PrefabUtility.CreatePrefab(prefabPath,
newGameObject,
ReplacePrefabOptions.Default);
GameObject.DestroyImmediate(newGameObject);
existingPrefab =
AssetDatabase.LoadAssetAtPath(prefabPath, typeof(Object)) as GameObject;
}
TestData testData = existingPrefab.GetComponent<TestData>();
if (testData != null)
{
testData.data = newData;
EditorUtility.SetDirty(existingPrefab);
}
}
static void HandleRemovedFile(string path)
{
// Decide what you want to do here. If the source file is removed
// do you want to delete the prefab? Maybe ask if you'd like to
// remove the prefab?
// NOTE: Because you might get many calls (like you deleted a
// subfolder full of .test files you might want to get all the
// filenames and ask all at once ("delete all these prefabs?").
}
static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
foreach (var path in importedAssets)
{
if (IsFileWeCareAbout(path))
{
HandleAddedOrChangedFile(path);
}
}
foreach (var path in deletedAssets)
{
if (IsFileWeCareAbout(path))
{
HandleRemovedFile(path);
}
}
for (var ii = 0; ii < movedAssets.Length; ++ii)
{
string srcStr = movedFromAssetPaths[ii];
string dstStr = movedAssets[ii];
// the source was moved, let's move the corresponding prefab
// NOTE: We don't handle the case if there already being
// a prefab of the same name at the destination
string srcPrefabPath = srcStr + ".prefab";
string dstPrefabPath = dstStr + ".prefab";
AssetDatabase.MoveAsset(srcPrefabPath, dstPrefabPath);
}
}
}
これを保存すると、上記で作成したExample.test
ファイルをUnity Assetsフォルダにドラッグアンドドロップでき、対応するプレハブが作成されているはずです。 Example.test
を編集すると、プレハブのデータがすぐに更新されることがわかります。プレハブをシーン階層にドラッグすると、それが更新され、 Example.test
変更が表示されます。 Example.test
を別のフォルダに移動すると、対応するプレハブも一緒に移動します。インスタンスのフィールドを変更した場合、 Example.test
ファイルを変更すると、インスタンス上で変更しなかったフィールドのみが更新されます。
改良点:上記の例では、 Example.test
をAssets
フォルダにドラッグすると、 Example.test.prefab
とExample.test
の両方が表示されます。モデルのインポーターがうまく動作するように知っておくといいでしょう。魔法のようにExample.test
しか表示されず、 AssetBundle
やそのようなものです。あなたがその例をどのように提供しているか分かっているなら