質問するログイン新規登録

回答編集履歴

2

誤字修正

2020/05/18 11:04

投稿

sakura_hana
sakura_hana

スコア11429

answer CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  ちなみに別解。
19
19
  上記のように「localScaleで左右表示を切り替えている」と分かれば、変数を挟まずに
20
- `if (transform.localScale == 1) {}`
20
+ `if (transform.localScale.x == 1) {}`
21
21
  と直で調べてしまうことも出来ます。(これは右向きの時に条件を満たす)(transformの参照は適宜正しく取ってください)
22
22
 
23
23
  これは「"右向き"というのはどういうことか?」を考えて、それぞれのコードが意味するところが分かっていれば導けます。

1

質問文編集を受けて追記

2020/05/18 11:04

投稿

sakura_hana
sakura_hana

スコア11429

answer CHANGED
@@ -21,4 +21,66 @@
21
21
  と直で調べてしまうことも出来ます。(これは右向きの時に条件を満たす)(transformの参照は適宜正しく取ってください)
22
22
 
23
23
  これは「"右向き"というのはどういうことか?」を考えて、それぞれのコードが意味するところが分かっていれば導けます。
24
- 最初は難しいかもしれませんが理解すると色々出来るので頑張ってみてください。
24
+ 最初は難しいかもしれませんが理解すると色々出来るので頑張ってみてください。
25
+
26
+ ---
27
+
28
+ (質問文編集を受けて追記)
29
+
30
+ 質問文には元々方向反転の記述がありますよね。
31
+ 何故消してしまったのでしょうか。そのまま利用すればいいです。
32
+
33
+ また、これは動かしてみれば分かりますが、boolは値型の変数なので「代入したタイミングの値をコピー」します。
34
+ つまりStartメソッド内に`isLeft = player.GetComponent<Player>().isLeft;`がありますが、
35
+ これだと「StartしたタイミングでのPlayerクラスのisLeft」しか反映されません。
36
+ 必要なタイミング(今回は発射ボタンを押したタイミング)で代入しましょう。
37
+
38
+ 更にこれはオマケですが、負荷についても考慮しましょう。
39
+ Updateはそのままだと毎フレーム実行されます。向き情報(offsetの用意)が必要なのは弾が発射された時だけなので、`if (Input.GetButtonDown("Fire1"))`の中に入れると余計な実行が減らせます。
40
+ また、出来るだけGetComponentの回数は減らした方が負荷が減るので、(今回はそう大差無いでしょうが)そういう風に書く癖を付けておきましょう。
41
+
42
+ という訳でPlayerBulletクラスを以下のように書くと上手くいくと思います。
43
+
44
+ ```C#
45
+ public class PlayerBullet : MonoBehaviour
46
+ {
47
+ // InspectorでPrefab化したBulletを指定する
48
+ [SerializeField]
49
+ public GameObject bullet;
50
+ public Player player; //編集:Playerクラスをそのまま受け取ります
51
+
52
+ //private bool isLeft; //編集:1つのメソッドの中でしか使わないので不要です
53
+
54
+ // ユーザーがどちらを向いているか
55
+ void Start()
56
+ {
57
+ //isLeft = player.GetComponent<Player>().isLeft; //ここも不要
58
+ }
59
+
60
+ void Update()
61
+ {
62
+ // 弾オブジェクトを生成して飛ばす関数を呼び出す
63
+ ShotAction();
64
+ }
65
+
66
+ void ShotAction()
67
+ {
68
+ //offsetの用意はボタンを押した時の処理内に移動します
69
+
70
+ if (Input.GetButtonDown("Fire1"))
71
+ {
72
+ Vector3 offset = new Vector3(1.0f, 0.0f, 0.0f); //移動してきました
73
+ bool isLeft = player.isLeft; //ここで受け取り・Playerクラスをそのまま受け取っているのでGetComponentは要りません
74
+ if (isLeft)
75
+ {
76
+ offset.x = -offset.x; //元コードと同じです
77
+ }
78
+
79
+ // Bulletコンポーネントがアタッチしている前提
80
+ var bulletObj = Instantiate(bullet, transform.position + offset, transform.rotation);
81
+ bulletObj.GetComponent<Bullet>().SetDirection(isLeft);
82
+ }
83
+ }
84
+ }
85
+
86
+ ```