// Start is called before the first frame update public void CreateRulette(GameObject data) { float totalRange = 0; for (int i = 0; i < data.transform.childCount; i++) { moveParameter = data.transform.GetChild(i).GetComponent <MoveParameter>(); // ネットワークオブジェクトにしてみた // GameObject netObj = PhotonNetwork.Instantiate(ROULETTE_IMAGE, transform.position, Quaternion.identity, 0); //親子関係とサイズの変更はPrefabのStartでやる // netObj.transform.parent = imageParentTransform; //netObj.transform.localScale = new Vector3(1, 1, 1); //Debug.Log("ネットワークオブジェクトにしてみた"); //Image obj = netObj.GetComponent<Image>(); var obj = Instantiate(rouletteImage, imageParentTransform); obj.fillAmount = moveParameter.GetMoveRange() / 96f; // ピースの回転 Vector3 axis = new Vector3(0f, 0f, -1f); float angle = CONVERT_CONSTANT * totalRange; Quaternion q = Quaternion.AngleAxis(angle, axis); obj.transform.rotation = q * obj.transform.rotation; // ルーレットの色を決定 if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.White) { obj.color = Color.white; } else if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Blue) { obj.color = new Color(0, 154, 255, 255); } else if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Purple) { obj.color = Color.magenta; } else if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Gold) { obj.color = Color.yellow; } else if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Red) { obj.color = Color.red; } // ワザの名前を入力 Text[] texts = obj.GetComponentsInChildren <Text>(); texts[0].text = moveParameter.GetMoveName(); if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.White || moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Gold) { texts[1].text = moveParameter.GetMovePower().ToString(); } else if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Purple) { string star = ""; for (int j = 0; j < moveParameter.GetMoveNumberOfStar(); j++) { star += "☆"; } texts[1].text = star; } else if (moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Blue || moveParameter.GetMoveColorName() == MoveParameter.MoveOfColorName.Red) { texts[1].text = ""; } obj.transform.GetChild(0).transform.rotation = Quaternion.Euler(0, 0, -(moveParameter.GetMoveRange() / 2 + totalRange) * CONVERT_CONSTANT); totalRange += moveParameter.GetMoveRange(); // Debug.Log(moveParameter.GetMoveName()); } }
// 引数はGameMasterから渡されるワザのデータ) public IEnumerator Spin(GameObject data) { yield return(new WaitForSeconds(0.1f)); // 初期位置から目標点までの回転角度 BoardController boardController = GameObject.Find("BoardMaster").GetComponent <BoardController>(); int myPlayerId = boardController.GetMyPlayerId(); int whichTurn = boardController.GetWhichTurn(); // バトルを仕掛けた側がgoalAngleを生成し相手プレイヤーに送る if (myPlayerId == whichTurn) { goalAngle = 360 * N + Random.Range(0, 360); boardController.SetGoalAngleCustomProperty(rouletteParentParameter.GetPlayerId(), goalAngle); } // 仕掛けた側から送られてgoalAngleを受け取って回る else { while (receiveFlag == false) { yield return(null); } receiveFlag = false; } loopCount = 0; // スローになるまでの角速度立式 omega = 2 * goalAngle / (totalTime + normalTime); deltaOmega = omega * clock / (totalTime - normalTime + clock); omegaSlow = omega; while (loopCount < totalTime / clock) { // スローになるまで if (loopCount < normalTime / clock) { // 等角速度運動 transform.Rotate(new Vector3(0, 0, omega * clock)); } else if (loopCount < totalTime / clock) { // 速度をループ回数に対して階段状に小さくする omegaSlow = omegaSlow - deltaOmega; transform.Rotate(new Vector3(0, 0, omegaSlow * clock)); } loopCount++; // clock秒ごとにwhile文を呼び出す yield return(new WaitForSeconds(clock)); } // 回転終了 Debug.Log("ゴールは" + goalAngle % 360); // ピース幅を順番に見て、goalAngle %360がどの範囲にあるかを調べる float totalRange = 0; for (int i = 0; i < data.transform.childCount; i++) { // 各ワザのパラメータ取得 moveParameter = data.transform.GetChild(i).GetComponent <MoveParameter>(); // 不等式の両端 float leftAngle = totalRange * 3.75f; float rightAngle = leftAngle + moveParameter.GetMoveRange() * 3.75f; // Debug.Log(leftAngle + "から" + rightAngle); if (leftAngle <= (goalAngle + offsetAngle) % 360 && (goalAngle + offsetAngle) % 360 < rightAngle) { // goalAngleに該当するワザ Debug.Log("getMoveName = " + moveParameter.GetMoveName()); Debug.Log("getMoveColor = " + moveParameter.GetMoveColorName()); // moveParameter.ExecMoveEffect(phaseState); yield return(moveParameter); } totalRange += moveParameter.GetMoveRange(); } // 次のスピンのためにオフセットを準備 offsetAngle += goalAngle % 360; // ここでmoveParameterから両者の技を参照して色判定を行う // この実装だとfor文でcurrent側のmoveParameterが捨てられているので書き方を変える // 勝敗結果と技の効果はSpinControllerに返した上、さらにboardControllerに渡したほうがいいよね~ goalAngle = -1; }