質問編集履歴

1

ボールのコードを追加しました。

2022/04/11 14:15

投稿

taiyaki
taiyaki

スコア0

test CHANGED
File without changes
test CHANGED
@@ -19,3 +19,100 @@
19
19
  スマホの機種によらず移動速度を安定させる方法をネット検索しても他に見つからず、手詰まりとなってしまいました。
20
20
  どなたかアドバイスをいただけませんでしょうか。
21
21
  お願いいたします。
22
+
23
+
24
+
25
+ **【追加】**
26
+ ボールのコードを追加いたします。
27
+ ```C#(cs)
28
+ public class Ball : MonoBehaviour
29
+ {
30
+ public float speed = 100f; // ボールの移動の速さを指定する変数
31
+ public float minSpeed = 100f; // 速さの最小値を指定する変数
32
+ public float maxSpeed = 150f; // 速さの最大値を指定する変数
33
+
34
+ Vector3 vec;
35
+ Rigidbody2D myRigidbody;
36
+ Transform myTransform;
37
+ GameObject objBlock;
38
+ GameObject objPlayer;
39
+ BlockT block;
40
+ Player player;
41
+ float point; // ボールとプレイヤーの接触時のx座標差
42
+ float defference; // プレイヤーの1/8の長さに対するボールとプレイヤーのx座標差
43
+ float ballblockgap; // ボールとブロックの接触時のx座標差
44
+
45
+ void Start()
46
+ {
47
+ // Rigidbodyにアクセスして変数に保持しておく
48
+ myRigidbody = GetComponent<Rigidbody2D>();
49
+ // 右斜め45度に進む
50
+ myRigidbody.velocity = new Vector3(speed * x, speed * y, 0f);
51
+ // 画面描画用のCanvasを取得
52
+ var canvas = GetComponentInParent<Canvas>();
53
+ // Transformコンポーネントを取得して保持しておく
54
+ myTransform = transform;
55
+ }
56
+
57
+ // 衝突したときに呼ばれる
58
+ void OnCollisionEnter2D(Collision2D collision)
59
+ {
60
+ Vector3 objBall = myTransform.position;
61
+ Vector3 objPlayer = GameObject.Find("Player").transform.position;
62
+ var playerRectTransform = GameObject.Find("Player").GetComponent<RectTransform>();
63
+ // プレイヤーの位置を取得
64
+ Vector3 playerPos = collision.transform.position;
65
+ // Rigidbodyにアクセスして変数に保持しておく
66
+ myRigidbody = GetComponent<Rigidbody2D>();
67
+ // 画面描画用のCanvasを取得
68
+ var canvas = GetComponentInParent<Canvas>();
69
+
70
+ if (collision.gameObject.CompareTag("Block"))
71
+ {
72
+ // ボールとブロックの接触時のx座標差
73
+ float ballblockgap = collision.contacts[0].point.x - objBall.x;
74
+
75
+ if (ballblockgap > 5f)
76
+ {
77
+ // 225度に進む
78
+ myRigidbody.velocity = new Vector3(speed * -1f, speed * -1f, 0f);
79
+ // Transformコンポーネントを取得して保持しておく
80
+ myTransform = transform;
81
+ }
82
+ // 反射角はボールとブロックの接触時のx座標差によって分けています。
83
+ // 反射角は上記new Vector3のようにボールのスピードに掛ける数値(f)を変えることで指定しています。
84
+ // 指定角度の数だけ同じパターンの記述が続くので省略します。
85
+ }
86
+ if (collision.gameObject.CompareTag("Player"))
87
+ {
88
+ // ボールとプレイヤーの接触時のx座標差
89
+ float point = collision.contacts[0].point.x - objPlayer.x;
90
+ // プレイヤーの1/8の長さに対するボールとプレイヤーのx座標差
91
+ float defference = point / ((playerRectTransform.sizeDelta.x) / 8);
92
+
93
+ if ((defference > 3.5) && (defference <= 4))
94
+ {
95
+ // 45度に進む
96
+ myRigidbody.velocity = new Vector3(speed * 1f, speed * 1f, 0f);
97
+ // Transformコンポーネントを取得して保持しておく
98
+ myTransform = transform;
99
+ }
100
+ // 反射角はボールとプレイヤーの接触時のx座標差によって分けています。
101
+ // 反射角は上記new Vector3のようにボールのスピードに掛ける数値(f)を変えることで指定しています。
102
+ // 指定角度の数だけ同じパターンの記述が続くので省略します。
103
+ }
104
+ }
105
+ // 毎フレーム速度をチェックする
106
+ void Update()
107
+ {
108
+ // 現在の速度を取得
109
+ Vector3 velocity = myRigidbody.velocity;
110
+ // 速さを計算
111
+ float clampedSpeed = Mathf.Clamp(velocity.magnitude, minSpeed, maxSpeed);
112
+ // 速度を変更
113
+ myRigidbody.velocity = velocity.normalized * clampedSpeed;
114
+ }
115
+ }
116
+ ```
117
+ コードを全部ではありませんが、ボールの動くコードは載せられたと思います。
118
+ こちらでいかがでしょうか。