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;
}
}
이제 유니티가 텍스처를 임포트 할 때마다 다음과 같은 매개 변수가 생깁니다 :
포스트 프로세서를 사용하는 경우 편집기에서 가져 오기 설정 을 조작하여 텍스처 매개 변수를 변경할 수 없습니다.
적용 버튼을 누르면 텍스처가 다시 가져오고 포스트 프로세서 코드가 다시 실행됩니다.
기본 수입업자
가져 오기 도구를 만들려는 사용자 지정 파일이 있다고 가정합니다. 그것은 .xls 파일이나 뭐든지 될 수 있습니다. 이 경우 쉽기 때문에 JSON 파일을 사용할 것이지만 사용자 정의 확장을 선택하여 어떤 파일이 우리의 파일인지 쉽게 알 수 있습니다.
JSON 파일의 형식이
{
"someValue": 123,
"someOtherValue": 456.297,
"someBoolValue": true,
"someStringValue": "this is a string",
}
Example.test
를 현재 자산 외부 의 어딘가에 저장해 봅시다.
다음으로 데이터 용 사용자 정의 클래스로 MonoBehaviour
를 만듭니다. 커스텀 클래스는 JSON을 deserialize하기 쉽도록하기위한 클래스입니다. 사용자 정의 클래스를 사용할 필요는 없지만이 예제를 더 짧게 만듭니다. 우리는 이것을 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
폴더를 만듭니다. 나는 어느 수준이든 될 수있다. Editor 폴더에서 TestDataAssetPostprocessor.cs
파일을 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
와 Example.test.prefab
. 모델 수입업자처럼 작동하도록하는 것이 좋을 것입니다. 마술처럼 Example.test
AssetBundle
이나 그런 것들이 있습니다. 이 예제를 어떻게 제공했는지 알고 있다면