2017-07-09 11 views
0

インベントリシステムが作成されましたが、インスタンス化されたプレハブに問題があります。基本的に、ユーザーには冒頭に2つのアイテム(item1 & item2)が与えられます。もし彼らが望むのであれば、余分なアイテム(1日目のアイテム2を買うことができる)を買うことができますが、アイテムを置くことができるエリアには制限があります(4)。エリア内のアイテムが4以上になると、インスタンス化されたプレハブ以外のすべてのアイテムがスロットに返され、空のgameObjectに送信されます。Unity2D:インベントリシステム - インスタンス化されたプレハブが元のオブジェクトの前に現れる

私の問題:私はその後、アイテムをドラッグした後、ダウンアイテム2(オリジナル及びインスタンス化プレハブ)のうちの2つを配置した後、返送されるダウンのすべての項目を項目1の3つダウン配置よう

は言います2を領域にドラッグしようとすると、項目1(元のobj)をその領域にドラッグしようとすると、オリジナルのobjではなくインスタンス化されたprefabがドラッグされて表示され、元のobjのサイズが変更され、

public void InstaniateItem() { 
    GameObject item = (GameObject)Instantiate (ItemPrefab); 
    item.transform.position = transform.position; 
    item.transform.parent = transform; 
    item.SetActive (true); 
    if (slot.childCount < 0) { 
     slotHolder.SetActive (false); 
    } 
} 

追加情報:インスタンス化されたプレハブのための

private Vector3 screenPoint; 
private Vector3 offset; 
public Transform item1, item2; 
public GameObject otherItems,otherItems2 

void Awake() { 
    item1 = GameObject.FindWithTag ("item1").transform; 
    item2 = GameObject.FindWithTag ("item2").transform; 
} 

void OnMouseDrag() 
{ 
    //if (canDrag == true) { 
     Vector3 curScreenPoint = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); 
     screenPoint.z = 10; 
     Vector3 curPosition = Camera.main.ScreenToWorldPoint (curScreenPoint); // + offset 

     transform.position = curPosition; 
    //} 
} 
void Update() 
{ 

    //1 
    if (Input.GetMouseButtonUp (0)) { 
     if (!GameObject.Find ("Aera Floor").GetComponent<SlotController>().item1Placed) { 
      item1.localPosition = Vector3.zero; 
      rend1.sortingOrder = 1; 
      //otherItems.SetActive (false); 
     } else if (GameObject.Find ("Aera Floor").GetComponent<SlotController>().item1Placed) { 
      screenPoint = Camera.main.WorldToScreenPoint (gameObject.transform.position); 
      rend1.sortingOrder = -1; 
      otherItems.SetActive (true); 
      //canDrag = false; 
     } 
    } 

    //2 
    if (Input.GetMouseButtonUp (0)) { 
     if (!GameObject.Find ("Aera Floor").GetComponent<SlotController>().item2Placed) { 
      item2.localPosition = Vector3.zero; 
      rend2.sortingOrder = 1; 
      //otherItems2.SetActive (false); 
     } else if (GameObject.Find ("Aera Floor").GetComponent<SlotController>().item2Placed) { 
      screenPoint = Camera.main.WorldToScreenPoint (gameObject.transform.position); 
      rend2.sortingOrder = -1; 
      otherItems2.SetActive (true); 
      //slotHolder.SetActive (true); 
      //canDrag = false; 
     } 
    } 
    if (GameObject.Find ("Aera Floor").GetComponent<SlotController>().item1Placed) { 
     if (GameObject.Find ("Aera Floor").GetComponent<SlotController>().item2Placed) { 
      slotHolder.SetActive (true); 
     } 
    if (GameObject.Find ("Aera Floor").GetComponent<SlotController>().item2Placed) { 
     if (GameObject.Find ("Aera Floor").GetComponent<SlotController>().item1Placed) { 
      slotHolder.SetActive (true); 
     } 
    } 

スクリプト:

マイスクリプト

  • プレハブのすべては、元のアイテムと同じタグを持っています。

いただきありがとうございます:)

答えて

1

を原則として、それがパフォーマンスを豚や、あなたのケースでは、それはコードが実際に雑然となりますので、GameObject.Find()の結果をキャッシュしてみてください。詳細はthe documentationを参照してください。

問題は二重if (Input.GetMouseButtonUp(0))句に由来する可能性があります。これはクリックをリリースするたびに実際に呼び出されるため、クリックごとに両方のアイテムのチェックが行われます。すでに2つのアイテムで問題が発生している場合は、3つまたは4つの場合はどうなりますか?おそらく、あなたのアプローチを考え直すべきでしょう。

以下はコードと同じですが、何が起こっているのかを明確にするのに役立ちます。

void Awake() { 
    item1 = GameObject.FindWithTag ("item1").transform; 
    item2 = GameObject.FindWithTag ("item2").transform; 
    SlotController slotCtrl = GameObject.Find ("Aera Floor").GetComponent<SlotController>(); 
} 

void Update() 
{ 

if (Input.GetMouseButtonUp (0)) { 
    if (!slotCtrl.item1Placed) { 
     item1.localPosition = Vector3.zero; 
     rend1.sortingOrder = 1; 
     //otherItems.SetActive (false); 
    } else { 
     screenPoint = Camera.main.WorldToScreenPoint (gameObject.transform.position); 
     rend1.sortingOrder = -1; 
     otherItems.SetActive (true); 
     //canDrag = false; 
    } 

    if (slotCtrl.item2Placed) { 
     item2.localPosition = Vector3.zero; 
     rend2.sortingOrder = 1; 
     //otherItems2.SetActive (false); 
    } else { 
     screenPoint = Camera.main.WorldToScreenPoint (gameObject.transform.position); 
     rend2.sortingOrder = -1; 
     otherItems2.SetActive (true); 
     //slotHolder.SetActive (true); 
     //canDrag = false; 
    } 
} 

if (slotCtrl.item1Placed && slotCtrl.item2Placed) { 
     slotHolder.SetActive (true); 
    } 
} 
+0

ありがとうございました、あなたのスクリプトは動作しました!!!!!!私は少しそれを変更する必要があったが、全体的に私はあなたの助けなしにそれを行うことができませんでした!ありがとうございました!!!! –

+0

喜んで:) – naturalbornlazy

関連する問題