2016-04-12 30 views
0

私は3種類のGameObject、すなわちblueBook、redBook、greenBookを持っています。シーンには2枚のブルーブック、7枚のレッドブック、4枚のグリーンブックがあります。ゲームオブジェクトの変数を配列に格納する[Unity]

それぞれ3つのプロパティを持つ次のスクリプト例が割り当てられています。新しいクラスで

public class blueBook : MonoBehaviour { 

    public string type = "BlueBook"; 
    public string colour = "Blue"; 
    public float weight; 
    float s; 

    void Start() { 
     float weightValue; 
     weightValue = Random.value; 
     weight = Mathf.RoundToInt (700*weightValue+300); 
     s=weight/1000; //s is scale ratio 
     transform.localScale += new Vector3(s,s,s); 
    } 

    // Update is called once per frame 
    void Update() { 
    } 
} 

、私はゲームオブジェクト(タイプ、色、重量)のすべての変数を取ると、アレイ内に格納します。これを行う方法?

これらがすべてアレイ内に格納された後、ユーザーは重みを入力します。次に、別のクラスは、すべての情報を検索して、同じ量の重みで(シーン内の)配列とゲームオブジェクトの両方を削除します。

ありがとうございます。


UPDATE


blueBook.cs

public class blueBook: MonoBehaviour { 

public string type = "blueBook"; 
public string colour = "Red"; 
public float weight; 
float s; 

void Start() { 
    float weightValue; 
    weightValue = Random.value; 
    weight = Mathf.RoundToInt (500*weightValue+100); 
    s=weight/1000; //s is scale ratio 
    transform.localScale += new Vector3(s,s,s); 
    Debug.Log(weight); 
} 

// Update is called once per frame 
void Update() { 
} 

}

block.cs

public class block: MonoBehaviour{ 

public List<GameObject> players; 

    void Start() 
    { Debug.Log(players[1].GetComponent<blueBoook>().weight); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 

block.csのdebug.logは、毎回0のイベントを表示します。それ以外の場合は、bluebook.csのdebug.logに表示されます。それは最初の数字を表示したからですか?私はワットが間違っていることは知らない。

+0

ユーザがウェイトだけを入力した場合、他の2つのプロパティを格納する必要はありませんか?あるいは、それは単なる例であり、ユーザは3つのいずれかを挿入することができましたか?私は重みをキーとして辞書を構築することを提案します。あるいは、ゲームオブジェクトのリストでは、値: 'Dictionary >です。すべてのオブジェクト(例:パブリック配列+インスペクタまたはタグによる検索)を取得し、それらを辞書にソートするものが必要です(その重さのキーがある場合はリストを追加し、そうでなければ新しいエントリを作成します)。 –

+0

変数はスクリプト内にあります。それぞれに既に独自の変数があります。ユーザーの入力はアイテムのみを削除し、それ以外のものは削除しません。コーディングの例でそれを行う方法を教えてください。 – whoami

+0

私はそれらのgameobjectsを配列に格納し、変数にアクセスできますか? – whoami

答えて

1

リスト内のすべてのブロックについて、パブリックリストを持つスクリプトを作成して、すべてのゲームオブジェクトをインスペクタのリストにドラッグすることができます。

using System.Collections.Generic; 

public class ObjectHolder : MonoBehaviour 
{ 
    public List<GameObject> theBooks; 

    // You can remove by weight e.g. like this 
    public void DeleteByWeight(float inputWeight) 
    { 
     for(int i = theBooks.Count - 1; i >= 0; i--) 
     { 
      if(theBooks[i].GetComponent<Book>().weight == inputWeight) 
       Destroy(theBooks[i]); 
       theBooks.RemoveAt(i); 
      } 
     } 
    } 
} 

ブロック上のスクリプトは、すべての(私の例ではBook)に同じ名前に変更する必要があります。あなたのコードからは、メンバーの価値が異なるだけなので問題ありません。

+0

スクリプトを同じ名前に変更することはできますか? – whoami

+0

クラスの名前を変更することができます。ファイルの名前を変更するだけで十分です。あなたはそれらのスクリプトの1つだけを必要とします。インスペクタで適切な名前/タイプを設定します。 (新しいスクリプトを作成してコピーすることもできます) –

+0

Debug.Log(theBlocks [i] .GetComponent ().weight == inputWeight)を使用すると表示されません。 – whoami

関連する問題