回答編集履歴
2
誤字修正
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
質問文編集を受けて追記
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
|
+
```
|