2017-07-09 31 views
0

我創建了一個可以工作的庫存系統,但是我在實例化預製時遇到了問題。基本上,用戶在開始時被賦予兩個項目(項目1 &項目2)如果他們希望他們可以購買額外的物品(讓物品2放置),但物品可放置的區域有限制(4)。如果區域內的物品達到4以上,除了實例化的預製物品之外,所有物品都會發回到他們的位置,它們會被髮送到一個空的gameObject。Unity2D:庫存系統 - 出現在原始對象前面的實例化預製

我的問題:

說喜歡我放置在兩個項目2(原件及預製實例化)的下降,然後被放下三項1下來的所有項目將被送回,然後拖動項目之後2進入該區域,當我繼續嘗試將項目1(原始obj)拖到該區域時,它似乎拖動實例化的預製件而不是原始obj,從而使原始obj更改尺寸並更改圖層中的順序。

我的腳本:

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); 
     } 
    } 

的腳本實例化的組合屋:

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); 
    } 
} 

額外的信息:

  • 組合屋的所有具有相同的標籤,原來的項目。

謝謝:)

回答

1

作爲一項規則,嘗試緩存的GameObject.Find()的結果,因爲它會佔用性能,在你的情況下,它使代碼確實混亂。有關更多信息,請參閱the documentation

您的問題可能來自雙if (Input.GetMouseButtonUp(0))子句。實際上,每次您發佈點擊時都會調用它,因此每次點擊都會爲兩個項目完成檢查。如果你已經有兩個問題,當你有三個或四個時會發生什麼?也許你應該重新考慮你的方法。

下面是您的代碼的等價物,希望它可以幫助您瞭解正在發生的事情。

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