Unityで作成したAndroidアプリのエディターと実機との挙動の違い

前提

初めまして。今までずっと一人でやってきたのですが行き詰まってしまったので恥ずかしながら質問させていただきます。
最近Unityを触り始めC#を少し勉強しChatGPTの力を借りながらUnityにてAndroidアプリのブロック崩しを作っているのですが、ボールがパドルに当たった時に反射角度が変わるようにしていてUnityエディター上では思ったとおりに動くのですが実機では反射角度が変わらない現象が起きています。ご教授お願いします。

該当のソースコード

C#

1using UnityEngine;2using UnityEngine.SceneManagement;3using TMPro;4 5public class BallController : MonoBehaviour 6{7 public float initialSpeed = 7f;8 public Vector2 initialDirection = new Vector2(1, 1);9 public TMP_Text startText;10 public TMP_Text gameOverText;11 public TMP_Text restartText;12 13 [SerializeField] private Rigidbody2D rb;14 [SerializeField] private NS_ButtonManager buttonManager;15 [SerializeField] private StageManager stageManager;16 [SerializeField] float rotationSpeed = 100f;17 private bool isMoving;18 private bool isGameOver;19 public float maxSpeed = 7f;20 21 22 void Start()23 {24 isMoving = false;25 isGameOver = false;26 startText.gameObject.SetActive(true);27 gameOverText.gameObject.SetActive(false);28 restartText.gameObject.SetActive(false);29 }30 31 void Update()32 {33 transform.Rotate(0f, 0f, rotationSpeed * Time.fixedDeltaTime);34 35 if (isGameOver)36 {37 if (!buttonManager.pausePanel.activeInHierarchy &&38 (Input.GetKeyDown(KeyCode.Space) || Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began))39 {40 SceneManager.LoadScene(SceneManager.GetActiveScene().name);41 }42 }43 else if (!isMoving)44 {45 if (buttonManager != null && buttonManager.pausePanel.activeInHierarchy)46 {47 return;48 }49 50 if (Input.GetKeyDown(KeyCode.Space) || Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)51 {52 MoveBall();53 startText.gameObject.SetActive(false);54 }55 }56 else57 {58 // 速度の制限を適用する59 rb.velocity = rb.velocity.normalized * initialSpeed;60 }61 62 if (stageManager.GetVisibleBlockCount() <= 0)63 {64 StopBall();65 }66 67 }68 69 70 private void OnCollisionEnter2D(Collision2D collision)71 {72 if (collision.gameObject.CompareTag("player"))73 {74 HandlePlayerCollision(collision);75 }76 else if (collision.gameObject.CompareTag("Floor"))77 {78 HandleFloorCollision(collision);79 }80 else if (collision.gameObject.CompareTag("Wall"))81 {82 ReflectOffWall();83 }84 85 }86 private void ReflectOffWall()87 {88 // 壁に反射する際に角度をわずかにずらす89 float randomAngle = Random.Range(-1f, 1f); // -1度から1度の範囲でランダムに角度を選ぶ90 Quaternion rotation = Quaternion.Euler(0f, 0f, randomAngle);91 rb.velocity = rotation * rb.velocity;92 }93 94 95 private void HandlePlayerCollision(Collision2D collision)96 {97 Debug.Log("HandlePlayerCollision called");98 99 // パドルの速度ベクトルを取得します100 Vector2 paddleVelocity = collision.rigidbody.velocity;101 102 // ボールの速度ベクトルを反射方向に変更します103 float newSpeed = rb.velocity.magnitude;104 105 // パドルの速度を反映して反射方向を計算106 Vector2 reflectDirection = (rb.velocity.normalized + paddleVelocity.normalized).normalized;107 rb.velocity = reflectDirection * newSpeed;108 Debug.Log("reflectDirection: " + reflectDirection);109 Debug.Log("newSpeed: " + newSpeed);110 111 // 現在の速度を一定の速さに制限します112 Vector2 clampedVelocity = rb.velocity;113 clampedVelocity *= Mathf.Clamp01(maxSpeed / clampedVelocity.magnitude);114 if (clampedVelocity.magnitude < 5f)115 {116 clampedVelocity = clampedVelocity.normalized * 5f;117 }118 rb.velocity = clampedVelocity;119 120 // 新しい速度を計算し、y方向の速度を元の速度の絶対値の大きい方に設定します121 Vector2 newVelocity = rb.velocity;122 newVelocity.y = Mathf.Sign(newVelocity.y) * Mathf.Max(Mathf.Abs(newVelocity.y), Mathf.Abs(newVelocity.x));123 rb.velocity = newVelocity;124 }125 126 127 128 private void HandleFloorCollision(Collision2D collision)129 {130 GameOver();131 }132 133 private void MoveBall()134 {135 // ランダムな方向を設定する136 float randomAngle = Random.Range(Mathf.PI / 4f, Mathf.PI * 3f / 4f); // 45度から135度の範囲でランダムに角度を選ぶ137 Vector2 randomDirection = new Vector2(Mathf.Cos(randomAngle), Mathf.Sin(randomAngle));138 139 rb.velocity = randomDirection.normalized * initialSpeed;140 isMoving = true;141 }142 143 private void StopBall()144 {145 rb.velocity = Vector2.zero;146 isMoving = false;147 }148 149 private void GameOver()150 {151 isMoving = false;152 isGameOver = true;153 rb.velocity = Vector2.zero;154 gameOverText.gameObject.SetActive(true);155 restartText.gameObject.SetActive(true);156 }157}

試したこと

HandlePlayerCollisionメソッドにデバッグログを追加してログキャットで確認したところメソッドは呼び出されreflectDirectionの数値も表示されましたが実機の画面上では反射角度は変わらず。
fixedupdateやUpdateメソッドにコードを移動や、反射角度の計算の変更、Unityの物理エンジンを使わずカスタムコードを書いてもだめ。

補足情報(FW/ツールのバージョンなど)

Unity 2021.3.21f1

コメントを投稿

0 コメント