2016-04-18 5 views
0

基本的に私はプレハブ「badGuy」を作成しました。そのうち3種類があります。それぞれに独自のスプライトイメージがあります。私は列挙型を持っていなかったので、私は私のプレハブのための1つの画像を使用しているすべてに沿ってプレハブをスプライトのイメージでインスタンス化する列挙型を作成する方法

public enum BadGuyType { 
    green, 
    blue, 
    red 
} 

:だから、私はBadGuyのプレハブに添付スクリプトに次の列挙型を作成しました。

public GameObject badGuy; //I set this in the inspector 
void Start() { 

badGuys= new List<GameObject>(); 

int numberOfBadGuys = 6; 
Camera camera = GameObject.FindGameObjectWithTag ("MainCamera").GetComponent<Camera>(); 

for (int i = 1; i < numberOfBadGuys + 1; i++) { 
    GameObject badGuyObject = (GameObject)Instantiate(badGuy, new Vector3(Screen.width*i/2, Screen.height*i/6, camera.nearClipPlane), Quaternion.identity); 
    badGuys.Add(badGuyObject); 
} 

を私はBadGuyType列挙のために(好ましくは、プログラム)の画像を設定することができますいつ、どのようにそれらを選択:私はインスペクタを通してそれを追加し、それをインスタンス化する回数を以下のようにするためにBadGuyのゲームオブジェクトは、パブリックプロパティを持っていましたbadGuyのゲームオブジェクトをインスタンス化しますか?

答えて

1

それぞれのbadGuyに独自のプロパティを設定する場合は、badguysの一般的なクラスを作成し、その中にすべての変数を配置する必要があります。 BadGuysManagerという名前のスクリプトを作成し、悪意のある人の行動をそこに実装するか、下の方からコピーします。

関数のシグネチャ:あなたのtest.csスクリプトで

void createBadGuy(GameObject badGuyPrefab, BadGuyType badGuyType, Vector3 badGuyPosition) 
void setBadGuyType(BadGuyType badGuyType) 
BadGuyType getBadGuyType() 
void killBadGuy() 
GameObject getBadGuyGameObject() 

、あなたはリストでBadGuysManagerスクリプトを追加することができます。

public class test : MonoBehaviour 
{ 
    //Attch the gameObject bad guy here 
    public GameObject badGuyPrefab; 

    List<BadGuysManager> badGuys = new List<BadGuysManager>(); 

    // Use this for initialization 
    void Start() 
    { 
     /////////////////////////////////////CREATE 3 bad guys with different colors 

     //Bad Guy 1, Green Color 
     badGuys.Add(gameObject.AddComponent<BadGuysManager>()); 
     badGuys[0].createBadGuy(badGuyPrefab, BadGuyType.green, Vector3.zero); 

     //Bad Guy 2, Blue Color 
     badGuys.Add(gameObject.AddComponent<BadGuysManager>()); 
     badGuys[1].createBadGuy(badGuyPrefab, BadGuyType.blue, Vector3.zero); 

     //Bad Guy 3, Red Color 
     badGuys.Add(gameObject.AddComponent<BadGuysManager>()); 
     badGuys[2].createBadGuy(badGuyPrefab, BadGuyType.red, Vector3.zero); 

     /////////////////////////////////////CHANGE bad guy type later on 
     //badGuys[0].setBadGuyType(BadGuyType.green); 

     /////////////////////////////////////READ bad guy type 
     //BadGuyType badGuyType = badGuys[0].getBadGuyType(); 

     /////////////////////////////////////Get bad guy 
     //GameObject badGuy = badGuys[0].getBadGuyGameObject(); 

     /////////////////////////////////////KILL bad guy type 
     //badGuys[0].killBadGuy(); 

    } 
} 

BadGuysManager .csスクリプトのコードは次のとおりです。これはあなたを始めるはずです。 BadGuysManagerクラスに、より多くの機能を簡単に拡張または追加することができます。

public class BadGuysManager : MonoBehaviour 
{ 
    private GameObject badGuy; //I set this in the inspector 
    private BadGuyType playerGuyType = BadGuyType.NONE; 

    public void setBadGuyType(BadGuyType badGuyType) 
    { 
     playerGuyType = badGuyType; 

     if (badGuy == null) 
     { 
      Debug.Log("Failed to set color because Bad Guy Prefab is null! Call createBadGuy function first"); 
      return; //exit 
     } 
     if (badGuyType == BadGuyType.green) 
     { 
      badGuy.GetComponent<MeshRenderer>().material.color = Color.green; 
     } 
     else if (badGuyType == BadGuyType.blue) 
     { 

      badGuy.GetComponent<MeshRenderer>().material.color = Color.blue; 
     } 
     if (badGuyType == BadGuyType.red) 
     { 

      badGuy.GetComponent<MeshRenderer>().material.color = Color.red; 
     } 
    } 

    public BadGuyType getBadGuyType() 
    { 
     return playerGuyType; 
    } 


    public void createBadGuy(GameObject badGuyPrefab, BadGuyType badGuyType, Vector3 badGuyPosition) 
    { 
     if (badGuyPrefab == null) 
     { 
      Debug.Log("Bad Guy Prefab is null!"); 
      return; //exit 
     } 

     badGuy = (GameObject)Instantiate(badGuyPrefab, badGuyPosition, Quaternion.identity); 
     setBadGuyType(badGuyType); 
    } 

    public void killBadGuy() 
    { 
     Destroy(badGuy); 
     Destroy(this); 
    } 

    public GameObject getBadGuyGameObject() 
    { 
     return badGuy; 
    } 
} 

public enum BadGuyType 
{ 
    NONE, 
    green, 
    blue, 
    red 
} 
+0

私の 'BadGuysManager'スクリプトが私のBadGuyのプレハブに接続されているのであれば、私はノーノーノー' gameObject' – Nullititiousness

+0

と 'badGuy'を置き換えることができます。それはBadGuyManagerの仕組みではありません。 BadGuysManagerスクリプトは、シーンのどこにでも接続しないでください。新しいオブジェクトを作成するには、gameObject.AddComponent ()を使用します。次に、createBadGuyを使用してBadGuysManagerの新しいbadGuyを初期化します。これは、prefabをit.badGuyに渡すことによってcreateBadGuyが呼び出されると初期化されます。 'test.cs'スクリプトを見てください。それはそれを使用する方法を示しています。 – Programmer

+0

nullitiousness、あなたのスタイルを統一に適用しようとしないでください、フローと一緒に、彼らはそれを使用する方法に適応します。その "コンポーネント駆動"コンポーネントを使用していないし、単一のマスタークラスのすべてを制御しようとしないでください。完全に不可能ではないものの、過度に複雑なやり方で、あなたは団結のパラダイムを回避する方法を見つける時間を浪費します。 – yes

関連する問題