複数のオブジェクトをスクリプトから作成

      複数のオブジェクトをスクリプトから作成 はコメントを受け付けていません

ExpressionManagerのスクリプトにHeadというゲームオブジェクト型の変数を追加します。Mouthの下がいいでしょう。

[SerializeField]
private GameObject BubblePref; //口から出る泡用プレハブ
private GameObject[] Bubble; //口から出る泡用インスタンス
BubbleBehavior[] bubbleBehavior;
int bubbleNum;
bool initFlag;

Startメソッド内でBubbleをインスタンス化し、さらにinitFlagを初期化します。

void Start()
{

    <中略>

    initFlag = false;


    <中略>


    if (BubblePref != null)
    {
        bubbleNum = 100;
        Bubble = new GameObject[bubbleNum];
        bubbleBehavior = new BubbleBehavior[bubbleNum];

        for (int i = 0; i < Bubble.Length; i++)
        {
            Bubble[i] = Instantiate(BubblePref) as GameObject;
            bubbleBehavior[i] = Bubble[i].GetComponent();
        }
    }

    <中略>

}

FaceAddedメソッド内でBubble[i].SetActive()をtrueにします。

void FaceAdded(ARFaceAnchor anchorData)
{

    <中略>
   
    for(int i = 0; i < Bubble.Length; i ++) Bubble[i].SetActive(true);

    <中略>
}

FaceUpdatedメソッド内で以下のコードを追加します。if (Head.activeSelf...の後がいいでしょう。

void FaceUpdated(ARFaceAnchor anchorData)
{
    <中略>

    if (Head.activeSelf != anchorData.isTracked)
    {
        Head.SetActive(anchorData.isTracked);
    }

    for (int i = 0; i < Bubble.Length; i++)
    {
        if (Bubble[i].activeSelf != anchorData.isTracked)
        {
            Bubble[i].SetActive(anchorData.isTracked);
        }
    } 

    <中略>
}

FaceRemovedメソッドにHead.SetActive(false)を追加します。

void FaceRemoved(ARFaceAnchor anchorData)
{
    <中略>

    for (int i = 0; i < Bubble.Length; i++) Bubble[i].SetActive(false);

    <中略>
}

UpdatePositionAndRotationメソッドに以下のコードを追加します。

private void UpdatePositionAndRotation(ARFaceAnchor anchorData)
{
    if (anchorData.isTracked)
    {
        <中略>

        if (jawOpen > 0.5)
        {
            //Bubbleの初期化をおこなう
            if(initFlag == false)
            {
                initFlag = true;

                for (int i = 0; i < Bubble.Length; i++)
                {
                    bubbleBehavior[i].Init();
                    bubbleBehavior[i].AddVelX(Random.Range(-0.0002f, 0.0002f));
                    bubbleBehavior[i].AddVelY(Random.Range(-0.00001f, -0.0002f));
                    bubbleBehavior[i].AddVelZ(Random.Range(0.00001f, 0.0002f));
                    Bubble[i].transform.position = new Vector3(center.x, center.y, center.z);
                }
            }
        }
        else
        {
            initFlag = false;
        }

        for (int i = 0; i < Bubble.Length; i++)
        {
            Bubble[i].transform.Translate(Vector3.left * bubbleBehavior[i].GetVelX());
            Bubble[i].transform.Translate(Vector3.up * bubbleBehavior[i].GetVelY());
            Bubble[i].transform.Translate(Vector3.back * bubbleBehavior[i].GetVelZ());
            Bubble[i].transform.rotation = UnityARMatrixOps.GetRotation(anchorData.transform);
        }
        <中略>         
    }
}