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);
}
<中略>
}
}
