回答編集履歴

7

誤字修正

2017/02/23 02:23

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -106,7 +106,7 @@
106
106
 
107
107
  {
108
108
 
109
- var instanceId = hitObj.GetInstanceId();
109
+ var instanceId = obj.GetInstanceId();
110
110
 
111
111
  if (hitIdSet.Contains(instanceId)) return false;
112
112
 

6

注意を追加

2017/02/23 02:23

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -1,3 +1,7 @@
1
+ **※僕はUnityでゲーム開発していないので、こういう処理が既に用意されてるかどうかは分かりません**
2
+
3
+
4
+
1
5
  リストの初期化は敵のObjectを破壊したときにできればいいってことでしょうかね。
2
6
 
3
7
 

5

誤字の修正

2017/02/23 01:44

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  HashSetクラスは、要素として値を持つかどうかを判定することだけに長けたクラスです。
50
50
 
51
- Listとコード自体は一緒ですが、要素の検索を素早く行えます。
51
+ Listとコード自体は一緒ですが、要素の検索を素早く行えます。
52
52
 
53
53
 
54
54
 

4

コードの不具合修正

2017/02/23 01:39

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- private readonly ProcessGuard hitIdGuard = new HashSet<int>();
123
+ private readonly ProcessGuard hitIdGuard = new ProcessGuard();
124
124
 
125
125
 
126
126
 

3

関数名の変更

2017/02/23 01:38

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
 
100
100
 
101
- public bool ProcessOnce(GameObject obj)
101
+ public bool PassOnce(GameObject obj)
102
102
 
103
103
  {
104
104
 
@@ -126,7 +126,7 @@
126
126
 
127
127
  public void EnemyHPSystem(GameObject hitobj,GameObject HitCol,int Damagenum){
128
128
 
129
- if (!hitIdGuard.ProcessOnce(hitobj)) return;
129
+ if (!hitIdGuard.PassOnce(hitobj)) return;
130
130
 
131
131
 
132
132
 

2

文言の削除

2017/02/23 01:37

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -84,7 +84,7 @@
84
84
 
85
85
  こういう処理は沢山書くと思うので、専用のクラスを書いてラップしておくとすっきりします。
86
86
 
87
- ロック処理等を含む処理の修正が必要な場合でも一括で修正できるようになるので、ラップしておきしょう
87
+ 処理の修正が必要な場合でも一括で修正できるようにな
88
88
 
89
89
  ※名前は適当!
90
90
 

1

追記

2017/02/23 01:35

投稿

haru666
haru666

スコア1591

test CHANGED
@@ -14,9 +14,15 @@
14
14
 
15
15
  public void EnemyHPSystem(GameObject hitobj,GameObject HitCol,int Damagenum){
16
16
 
17
+ // 1. オブジェクトのIDを取得します(GameObjectのリストにすると参照関係が怖いからね)
18
+
17
19
  var instanceId = hitObj.GetInstanceId();
18
20
 
21
+ // 2. オブジェクトのIDがリストに含まれていないか確認、含まれていれば処理終了
22
+
19
23
  if (hitIdList.Contains(instanceId)) return;
24
+
25
+ // 3. オブジェクトのIDをリストに追加して処理に進む
20
26
 
21
27
  hitIdList.Add(instanceId);
22
28
 
@@ -32,15 +38,7 @@
32
38
 
33
39
 
34
40
 
35
- 1. オブジェクトのIDを取得します(GameObjectのリストにすると参照関係が怖いからね)
36
-
37
- 2. オブジェクトのIDがリストに含まれていないか確認、含まれていれば処理終了
38
-
39
- 3. オブジェクトのIDをリストに追加して処理に進む
40
-
41
-
42
-
43
- これで2回同じ処理が行われないようにます。
41
+ これで2回同じ処理が行われないようにできます。
44
42
 
45
43
  非同期で処理が行われていて多重に呼ばれてしまう場合はロックを実装しても同じような効果が得られます。
46
44
 
@@ -77,3 +75,63 @@
77
75
  }
78
76
 
79
77
  ```
78
+
79
+
80
+
81
+ #追記
82
+
83
+
84
+
85
+ こういう処理は沢山書くと思うので、専用のクラスを書いてラップしておくとすっきりします。
86
+
87
+ ロック処理等を含む処理の修正が必要な場合でも一括で修正できるようになるので、ラップしておきましょう。
88
+
89
+ ※名前は適当!
90
+
91
+ ```C#
92
+
93
+ public class ProcessGuard
94
+
95
+ {
96
+
97
+ private readonly HashSet<int> hitIdSet = new HashSet<int>();
98
+
99
+
100
+
101
+ public bool ProcessOnce(GameObject obj)
102
+
103
+ {
104
+
105
+ var instanceId = hitObj.GetInstanceId();
106
+
107
+ if (hitIdSet.Contains(instanceId)) return false;
108
+
109
+ hitIdSet.Add(instanceId);
110
+
111
+ return true;
112
+
113
+ }
114
+
115
+ }
116
+
117
+
118
+
119
+ //...
120
+
121
+
122
+
123
+ private readonly ProcessGuard hitIdGuard = new HashSet<int>();
124
+
125
+
126
+
127
+ public void EnemyHPSystem(GameObject hitobj,GameObject HitCol,int Damagenum){
128
+
129
+ if (!hitIdGuard.ProcessOnce(hitobj)) return;
130
+
131
+
132
+
133
+ Damage (HitCol,Damagenum);
134
+
135
+ }
136
+
137
+ ```