2015-01-29 5 views
0

비슷한 질문을 묻는 질문을 받았지만 지금하고 싶은 것에 대한 적절한 답변을 찾을 수 없었습니다.C# 돌아 가기 참조

변수를 전달할 때 변수를 설정 해제하는 함수가 있습니다.

void DestroyEquippedItem (GameObject itemSlot) 
{ 

      if (itemSlot == itemSlot1) { 
        Destroy (itemSlot1); 
        itemSlot1 = null; 
        itemScript1 = null; 
        return; 
      } 
      if (itemSlot == itemSlot2) { 
        Destroy (itemSlot1); 
        itemSlot2 = null; 
        itemScript2 = null; 
        return; 
      } 
} 

여기에는 8 개의 항목 슬롯과이 슬롯에서 작업을 수행하는 몇 가지 다른 기능이 있습니다. 이 기능들 각각은 거의 동일하게 보입니다. 8 개의 "if"명령문 목록은 수정하려는 항목 슬롯을 파악하기 위해 내려갑니다. 나는 그런 다음 그래서

void DestroyEquippedItem (GameObject itemSlot) 
    { 
      Destroy (GetSlotFromSlot (itemSlot)); 
      GetSlotFromSlot (itemSlot) = null; 
      GetScriptFromSlot (itemSlot) = null; 
    } 

같은 것을 내 DestroyEquippedItem 기능을 바꿀 것

GameObject GetSlotFromSlot (GameObject itemSlot) 
    { 
      if (itemSlot == itemSlot1) 
        return itemSlot1; 
      if (itemSlot == itemSlot2) 
        return itemSlot2; 
    } 

로, 내가 다른 기능을 가진 아이템 슬롯에 대한 참조를 반환하여이 작업을 수행 할 수있는 더 좋은 방법을 발견했다고 생각 내 질문은 기본적으로 "내가 뭘 잘못하고 있니?"

나는 왼손잡이 과제를 할 수 없다는 것을 알고 있지만 수정할 항목에 대한 참조를 반환하면이 점을 쉽게 알아볼 수 있고 코드를 많이 줄일 수 있습니다. 내가 한 일을 할 수있는 방법이 있습니까?

부록 : itemSlot1, itemSlot2, itemScript1, itemScript2 등은 모두 인벤토리의 클래스 수준 변수입니다. 위에 표시된 이러한 기능은 또한 인벤토리에 있습니다. Destroy가하고 있지만, 당신은 당신의 get 메소드의 결과를 저장하고 그들에게 널을 할당하는 지역 변수를 사용할 수 있습니다 확실하지

Public Class Inventory : MonoBehaviour 
{ 
    GameObject itemSlot1; 
    GameObject itemSlot2; 
    EquipItem itemScript1; 
    EquipItem itemScript2; 
    //etc... 

    void DestroyEquippedItem(...) 
    { 
    ... 
    } 
} 

답변

0

:

void DestroyEquippedItem (GameObject itemSlot) 
{ 
     var item = GetSlotFromSlot(itemSlot); 
     var script = GetScriptFromSlot(itemSlot); 
     Destroy (GetSlotFromSlot (itemSlot)); 
     item = null; 
     script = null; 
} 
+0

파괴는 유니티 방법이다

그러나, 당신이하고 싶은 것 것은 파괴하고 itemSlot 목록에있는 개체 중 하나를 무효화 단순히 . 게임 객체를 다음 프레임에서 제거 할 플래그로 지정하여 간단하게 처리합니다. 편집 : 제출하겠다는 뜻이 아니 었습니다. 지역 변수를 사용하지 않으면 지역 변수가 null로 설정됩니까? 클래스 수준 변수를 null로 설정해야합니다. – Jordan

+1

로컬 변수에는 클래스 수준 변수와 동일한 객체를 가리키는 참조가 지정됩니다. 그래서 GetSlotFromSlot과 GetScriptFromSlot에서 반환하는 것과 동일한 것입니다. –

0

이이 간단한 루프 해결 될 수있는 것 같아 . 나는 당신에게 일종의 아이템 슬롯 배열이 있다고 가정하고 있습니까? (당신이 하나씩 점검하고 있기 때문에).

foreach (int itemSlot in itemArray) 
{ 
    Destroy (itemSlot); 
    itemSlot = null; 
    GetScriptFromSlot(itemslot) = null; 
} 

은 또한 당신이 뭘하려는 건지 전혀 모르겠어요,하지만 당신은 모든 변수를 열거하는 것보다 무슨 일을하는지 할 수있는 더 나은 방법이 있습니다.

0

귀하의 코드는 여러 단계에서 길을 잃었 음을 나타내므로 시작하기가 어려워요.

먼저 떨어져, 대신 게임 오브젝트 8 개 변수를 필요없이, 시도는 :

private GameObject[] itemSlots = new GameObject[8]; 

또한 참조가 작동하는 방식에 대해 혼란스러워 보인다. 메서드에서 참조를 반환하고 원하는대로 수행 할 수 있습니다. 그냥 먼저 지역 변수에 대한 참조를 저장 :

GameObject go = GetObjectFromSomeThing(); 
Destroy(go); 

그냥 go = null을 설정하면 여기 당신을 위해 많은 일을하지 않을 것을 명심, go 당신이 다른 곳에서 참조하는 객체에 대한 새로운 참조이기 때문이다.

public DestroyEquippedItem(int index) { 
    if (this.itemSlots[index] != null) { 
     Destroy(this.itemSlots[index]); 
     this.itemSlots[index] = null; 
    } 
} 

그리고 그것을 사용하는 :

// Destroy itemSlot 2 
DestroyEquippedItem(2);