2014-07-12 2 views
1

나는이 아이템의 목록을 보여주는 배열의 스크립트를 가지고 있습니다.유니티 3D에서 아이템 셔플 링

이제 일이 난 단지 당신이 할 때마다 동일한 목록을 가질 수 있도록 내가하면 생각

새로운 게임을 시작, 5 ~ 10에서 나타난 항목도 단행이이 목록을 원하는되고있다 구현 된 Random.Range이어야하지만 어디에 있는지 잘 모릅니다.

도와주세요.해야 할 일을 설명하십시오. 나는 아직도 이것에 조금 새로운 감사합니다. 나는 당신이 어떤 항목을 제거하지 않고 그대로 items를 마칠 수 있습니다 가정

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class RayCasting : MonoBehaviour 
{ 
    public float pickupDistance; 
    public List<Item> items; 

    #region Unity 
    void Start() 
    { 
     Screen.lockCursor = true; 
    } 

    void Update() 
    { 
     RaycastHit hit; 
     Ray ray = new Ray(transform.position, transform.forward); 
     if (Physics.Raycast(ray, out hit, pickupDistance)) 
     { 
      foreach(Item item in items) 
      { 
       if(Input.GetMouseButtonDown(0)) 
       { 
        if (item.gameObject.Equals(hit.collider.gameObject)) 
        { 
         numItemsCollected++; 
         item.Collect(); 
         break; 
        } 
       } 
      } 
     } 
    } 

    void OnGUI() 
    { 
     GUILayout.BeginArea(new Rect(130,400,100,100)); 
     { 
      GUILayout.BeginVertical(); 
      { 
       if (numItemsCollected < items.Count) 
       { 
        foreach (Item item in items) 
        { 
         GUILayout.Label(string.Format("[{0}] {1}", item.Collected ? "" + item.password: " ", item.name)); 
        } 
       } 
       else 
       { 
        GUILayout.Label("You Win!"); 
       } 
      } 
      GUILayout.EndVertical(); 
     } 
     GUILayout.EndArea(); 
    } 
    #endregion 

    #region Private 
    private int numItemsCollected; 
    #endregion 
} 

[System.Serializable] 
public class Item 
{ 
    public string name; 
    public GameObject gameObject; 
    public int password; 

    public bool Collected { get; private set; } 

    public void Collect() 
    { 
     Collected = true; 
     gameObject.SetActive(false); 
    } 

    public void passwordNumber() 
    { 
     password = 0; 
     Collected = true; 
     gameObject.SetActive(false); 
    } 
} 

답변

1

, 그래서 나는 당신의 5 임의 항목이 포함됩니다 finalItems라는 두 번째 목록을 작성 좋을 것 :

여기 스크립트입니다.

public List<Item> items; 
public List<Item> finalItems; 

#region Unity 
void Start() 
{ 
    Screen.lockCursor = true; 

    // Do a while loop until finalItems contains 5 Items 
    while (finalItems.Count < 5) { 
     Item newItem = items[Random.Range(0, items.Count)]; 
     if (!finalItems.Contains(newItem)) { 
      finalItems.Add(newItem); 
     } 
    } 
} 

다음 foreach 문에서

, 루프 finalItems 대신 items을 통해.

이것은 모든 게임에서 5 개의 임의 항목을 제공합니다!

+0

귀하의 스크립트는 항목의 이름을 표시하지 않는 것 같습니다. finalItems에 다른 클래스를 만들어야할까요? 그래야 GUI에 넣을 변수를 만들 수 있습니까? – Ghostdre

+0

Im 여전히 무작위로 추출 할 수 없다. Im이 잘못하고 있는지 알 수 없다. foreach 문에있는 모든 항목을 finalItem으로 바꾸고 나머지 코드를 플러그인했지만 임의로 볼 수는 없습니다. – Ghostdre

+0

난 그냥 위의 코드에서 벗어나, 난 그것을 테스트하지 않았습니다. 나는 랜덤 함이 효과가 있다고 생각한다. 런타임 중에 RayCasting 구성 요소를 검사하면 finalItems에 5 개의 항목이 포함되어 있습니까? 그들은 무작위인가? 'items'가 더 이상 사용되지 않도록하려면 (다른 곳에서 사용하는 경우)'Start' 함수의 끝에'items.Clear()'를 호출하여 오류를 던지십시오. 랜덤 함은'finalItems'과 함께 있어야합니다.'Random.Range'가 전부이기 때문입니다. –