2017-09-01 4 views
0

私は、新しいモデルをインポートするときに必要な、面倒な作業の多くを行うための[menuitem]スクリプトを書いています - >準備したプレハブ。これは面倒で反復的な作業であり、私はどのように把握することができない限り、スクリプト作成には完璧です。正しいメッシュを見つけるためのスクリプトを手に入れることができないので、それを適切かつ自動的にプレハブメッシュコライダーコンポーネントに追加することができます。Unity:assetsDatabase内のオブジェクトメッシュをプログラムでどのように見つけるか?

問題が発生するのは、オブジェクトをUnityにインポートすると、すべてのオブジェクトのメッシュは単に「デフォルト」という名前になります。その名前のメッシュファイルのアセットをどこで検索すれば、私は適切なファイルを得ることができず、私のオブジェクトの1つのランダムなレンダラーが得られます。

私の問題は、間接的にメッシュに対処する良い方法を見つけることです。広範な検索や長い散歩の後、私は良い解決策を考えることができません。手動でメッシュを割り当てることは、モデルの量のために長期的に実現可能ではありません。

ここでは、「デフォルト」のメッシュファイル構造イメージを得るのが難しいフォルダ構造のスクリーンショットを示します。

enter image description here

Psが:私は私のメッシュコライダーにメッシュを割り当てる方法を知って、それはそれはそもそも右メッシュに団結を指すことができることが、問題ではありません。

+0

を使用したコードがありますか?コードを表示してください。 – Soviut

+0

私の問題は、資産データベースの負荷資産のすべてを実際に理解していなかったことです。理解していれば、段階的にテストするのに十分な方法を考えていませんでした。私が答えて言ったように、私は回避策を使って問題を解決しましたが、資産経路を通じてメッシュに対処する根本的な問題は、まだ私にとっては謎であることです。私はうまくいくソリューションを実装するのが好きではありませんが、私が学ぶプロジェクトでは分かりません。目的を破る。 :/ – TheLemur

答えて

-1

最終的に、私は問題の中核を解決していませんでした。しかし、メッシュフィルターが割り当てたメッシュに対処することで回避策を見つけることができました。正しいメッシュが既に割り当てられています。

編集:ここで私はあなたがこれまでに試してみました何

using UnityEditor; 
using UnityEngine; 
public class MazeMenuScript : MonoBehaviour 
{ 
// Add a menu item named "CreateMazePiece" to Maze in the menu bar. 
/// <summary> 
/// Turns a selected object(s) into a Prefab and ads it to the list of set `enter code here`pieces 
/// </summary> 
[MenuItem("Maze/CreateMazePiece")] 
static void DoCreateMazePiecePrefab() 
{ 
    Transform[] transforms = Selection.transforms; 
    foreach (Transform t in transforms) 
    { 
     Debug.Log("Creating a prefab out of " + t.gameObject.name); 
     //Add mesh collider 
     MeshCollider mc = t.gameObject.AddComponent<MeshCollider>(); 
//this is the magic line that solved the problem: 
     mc.sharedMesh = t.gameObject.GetComponentInChildren<MeshFilter>().sharedMesh; 
     Debug.Log("Mesh collider with mesh added"); 

     Object prefab = PrefabUtility.CreateEmptyPrefab("Assets/Resources/UnsortedMazePrefabs/" + t.gameObject.name + ".prefab"); 
     PrefabUtility.ReplacePrefab(t.gameObject, prefab, ReplacePrefabOptions.ConnectToPrefab); 
     DestroyImmediate(t.gameObject); 

     AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GetAssetPath(Selection.activeObject)); 
    } 
} 

}

+0

あなたの回答を使用したコードで更新してください。 – Soviut

+0

Okey、問題ありません:) – TheLemur

関連する問題