回答編集履歴

5

言い回し修正

2023/08/20 11:52

投稿

UnchFullburst
UnchFullburst

スコア669

test CHANGED
@@ -81,4 +81,4 @@
81
81
  1. OnTriggerEnterでBeamがPlayerHpにダメージを与える
82
82
  2. PlayerHpがHpを計算する
83
83
  3. 計算した結果、Hp =< 0だったらGameOverを呼び出す
84
- という処理の流れになり、Updateで常時監視する必要がなくなり、死んときだけゲームオーバーが呼び出されるようになります。
84
+ という処理の流れになり、Updateで常時監視する必要がなくなり、Hp =< 0の瞬間だけゲームオーバーが呼び出されるようになります。

4

コメント追記

2023/08/20 11:50

投稿

UnchFullburst
UnchFullburst

スコア669

test CHANGED
@@ -77,4 +77,8 @@
77
77
  }
78
78
  ```
79
79
 
80
-
80
+ 余談1、2のコードを合わせると、
81
+ 1. OnTriggerEnterでBeamがPlayerHpにダメージを与える
82
+ 2. PlayerHpがHpを計算する
83
+ 3. 計算した結果、Hp =< 0だったらGameOverを呼び出す
84
+ という処理の流れになり、Updateで常時監視する必要がなくなり、死んだときだけゲームオーバーが呼び出されるようになります。

3

コード修正

2023/08/20 11:20

投稿

UnchFullburst
UnchFullburst

スコア669

test CHANGED
@@ -55,9 +55,9 @@
55
55
  {
56
56
  Hp -= damageAmount;
57
57
 
58
- if (hp <= 0) // 死んだときに
58
+ if (Hp <= 0) // 死んだときに
59
59
  {
60
- hp = 0;
60
+ Hp = 0;
61
61
  onDeath.Invoke(); // インスペクターで登録した他クラスの死亡時に呼び出したいメソッドを呼ぶ
62
62
  }
63
63
  }

2

変数修正

2023/08/20 11:17

投稿

UnchFullburst
UnchFullburst

スコア669

test CHANGED
@@ -14,7 +14,7 @@
14
14
  {
15
15
  ```
16
16
  なぜなら障害物やオブジェクトを増やすたびにプレイヤーのif文を増やして処理を書かなかればいけないからです。
17
- Playerにvoid Damge(int damageAmount)といった、基本的なHP増減メソッドを定義し、ダメージを与えるオブジェクト側(今回だとBeam側)がPlayerHpを呼び出すといいです。
17
+ PlayerHpにvoid Damge(int damageAmount)といった、基本的なHP増減メソッドを定義し、ダメージを与えるオブジェクト側(今回だとBeam側)がPlayerHpを呼び出すといいです。
18
18
  つまりこうです。
19
19
  #### **Beam.cs**
20
20
  ```csharp

1

修正

2023/08/20 11:16

投稿

UnchFullburst
UnchFullburst

スコア669

test CHANGED
@@ -6,6 +6,32 @@
6
6
  Updateの中でプレイヤーのリアルタイムのHPを見たければ、`HitPoint.Hp`を見る必要があります。
7
7
 
8
8
  ### 余談1
9
+ **PlayerHpがオブジェクトをチェック**してダメージを計算する仕組みはおすすめしません。
10
+ ```csharp
11
+ void OnCollisionEnter(Collision collision)
12
+ {
13
+ if(collision.gameObject.tag == "Beam")
14
+ {
15
+ ```
16
+ なぜなら障害物やオブジェクトを増やすたびにプレイヤーのif文を増やして処理を書かなかればいけないからです。
17
+ Playerにvoid Damge(int damageAmount)といった、基本的なHP増減メソッドを定義し、ダメージを与えるオブジェクト側(今回だとBeam側)がPlayerHpを呼び出すといいです。
18
+ つまりこうです。
19
+ #### **Beam.cs**
20
+ ```csharp
21
+ private void OnTriggerEnter(Collider other)
22
+ {
23
+ PlayerHp playerHp = other.GetComponent<PlayerHp>();
24
+ if (playerHp)
25
+ {
26
+ playerHp.Damage(1);
27
+ }
28
+ }
29
+ ```
30
+ 最初の書き方では、**PlayerHpはダメージを与えるオブジェクトを全て知らなければならない**ですが、
31
+ こちらの書き方は **ダメージを与えるオブジェクトがPlayerHpだけを知っていればいい** ので、オブジェクトが増えたときにコードがすっきり分かりやすくなります。
32
+
33
+
34
+ ### 余談2
9
35
  **特定の値になったときに処理を呼び出すようにしたい**のであれば、デリゲートを使うといい感じです。
10
36
  UnityにはUnityEventという仕組みがあるので、今回のケースだと以下のように書けます。
11
37
  (コードをアタッチしたあとに、インスペクターでonDeathにGameOver.OnGameOverを登録する必要があります)
@@ -51,29 +77,4 @@
51
77
  }
52
78
  ```
53
79
 
54
- ### 余談2
55
- **PlayerHpがオブジェクトをチェック**してダメージを計算する仕組みはおすすめしません。
56
- ```csharp
57
- void OnCollisionEnter(Collision collision)
58
- {
59
- if(collision.gameObject.tag == "Beam")
60
- {
61
- ```
62
- なぜなら障害物やオブジェクトを増やすたびにプレイヤーのif文を増やして処理を書かなかればいけないからです。
63
- Playerにvoid Damge(int damageAmount)といった、基本的なHP増減メソッドを定義し、ダメージを与えるオブジェクト側(今回だとBeam側)がPlayerHpを呼び出すといいです。
64
- つまりこうです。
65
- #### **Beam.cs**
66
- ```csharp
67
- private void OnTriggerEnter(Collider other)
68
- {
69
- PlayerHp playerHp = other.GetComponent<PlayerHp>();
70
- if (playerHp)
71
- {
72
- playerHp.Damage(1);
73
- }
74
- }
75
- ```
76
- 最初の書き方では、**PlayerHpはダメージを与えるオブジェクトを全て知らなければならない**ですが、
77
- こちらの書き方は **ダメージを与えるオブジェクトがPlayerHpだけを知っていればいい** ので、オブジェクトが増えたときにコードがすっきり分かりやすくなります。
78
80
 
79
-