2016-11-28 20 views
0

Imは、モジュール式の宇宙船に取り組んでいます。船にはハードポイントがあり、モジュールを保持しており、モジュールなどを保持することができます。インスタンス化されたゲームオブジェクトは、プレハブのように機能します。

この時点でのハードポイントのコードは非常に単純です。

public class Hardpoint : MonoBehaviour { 
    public GameObject holds; //this holds the prefab 
    public ComponentObject.Type[] canHold; 
    private GameObject heldInstance; //this holds an instance of the prefab 

    public void SpawnComponent() { 
     Clear(); 
     heldInstance = Instantiate(holds, transform.position, transform.rotation) as GameObject; 
     heldInstance.transform.SetParent(transform); 
    } 

    public void RollThroughDecompression(CompressedComponent c) { 
     heldInstance.GetComponent<ComponentObject>().Decompress(c); 
    } 

    public void Clear() { 
     foreach (Transform child in transform) 
     { 
      Destroy(child.gameObject); 
     } 
    } 
} 

しかし、それはすべてプレハブのように動作します。私は取得していますエラーメッセージがあるため:

Destroying assets is not permitted to avoid data loss. If you really want to remove an asset use DestroyImmediate (theObject, true);

Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption.

私は完全にこの時点で迷ってしまいました。誰も正しい方向に私はこれらのエラーがポップアップを維持する理由について私を指摘できますか?

編集: いくつかのスクリーンショット。

期待される結果:

Expected Result

実際の結果:それはすべてEmptyHardpointで始まる

Actual Result

。あなたが見ることができるように、コックピットをスポーンし、EmptyHardpointを親として設定します。しかし、それが楽しみが終わる場所です。さらにGameobjectsはあたかもプレハブであるかのように扱われます。

伸長コード:

public void Decompress(CompressedComponent c) { 
    componentType = (Type)Enum.Parse(typeof(Type), c.componentType); 
    componentNumber = c.componentNumber; 
    UpdateHardPoints(); 
    GameObject[] typeRepository = GetRepository(componentType); 

    //update children 
    int point = 0; 
    foreach (Transform child in typeRepository[componentNumber].transform) 
    { 
     Hardpoint hardpoint = child.GetComponent<Hardpoint>(); 
     if (hardpoint != null) { 
      Debug.Log("Hardpoint found in " + child.transform.parent.name); 
      if (c.hardpoints[point] != null) { 
       //get the hardpoint's repository 
       GameObject[] hardpointRepo = GetRepository((Type)Enum.Parse(typeof(Type), c.hardpoints[point].componentType)); 
       //set the hardpoint to hold this object 
       hardpoint.holds = hardpointRepo[c.hardpoints[point].componentNumber]; 
       hardpoint.SpawnComponent(); 
       hardpoint.RollThroughDecompression(c.hardpoints[point]); 
       point++; 
      } 
     } 
    } 
} 

CompressedComponentは単にモジュラーオブジェクトの種類を保持しています。シーン内のリポジトリからロードされたものです(私はそれが面倒だと知っています、後で解決します)。

+0

これらのエラーにつながる船のシーン階層のスクリーンショットを表示できますか?これらのエラーは 'Clear()'を呼び出すときにだけスローされますか? – Serlite

+0

'Hardpoint'を'インスタンス化 'しましたか? –

+0

@ Serlite 'Clear()'は最初のエラーメッセージだけをスローします。親を設定するときに2番目のエラーメッセージが表示されます。 @CùĐứcHiếu私は本当に正直であるか分からない。私はネットワーキングを使用していますが、プレーヤーとして、私は動きを制御するために、追加のスクリプトで 'hardpoint'を使用しています。 –

答えて

1

CùĐứcHiếuのおかげで、間違った場所を探していました。減圧中に私は変換の代わりに実際のプレハブをループしていました。修正されたコード:

foreach (Transform child in transform) 
     { 
      Hardpoint hardpoint = child.GetComponent<Hardpoint>(); 
      if (hardpoint != null) { 
       Debug.Log("Hardpoint found in " + child.transform.parent.name); 
       if (c.hardpoints[point] != null) { 
        //get the hardpoint's repository 
        GameObject[] hardpointRepo = GetRepository((Type)Enum.Parse(typeof(Type), c.hardpoints[point].componentType)); 
        //set the hardpoint to hold this object 
        hardpoint.holds = hardpointRepo[c.hardpoints[point].componentNumber]; 
        hardpoint.SpawnComponent(); 
        hardpoint.RollThroughDecompression(c.hardpoints[point]); 
        point++; 
       } 
      } 
     } 
関連する問題