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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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<BubbleBehavior>();
        }
    }
 
    <中略>
 
}

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

1
2
3
4
5
6
7
8
9
void FaceAdded(ARFaceAnchor anchorData)
{
 
    <中略>
 
    for(int i = 0; i < Bubble.Length; i ++) Bubble[i].SetActive(true);
 
    <中略>
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)を追加します。

1
2
3
4
5
6
7
8
void FaceRemoved(ARFaceAnchor anchorData)
{
    <中略>
 
    for (int i = 0; i < Bubble.Length; i++) Bubble[i].SetActive(false);
 
    <中略>
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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);
        }
        <中略>         
    }
}