回答編集履歴

3 書式の改善

退会済みユーザー

退会済みユーザー

2016/10/29 20:20  投稿

存在しないキャラクターのリストを作り、最初は全キャラクターがいないと仮定して初期化しました。
生成時には、ランダムでリストのインデックスを1つ選択し、インデックスからリストの値を参照して生成するキャラクターを選択します。
生成したキャラクターにはリストの値を渡しておきます。
生成後はリストから削除して、同じキャラクターが選択されないようにします。
キャラクターを`destroy`するときに、渡しておいたリストの値を引数にメソッドを実行して存在しないキャラクターのリストにその値を追加します。
```C#
using UnityEngine;
using System.Collections;
// ジェネリックコレクションを利用するので追加
using System.Collections.Generic;
public class CustomerInStore : MonoBehaviour {
   public GameObject [] characters = new GameObject[10];
   float nextSpawnTime = 0;
   [SerializeField]
   float interval = 5.0f;
   [SerializeField]
   public bool isCanComeCustomer = false;
   // キャラクターの種類の最大数
   const int CHARACTER_NUM_MAX = 7;
   // 存在しないキャラクターのリスト
   private List<int>nonExistence = new List<int>();
   void LocalInstantate() {
       // ランダムでインデックスを選択
       var _customerIndex = Random.Range(0, nonExistence.Count);
       int _customerIndex = Random.Range(0, nonExistence.Count);
       
       // 存在しないキャラクターのリストのインデックスから
       // キャラクターの種類を選択してインスタンス化
       var _customerNum = nonExistence[_customerIndex];
       var obj = (GameObject) Instantiate(characters[_customerNum]);
       int _customerNum = nonExistence[_customerIndex];
       GameObject obj = (GameObject) Instantiate(characters[_customerNum]);
       obj.transform.parent = transform;
       obj.transform.localPosition = new Vector3(-3.35f, -1.44f, 0);
       
       // インスタンス化したのでリストから削除
       nonExistence.RemoveAt(_customerIndex);
   }
   // 存在しないキャラクターをリストに追加
   public void AddNonExistenceList(int num){
       nonExistence.Add(num);
   }
   // Use this for initialization
   void Start() {
       // 存在しないキャラクターのリストを初期化
       for (int i = 0; i < CHARACTER_NUM_MAX; i++) {
           AddNonExistenceList(i);
       }
   }
   // Update is called once per frame
   void Update() {
       // キャラクターの生成までの時間
       if (nextSpawnTime < Time.timeSinceLevelLoad && isCanComeCustomer == true) {
           nextSpawnTime = Time.timeSinceLevelLoad + interval;
           // リストの要素数が0より大きいときにのみ実行する
           if(0 < nonExistence.Count) LocalInstantate();
       }
   }
}
```
キャラクターを`destroy`するときは、キャラクター側のスクリプトから`AddNonExistenceList()`メソッドを実行 (抜粋)
```C#
[System.NonSerialized]
public int customerNum;
void LeaveStore(){
   var _customerInStore = transform.parent.GetComponent<CustomerInStore>();
   CustomerInStore _customerInStore = transform.parent.GetComponent<CustomerInStore>();
   _customerInStore.AddNonExistenceList(customerNum);
   Destroy(gameObject);
}
```
2 修正が反映されてないため、再送信

退会済みユーザー

退会済みユーザー

2016/10/29 19:48  投稿

存在しないキャラクターのリストを作り、最初は全キャラクターがいないと仮定して初期化しました。
生成時には、ランダムでリストのインデックスを1つ選択し、インデックスからリストの値を参照して生成するキャラクターを選択します。
生成したキャラクターにはリストの値を渡しておきます。
生成後はリストから削除して、同じキャラクターが選択されないようにします。
キャラクターを`destroy`するときに、渡しておいたリストの値を引数にメソッドを実行して存在しないキャラクターのリストにその値を追加します。
```C#
using UnityEngine;
using System.Collections;
// ジェネリックコレクションを利用するので追加
using System.Collections.Generic;
public class CustomerInStore : MonoBehaviour {
public GameObject [] characters = new GameObject[10];
float nextSpawnTime = 0;
[SerializeField]
float interval = 5.0f;
[SerializeField]
public bool isCanComeCustomer = false;
// キャラクターの種類の最大数
const int CHARACTER_NUM_MAX = 7;
// 存在しないキャラクターのリスト
private List<int>nonExistence = new List<int>();
void LocalInstantate() {
// ランダムでインデックスを選択
var _customerIndex = Random.Range(0, nonExistence.Count);
// 存在しないキャラクターのリストのインデックスから
// キャラクターの種類を選択してインスタンス化
var _customerNum = nonExistence[_customerIndex];
var obj = (GameObject) Instantiate(characters[_customerNum]);
obj.transform.parent = transform;
obj.transform.localPosition = new Vector3(-3.35f, -1.44f, 0);
// インスタンス化したのでリストから削除
nonExistence.RemoveAt(_customerIndex);
}
// 存在しないキャラクターをリストに追加
public void AddNonExistenceList(int num){
nonExistence.Add(num);
}
// Use this for initialization
void Start() {
// 存在しないキャラクターのリストを初期化
for (int i = 0; i < CHARACTER_NUM_MAX; i++) {
AddNonExistenceList(i);
}
}
// Update is called once per frame
void Update() {
// キャラクターの生成までの時間
if (nextSpawnTime < Time.timeSinceLevelLoad && isCanComeCustomer == true) {
nextSpawnTime = Time.timeSinceLevelLoad + interval;
// リストの要素数が0より大きいときにのみ実行する
if(0 < nonExistence.Count) LocalInstantate();
}
}
}
```
キャラクターを`destroy`するときは、キャラクター側のスクリプトから`AddNonExistenceList()`メソッドを実行 (抜粋)
```C#
[System.NonSerialized]
public int customerNum;
void LeaveStore(){
var _customerInStore = transform.parent.GetComponent<CustomerInStore>();
_customerInStore.AddNonExistenceList(customerNum);
Destroy(gameObject);
}
```
1 文法の修正

退会済みユーザー

退会済みユーザー

2016/10/29 19:43  投稿

存在しないキャラクターのリストを作り、最初は全キャラクターがいないと仮定して初期化しました。
生成時には、ランダムでリストのインデックスを1つ選択し、インデックスからリストの値を参照して生成するキャラクターを選択します。
生成したキャラクターにはリストの値を渡しておきます。
生成後はリストから削除して、同じキャラクターが選択されないようにします。
キャラクターを`destroy`するときに、渡しておいたリストの値を引数にメソッドを実行して存在しないキャラクターのリストにその値を追加します。
```C#
using UnityEngine;
using System.Collections;
// ジェネリックコレクションを利用するので追加
using System.Collections.Generic;
public class CustomerInStore : MonoBehaviour {
   public GameObject [] characters = new GameObject[10];
   float nextSpawnTime = 0;
   [SerializeField]
   float interval = 5.0f;
   [SerializeField]
   public bool isCanComeCustomer = false;
   // キャラクターの種類の最大数
   const int CHARACTER_NUM_MAX = 7;
   // 存在しないキャラクターのリスト
   private List<int>nonExistence = new List<int>();
   void LocalInstantate() {
       // ランダムでインデックスを選択
       var _customerIndex = Random.Range(0, nonExistence.Count);
       
       // 存在しないキャラクターのリストのインデックスから
       // キャラクターの種類を選択してインスタンス化
       var _customerNum = nonExistence[_customerIndex];
       var obj = (GameObject) Instantiate(characters[_customerNum]);
       obj.transform.parent = transform;
       obj.transform.localPosition = new Vector3(-3.35f, -1.44f, 0);
       
       // インスタンス化したのでリストから削除
       nonExistence.RemoveAt(_customerIndex);
   }
   // 存在しないキャラクターをリストに追加
   public void AddNonExistenceList(int num){
       nonExistence.Add(num);
   }
   // Use this for initialization
   void Start() {
       // 存在しないキャラクターのリストを初期化
       for (int i = 0; i < CHARACTER_NUM_MAX; i++) {
           AddNonExistenceList(i);
       }
   }
   // Update is called once per frame
   void Update() {
       // キャラクターの生成までの時間
       if (nextSpawnTime < Time.timeSinceLevelLoad && isCanComeCustomer == true) {
           nextSpawnTime = Time.timeSinceLevelLoad + interval;
           LocalInstantate();
           // リストの要素数が0より大きいときにのみ実行する
           if(0 < nonExistence.Count) LocalInstantate();
       }
   }
}
```
キャラクターを`destroy`するときは、キャラクター側のスクリプトから`AddNonExistenceList()`メソッドを実行 (抜粋)
```C#
[System.NonSerialized]
public int customerNum;
void LeaveStore(){
   var _customerInStore = transform.parent.GetComponent<CustomerInStore>();
   _customerInStore.AddNonExistenceList(customerNum);
   Destroy(gameObject);
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る