private void OnCollisionEnter2D(Collision2D col) { Rigidbody2D rb = GetComponent <Rigidbody2D>(); // Rigidbodyを取得 if (col.collider.tag == "Rock") { Vector3 hitPos; foreach (ContactPoint2D point in col.contacts) { hitPos = point.point; // 衝突した座標を取得 var effect = Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH]); // エフェクト生成 effect.transform.position = hitPos; // エフェクトを衝突した座標に移動 VariousFixer vf = effect.GetComponent <VariousFixer>(); // スクリプト取得 vf.RotationY(GetAngle(transform.position, hitPos)); // スクリプト内の関数で角度を修正 } Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH], transform); if (transform.position.x < 0) // 画面の左側で岩にあたった場合 { rb.AddTorque(0.6f, ForceMode2D.Impulse); // 一瞬のみ時計回りに回転を加える rb.AddForce(new Vector2(0.07f * bombPower, 0.07f * bombPower), ForceMode2D.Impulse); // 一瞬のみ力を加える } else { rb.AddTorque(-0.6f, ForceMode2D.Impulse); // 一瞬のみ反時計回りに回転を加える rb.AddForce(new Vector2(-0.07f * bombPower, 0.07f * bombPower), ForceMode2D.Impulse); // 一瞬のみ力を加える } } else if (col.collider.tag == "Wall") { Vector3 hitPos; foreach (ContactPoint2D point in col.contacts) { hitPos = point.point; // 衝突した座標を取得 var effect = Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH]); // エフェクト生成 effect.transform.position = hitPos; // エフェクトを衝突した座標に移動 VariousFixer vf = effect.GetComponent <VariousFixer>(); // スクリプト取得 if (transform.position.x < 0) // 画面の左側で壁にあたった場合 { vf.RotationY(90f); // エフェクトを右向きに } else { vf.RotationY(270f); // エフェクトを左向きに } } Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH], transform); if (transform.position.x < 0) // 画面の左側で岩にあたった場合 { rb.AddTorque(0.6f, ForceMode2D.Impulse); // 一瞬のみ時計回りに回転を加える rb.AddForce(new Vector2(0.07f * bombPower, 0.07f * bombPower), ForceMode2D.Impulse); // 一瞬のみ力を加える } else { rb.AddTorque(-0.6f, ForceMode2D.Impulse); // 一瞬のみ反時計回りに回転を加える rb.AddForce(new Vector2(-0.07f * bombPower, 0.07f * bombPower), ForceMode2D.Impulse); // 一瞬のみ力を加える } } }
// Update is called once per frame void Update() { switch (Status) { case (byte)GAME_STATUS._PLAY: // ゲームプレイ時 if (!GameDirector.Instance.GetPauseFlg) // ポーズ中でなければ通常通り実行 { if (GameDirector.Instance.GetArmNumber() <= _MAX_TAP + 1) { rotatePower *= 0.97f; // 回転力を減衰 // 回転力が一定以下なら最低値を設定 if (rotatePower < 4.0f && rotatePower > 0) { rotatePower = 4.0f; } else if (rotatePower > -4.0f && rotatePower < 0) { rotatePower = -4.0f; } } if (GameDirector.Instance.GetArmNumber() > 1 && GameDirector.Instance.GetArmNumber() <= _MAX_TAP + 1) // 最初のタップと最後のタップ以外 { Presstime += Time.deltaTime; // 前回のタップから経過した時間を計測 if (Presstime > ArrowDisplayTime) // 一定時間経過したら { ArrowObject.SetActive(true); // 矢印を表示 } if (FadeFlag) // フェードアウト処理 { FadeAlpha -= 0.05f; if (FadeAlpha <= 0) { FadeAlpha = 0; FadeFlag = false; } } else // フェードイン処理 { FadeAlpha += 0.05f; if (FadeAlpha >= 1) { FadeAlpha = 1; FadeFlag = true; } } Color fadecolor = gameObject.transform.GetChild(selectArm).GetComponent <SpriteRenderer>().color; gameObject.transform.GetChild(selectArm).GetComponent <SpriteRenderer>().color = new Color(fadecolor.r, FadeAlpha, FadeAlpha); } if (Input.GetMouseButtonDown(0) && GameDirector.Instance.GetArmNumber() > 0) // 左クリックしたとき、かつタップの最大数以下の時 { if (GameDirector.Instance.GetArmNumber() <= _MAX_TAP + 1 && GameDirector.Instance.GetArmNumber() > 1) // 最初のタップと最後のタップ以外の時 { OceanFlag = true; // 海流にそって加速するように変更 Presstime = 0; // 経過時間を初期化 rb.velocity = Vector2.zero; // 重力加速度をリセット if (i < 100) { i++; // 保存する配列の要素番号を1つ加算 } if (!ArrowObject.activeSelf) // 非アクティブ状態なら { ArrowObject.SetActive(true); // アクティブ状態に設定 } ArrowObject.GetComponent <ArrowDirector>().SetArrowPos(transform.GetChild(selectArm + 1)); // 次の腕に応じた矢印の位置に設定 ArrowObject.SetActive(false); // 非アクティブに設定 armPos = transform.GetChild(selectArm).position; // ヒエラルキービューの上から子オブジェクトのワールド座標を取得 ForceX = transform.position.x - armPos.x; // 本体と腕のx座標の差を求める(力を加えるx方向) ForceY = transform.position.y - armPos.y; // 本体と腕のy座標の差を求める(力を加えるy方向) var effect = Instantiate(ParticleList[(int)PARTICLE.BOMB]); // 1個目の泡のパーティクルを生成 effect.transform.position = armPos; // 生成したパーティクルを腕の位置に設定 VariousFixer vf = effect.GetComponent <VariousFixer>(); // スクリプトを取得 ParticleAngle = GetAngle(transform.position, armPos); // 角度を取得 vf.RotationY(ParticleAngle); // 角度を変更 var effect02 = Instantiate(ParticleList[(int)PARTICLE.BOMB]); // 2個目の泡のパーティクルを生成 effect02.transform.position = transform.position; VariousFixer vf02 = effect02.GetComponent <VariousFixer>(); vf02.RotationY(ParticleAngle + 15.0f); var effect03 = Instantiate(ParticleList[(int)PARTICLE.BOMB]); // 3個目の泡のパーティクルを生成 effect03.transform.position = transform.position; VariousFixer vf03 = effect03.GetComponent <VariousFixer>(); vf03.RotationY(ParticleAngle - 15.0f); if (transform.position.x < armPos.x) // 本体の右側で腕が爆発したら { rotatePower = 20f * bombPower; // 時計回りに回転 } else // 本体の左側で腕が爆発したら { rotatePower = -20f * bombPower; // 反時計回りに回転 } LegSpriteRenderer[selectArm].sprite = LegImages[2]; // 現在の腕を爆発後の腕の画像に変更 transform.GetChild(selectArm).GetComponent <Transform>().localScale = new Vector3(1.0f, 1.0f, 1.0f); // 現在の腕の表示を標準に変更 if (selectArm < _MAX_LEG - 1) // 現在の腕が最後の腕じゃなかったら { LegSpriteRenderer[selectArm + 1].sprite = LegImages[1]; // 次の腕を選択時の腕の画像に変更 transform.GetChild(selectArm + 1).GetComponent <Transform>().localScale = new Vector3(1.5f, 1.5f, 1.5f); // 次の腕の表示を1.5倍に拡大 } selectArm++; // 次の腕へ GameDirector.Instance.SetArmNumber(GameDirector.Instance.GetArmNumber() - 1); // 腕の本数を1減算 } else if (GameDirector.Instance.GetArmNumber() > _MAX_TAP) // 最初のタップ { GetComponent <Animator>().enabled = false; // アニメーターをオフにする this.GetComponent <AudioSource>().PlayOneShot(ClearSound[2]); // 最初のジャンプの音 GetComponent <CreateEffect>().InstantiateParticle(); GameDirector.Instance.SetArmNumber(GameDirector.Instance.GetArmNumber() - 1); // 腕の本数を1減算 rotatePower = 12f * bombPower; // 回転を設定 // 左上に力を加える ForceX = -0.1f; ForceY = 0.15f; transform.GetChild(0).GetComponent <Transform>().localScale = new Vector3(1.5f, 1.5f, 1.5f); // 最初の腕の表示を1.5倍に拡大 LegSpriteRenderer[0].sprite = LegImages[1]; // 最初の腕を選択時の腕に画像を変更 FadeAlpha = 1.0f; FadeFlag = true; } } transform.Rotate(new Vector3(0, 0, rotatePower)); // 海星を回転 transform.Translate(ForceX * bombPower, ForceY * bombPower, 0, Space.World); // 爆発の威力に応じて移動 if (transform.position.y < START_Y) // 海星のY座標がスタートの座標より下にいるなら { Vector2 pos = transform.position; // 海星の座標を保存 transform.position = new Vector2(pos.x, START_Y); // x座標はそのままでY座標をスタートの座標に変更 } if (rb.velocity.y < -1.0f) // 重力加速度がy方向に-1.0以上かかっていたら { rb.velocity = new Vector2(0, -1.0f); // 重力加速度を-1.0に戻す } // 力を減衰 ForceX *= 0.95f; ForceY *= 0.95f; // X方向への力が一定以下になったら0にする if (ForceX < 0.001f && ForceX > -0.001f) { ForceX = 0; } // Y方向への力が一定以下になったら0にして、海流のフラグをfalseにする if (ForceY < 0.001f && ForceY > -0.001f) { OceanFlag = false; ForceY = 0; } // ゴールラインを超えたら if (GameDirector.Instance.GetDistance < 0) { Status = (byte)GAME_STATUS._CREAR_EFFECT; // クリア演出処理へ // BGMをフェードアウトさせる GameObject.Find("SoundManager").GetComponent <SoundManager>().BGM_Fade(); ForceY = 0.3f; // Y方向を固定値に変更 FadeAlpha = 1.0f; // フェード値をリセット // 回転スピードを一定値に設定 if (rotatePower > 0) { rotatePower = 0.5f; } else { rotatePower = -0.5f; } FadeImage.rectTransform.anchoredPosition = new Vector2(FadeImage.rectTransform.anchoredPosition.x, -(FadeImage.rectTransform.anchoredPosition.y)); // 画像の位置を上に移動 FadeImage.transform.localScale = new Vector3(1, 1, 1); // Yスケールを1に設定することで画像の上下を逆転させる Image FadeChild = FadeImage.transform.GetChild(0).GetComponent <Image>(); // 子のImage情報を取得 FadeImage.color = new Color(255, 255, 255); // 親の色を白に設定 FadeChild.color = new Color(255, 255, 255); // 子の色を白に設定 // 矢印を非アクティブに設定 if (ArrowObject.activeSelf) { ArrowObject.SetActive(false); } GameDirector.Instance.UI_Fade(); // 一時停止ボタンをフェードアウト } // 残りの可能タップ数が1以下になった時かつ、Yに対する力が 0.001f ~ -0.001f になった時に if (GameDirector.Instance.GetArmNumber() <= 1 && ForceY < 0.001f && ForceY > -0.001f) { GameObject.Find("SoundManager").GetComponent <SoundManager>().BGM_Fade(); Status = (byte)GAME_STATUS._OVER; // ゲームオーバー処理へ GameDirector.Instance.UI_Fade(); // 一時停止ボタンをフェードアウト } } else { GameObject canvas = GameObject.Find("Canvas_beta"); if (canvas.transform.childCount > 2 && canvas.transform.GetChild(2).gameObject.activeSelf) { gameObject.GetComponent <Animator>().SetTrigger("IdleTrigger"); } } break; case (byte)GAME_STATUS._CREAR_EFFECT: rb.velocity = Vector2.zero; // 重力を無効化 if (!this.GetComponent <AudioSource>().isPlaying) { this.GetComponent <AudioSource>().PlayOneShot(ClearSound[0]); // 回転音を再生 } if (rotatePower < 10.0f && rotatePower > -10.0f) { rotatePower *= 2.0f; } if (ForceY > 0.01f) // Y方向の力が一定以上なら { // 力を減衰させる ForceX *= 0.9f; ForceY *= 0.9f; } else // 一定以下になったら { if (ForceY != 0) // Y方向の力が0になっていなかったら { // 力を0に変更 ForceX = 0; ForceY = 0; } FadeAlpha -= 0.025f; // アルファ値を減少 Color fadecolor = this.gameObject.GetComponent <SpriteRenderer>().color; // 自分の色を取得 gameObject.GetComponent <SpriteRenderer>().color = new Color(fadecolor.r, fadecolor.g, fadecolor.b, FadeAlpha); // 減らしたアルファ値を変更 for (int i = 0; i < 5; i++) { fadecolor = this.gameObject.transform.GetChild(i).GetComponent <SpriteRenderer>().color; this.gameObject.transform.GetChild(i).GetComponent <SpriteRenderer>().color = new Color(fadecolor.r, fadecolor.g, fadecolor.b, FadeAlpha); } fadecolor = this.gameObject.transform.GetChild(5).GetComponent <SpriteRenderer>().color; // 子の星の色を取得 gameObject.transform.GetChild(5).GetComponent <SpriteRenderer>().color = new Color(fadecolor.r, fadecolor.g, fadecolor.b, 1.0f - FadeAlpha); // 子の星のアルファ値を変更 if (FadeAlpha <= 0) { Status = (byte)GAME_STATUS._CLEAR; var effect = Instantiate(ParticleList[(int)PARTICLE.GOAL]); effect.transform.position = gameObject.transform.position; } } transform.Translate(ForceX * bombPower, ForceY * bombPower, 0, Space.World); // 爆発の威力に応じて移動 transform.Rotate(new Vector3(0, 0, rotatePower)); // 海星を回転 break; case (byte)GAME_STATUS._CLEAR: // クリア処理 ForceY = 0.4f; this.GetComponent <AudioSource>().PlayOneShot(ClearSound[1]); // 飛んでいく音を再生 int StageNum = GameDirector.Instance.GetSceneNumber - 1; // 現在のステージ番号を取得 GetComponent <SaveStageInfo>().SaveSatageClearInfo(StageNum); // ステージクリアを保存 if (StageNum % 3 == 0) // 各エリアの最終ステージなら { GetComponent <SaveStageInfo>().SaveAreaClearInfo(StageNum / 3); // エリアのクリアを保存 } StartCoroutine("LoadResult"); // コルーチンでリザルトシーンを読み込む Status = 99; // シーンの2度読み防止 break; case (byte)GAME_STATUS._OVER: // ゲームオーバー処理 StartCoroutine("LoadOver"); // コルーチンでゲームオーバーシーンを読み込む Status = 99; // シーンの2度読み防止 break; } if (transform.position.y < START_Y) // 海星のY座標がスタートの座標より下にいるなら { Vector2 pos = transform.position; // 海星の座標を保存 transform.position = new Vector2(pos.x, START_Y); // X座標はそのままでY座標をスタートの座標に変更 } }
private void OnCollisionEnter2D(Collision2D col) { // 最後の腕を消費し、かつ何かのオブジェクトにあたった場合 if (GameDirector.Instance.GetArmNumber() <= 1) { Presstime = 0; // ゲームオーバーまでの時間を延長 } if (col.collider.tag == "Wall") { if (!GameDirector.Instance.GetPauseFlg) // 最初のアニメーションでエフェクトを発生させないようにする { Vector3 hitPos; foreach (ContactPoint2D point in col.contacts) { hitPos = point.point; // 衝突した座標を取得 var effect = Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH]); // エフェクト生成 effect.transform.position = hitPos; // エフェクトを衝突した座標に移動 VariousFixer vf = effect.GetComponent <VariousFixer>(); // スクリプト取得 if (transform.position.x < 0) // 画面の左側で壁にあたった場合 { vf.RotationY(90f); // エフェクトを右向きに } else { vf.RotationY(270f); // エフェクトを左向きに } } if (transform.position.x < 0) // 画面の左側で岩にあたった場合 { rotatePower = 7.0f; // 時計回りに回転 // 右上に力を加える ForceX = 0.1f; ForceY = 0.1f; } else { rotatePower = -7.0f; // 反時計回りに回転 // 左上に力を加える ForceX = -0.1f; ForceY = 0.1f; } } } else if (col.collider.tag == "RightWall") { Vector3 hitPos; foreach (ContactPoint2D point in col.contacts) { hitPos = point.point; // 衝突した座標を取得 var effect = Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH]); // エフェクト生成 effect.transform.position = hitPos; // エフェクトを衝突した座標に移動 VariousFixer vf = effect.GetComponent <VariousFixer>(); // スクリプト取得 vf.RotationY(GetAngle(transform.position, hitPos)); // スクリプト内の関数で角度を修正 } rotatePower = -7.0f; // 反時計回りに回転 // 左上に力を加える ForceX = -0.1f; ForceY = 0.1f; } else if (col.collider.tag == "LeftWall") { Vector3 hitPos; foreach (ContactPoint2D point in col.contacts) { hitPos = point.point; // 衝突した座標を取得 var effect = Instantiate(ParticleList[(int)PARTICLE.WALLTOUTCH]); // エフェクト生成 effect.transform.position = hitPos; // エフェクトを衝突した座標に移動 VariousFixer vf = effect.GetComponent <VariousFixer>(); // スクリプト取得 vf.RotationY(GetAngle(transform.position, hitPos)); // スクリプト内の関数で角度を修正 } rotatePower = 7.0f; // 時計回りに回転 // 右上に力を加える ForceX = 0.1f; ForceY = 0.1f; } // クラゲの頭の部分にあたった時 if (col.collider.tag == "Top") { // クラゲ本体の座標と頭の位置の差を取得 Vector2 distance = col.gameObject.GetComponent <JellyFish_Top>().GetDistance(); // クラゲが向いている方向に力を加える ForceX = distance.x * 0.8f; ForceY = distance.y * 0.8f; var effect = Instantiate(ParticleList[(int)PARTICLE.BOMB], gameObject.transform); // 泡のパーティクルを生成 effect.transform.localScale /= 0.4f; // 大きさを修正 } }