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