PCでUnity2Dを使ってブロック崩しを作りました。
PC上でプラットフォームをPC、Androidどちらで試しても想定通りに動きました。
そこで実機テストでAndroidのスマホ2台(A,B)を試したところ、ボールの移動速度がスマホAは想定通り、スマホBは遅い(印象でスマホAの60%程度)結果となり困っています。
試したこと
1)ボールの移動はFixedUpdate関数を使いProject Settings >> 時間 >> 固定時間ステップを0.02、0.0166、0.01の3種類を試す。
2)ボールの移動はUpdate関数を使いProject Settings >> 品質 >> VSync 数を 同期しない にしてGameManagerスクリプトで
void Awake()にApplication.targetFrameRate = 60;を記述。
Project Settings >> 品質 >> 品質レベルのチェックをHighのみにする。
以上の2つを試してみても結果は同じでした。
使用スマホ
スマホA:Galaxy A20 SC-02M 2019年製 リフレッシュレート不明
スマホB:SHARP AQUOS sense4 basic 2020年製 リフレッシュレート60HzHz
スマホの機種によらず移動速度を安定させる方法をネット検索しても他に見つからず、手詰まりとなってしまいました。
どなたかアドバイスをいただけませんでしょうか。
お願いいたします。
【追加】
ボールのコードを追加いたします。
C#(cs)
1public class Ball : MonoBehaviour 2{ 3 public float speed = 100f; // ボールの移動の速さを指定する変数 4 public float minSpeed = 100f; // 速さの最小値を指定する変数 5 public float maxSpeed = 150f; // 速さの最大値を指定する変数 6 7 Vector3 vec; 8 Rigidbody2D myRigidbody; 9 Transform myTransform; 10 GameObject objBlock; 11 GameObject objPlayer; 12 BlockT block; 13 Player player; 14 float point; // ボールとプレイヤーの接触時のx座標差 15 float defference; // プレイヤーの1/8の長さに対するボールとプレイヤーのx座標差 16 float ballblockgap; // ボールとブロックの接触時のx座標差 17 18 void Start() 19 { 20 // Rigidbodyにアクセスして変数に保持しておく 21 myRigidbody = GetComponent<Rigidbody2D>(); 22 // 右斜め45度に進む 23 myRigidbody.velocity = new Vector3(speed * x, speed * y, 0f); 24 // 画面描画用のCanvasを取得 25 var canvas = GetComponentInParent<Canvas>(); 26 // Transformコンポーネントを取得して保持しておく 27 myTransform = transform; 28 } 29 30 // 衝突したときに呼ばれる 31 void OnCollisionEnter2D(Collision2D collision) 32 { 33 Vector3 objBall = myTransform.position; 34 Vector3 objPlayer = GameObject.Find("Player").transform.position; 35 var playerRectTransform = GameObject.Find("Player").GetComponent<RectTransform>(); 36 // プレイヤーの位置を取得 37 Vector3 playerPos = collision.transform.position; 38 // Rigidbodyにアクセスして変数に保持しておく 39 myRigidbody = GetComponent<Rigidbody2D>(); 40 // 画面描画用のCanvasを取得 41 var canvas = GetComponentInParent<Canvas>(); 42 43 if (collision.gameObject.CompareTag("Block")) 44 { 45 // ボールとブロックの接触時のx座標差 46 float ballblockgap = collision.contacts[0].point.x - objBall.x; 47 48 if (ballblockgap > 5f) 49 { 50 // 225度に進む 51 myRigidbody.velocity = new Vector3(speed * -1f, speed * -1f, 0f); 52 // Transformコンポーネントを取得して保持しておく 53 myTransform = transform; 54 } 55 // 反射角はボールとブロックの接触時のx座標差によって分けています。 56 // 反射角は上記new Vector3のようにボールのスピードに掛ける数値(f)を変えることで指定しています。 57 // 指定角度の数だけ同じパターンの記述が続くので省略します。 58 } 59 if (collision.gameObject.CompareTag("Player")) 60 { 61 // ボールとプレイヤーの接触時のx座標差 62 float point = collision.contacts[0].point.x - objPlayer.x; 63 // プレイヤーの1/8の長さに対するボールとプレイヤーのx座標差 64 float defference = point / ((playerRectTransform.sizeDelta.x) / 8); 65 66 if ((defference > 3.5) && (defference <= 4)) 67 { 68 // 45度に進む 69 myRigidbody.velocity = new Vector3(speed * 1f, speed * 1f, 0f); 70 // Transformコンポーネントを取得して保持しておく 71 myTransform = transform; 72 } 73 // 反射角はボールとプレイヤーの接触時のx座標差によって分けています。 74 // 反射角は上記new Vector3のようにボールのスピードに掛ける数値(f)を変えることで指定しています。 75 // 指定角度の数だけ同じパターンの記述が続くので省略します。 76 } 77 } 78 // 毎フレーム速度をチェックする 79 void Update() 80 { 81 // 現在の速度を取得 82 Vector3 velocity = myRigidbody.velocity; 83 // 速さを計算 84 float clampedSpeed = Mathf.Clamp(velocity.magnitude, minSpeed, maxSpeed); 85 // 速度を変更 86 myRigidbody.velocity = velocity.normalized * clampedSpeed; 87 } 88}
コードを全部ではありませんが、ボールの動くコードは載せられたと思います。
こちらでいかがでしょうか。