回答編集履歴

5

回答修正します。

2019/04/06 11:14

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,3 +1,143 @@
1
+ ### [追記] 追記していただいた画像について
2
+
3
+ どちらも合ってます。Creator.csのコードも問題ありません。
4
+
5
+
6
+
7
+ ### [追記] スコアが9ずつ増えていきます
8
+
9
+ これは、今分かりません。下記コードで試してみて9つ増えるのであれば言ってください。
10
+
11
+
12
+
13
+ ### [追記] コードを一部修正します。
14
+
15
+ コード見ました。```itemCreator```をstaticにしてましたがstaticは理解するまで使わない方が良いです。といっても慣れた頃には使わない方が良いコードが書けると理解すると思います。今は```DataManager```ぐらいにしておくのがおすすめです。```DataManager```は変えず、下記のような形でどうでしょうか?
16
+
17
+
18
+
19
+ itemCreator.cs
20
+
21
+ ```C#
22
+
23
+ using UnityEngine;
24
+
25
+ using System.Collections;
26
+
27
+ using System.Collections.Generic;
28
+
29
+
30
+
31
+ public class itemCreator : MonoBehaviour
32
+
33
+ {
34
+
35
+ //フォルダに入れたitemをアタッチ
36
+
37
+ public GameObject target;
38
+
39
+
40
+
41
+ void Start()
42
+
43
+ {
44
+
45
+ DataManager.Instance.OnAddScore += OnAddScore;
46
+
47
+ }
48
+
49
+
50
+
51
+ public void Create()
52
+
53
+ {
54
+
55
+ var pos = GetRandomPos();
56
+
57
+ Instantiate(target, pos, Quaternion.identity);
58
+
59
+ }
60
+
61
+
62
+
63
+ //スコアが加算された時に呼ばれる
64
+
65
+ public void OnAddScore(int score)
66
+
67
+ {
68
+
69
+ //スコアが加算されたので生成
70
+
71
+ Create();
72
+
73
+ }
74
+
75
+
76
+
77
+ Vector3 GetRandomPos()
78
+
79
+ {
80
+
81
+ return new Vector3(
82
+
83
+ UnityEngine.Random.Range(-9.0f, 9.0f),
84
+
85
+ 0.5f,
86
+
87
+ UnityEngine.Random.Range(-9.0f, 9.0f)
88
+
89
+ );
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+
98
+
99
+ item.cs
100
+
101
+ ```C#
102
+
103
+
104
+
105
+ using UnityEngine;
106
+
107
+
108
+
109
+ public class item : MonoBehaviour
110
+
111
+ {
112
+
113
+ void OnTriggerEnter(Collider hit)
114
+
115
+ {
116
+
117
+ if (hit.CompareTag("Player"))
118
+
119
+ {
120
+
121
+ DataManager.Instance.AddScore(100);
122
+
123
+ Destroy(gameObject);
124
+
125
+ }
126
+
127
+ }
128
+
129
+ }
130
+
131
+ ```
132
+
133
+
134
+
135
+
136
+
137
+ ### 過去回答
138
+
139
+
140
+
1
141
  回答させていいただきます。```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
2
142
 
3
143
 

4

追記

2019/04/06 11:14

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -20,11 +20,13 @@
20
20
 
21
21
 
22
22
 
23
- ### [追記]書いてみたので共有します
23
+ ### [追記]書いてみまし
24
+
24
-
25
+ 書いてみたので共有します。参考になりますと幸いです。
25
-
26
-
26
+
27
+
28
+
27
- DataManager データの管理を担当
29
+ **DataManager データの管理を担当**
28
30
 
29
31
  DontDestroyOnLoadを付与したシングルトンです。
30
32
 
@@ -162,7 +164,7 @@
162
164
 
163
165
 
164
166
 
165
- ItemCreator アイテムの生成とアイテムに一括処理したい内容を記述
167
+ **ItemCreator アイテムの生成とアイテムに一括処理したい内容を記述**
166
168
 
167
169
  ```C#
168
170
 
@@ -272,7 +274,7 @@
272
274
 
273
275
 
274
276
 
275
- ScoreTxt スコアの表示を担当
277
+ **ScoreTxt スコアの表示を担当**
276
278
 
277
279
  ```C#
278
280
 
@@ -336,7 +338,7 @@
336
338
 
337
339
 
338
340
 
339
- item アイテム 少々改変しました
341
+ **item 少々改変しました**
340
342
 
341
343
  ```C#
342
344
 

3

追記

2019/04/02 14:10

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,6 +1,4 @@
1
- 回答させていいただきます。
2
-
3
- ```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
1
+ 回答させていいただきます。```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
4
2
 
5
3
 
6
4
 
@@ -19,3 +17,399 @@
19
17
  ・ItemCreator itemの生成、itemに対して一括処理したい内容(消した時の獲得スコアなど)を記述するスクリプト
20
18
 
21
19
  ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト
20
+
21
+
22
+
23
+ ### [追記]書いてみたので共有します
24
+
25
+
26
+
27
+ DataManager データの管理を担当
28
+
29
+ DontDestroyOnLoadを付与したシングルトンです。
30
+
31
+
32
+
33
+ ```C#
34
+
35
+ using System;
36
+
37
+ using UnityEngine;
38
+
39
+
40
+
41
+ public class DataManager : MonoBehaviour
42
+
43
+ {
44
+
45
+ //シングルトン化 DataManager.Instanceで何処からでもアクセスできます。
46
+
47
+ public static DataManager Instance
48
+
49
+ {
50
+
51
+ get{
52
+
53
+ if (_instance == null)
54
+
55
+ {
56
+
57
+ _instance = LoadInstance();
58
+
59
+ }
60
+
61
+ return _instance;
62
+
63
+ }
64
+
65
+ }
66
+
67
+ static DataManager _instance;
68
+
69
+
70
+
71
+ /// <summary>
72
+
73
+ /// スコアが追加されたのを通知
74
+
75
+ /// </summary>
76
+
77
+ public event Action<int> OnAddScore = delegate {};
78
+
79
+
80
+
81
+ /// <summary>
82
+
83
+ /// 現在のスコア
84
+
85
+ /// </summary>
86
+
87
+ /// <value>The score.</value>
88
+
89
+ public int Score{ get; private set; }
90
+
91
+
92
+
93
+ void Awake()
94
+
95
+ {
96
+
97
+ if(_instance != null
98
+
99
+ && _instance != this)
100
+
101
+ {
102
+
103
+ Destroy(gameObject);
104
+
105
+ }
106
+
107
+ }
108
+
109
+
110
+
111
+ public void AddScore(int addScore)
112
+
113
+ {
114
+
115
+ //スコアを加算
116
+
117
+ Score += addScore;
118
+
119
+ //通知
120
+
121
+ OnAddScore(Score);
122
+
123
+ }
124
+
125
+
126
+
127
+ /// <summary>
128
+
129
+ /// インスタンスの設定
130
+
131
+ /// </summary>
132
+
133
+ public static DataManager LoadInstance()
134
+
135
+ {
136
+
137
+ var instance = FindObjectOfType<DataManager>();
138
+
139
+
140
+
141
+ if(instance == null)
142
+
143
+ {
144
+
145
+ var go = new GameObject("DataManager", new []{typeof(DataManager) });
146
+
147
+ instance = go.GetComponent<DataManager>();
148
+
149
+ }
150
+
151
+
152
+
153
+ DontDestroyOnLoad(instance.gameObject);
154
+
155
+ return instance;
156
+
157
+ }
158
+
159
+ }
160
+
161
+ ```
162
+
163
+
164
+
165
+ ItemCreator アイテムの生成とアイテムに一括処理したい内容を記述
166
+
167
+ ```C#
168
+
169
+ using UnityEngine;
170
+
171
+
172
+
173
+ public class ItemCreator : MonoBehaviour
174
+
175
+ {
176
+
177
+ /// <summary>
178
+
179
+ /// アイテムのPrefabをHierarchyから設置
180
+
181
+ /// </summary>
182
+
183
+ [SerializeField] item ItemPrefab;
184
+
185
+
186
+
187
+ void Awake()
188
+
189
+ {
190
+
191
+ //すでにHierarchyに設置されているitemがあれば初期化します。
192
+
193
+ //FindObjectsOfTypeは重い処理なのであまり使わない方が良いです。
194
+
195
+ foreach (var item in FindObjectsOfType<item>())
196
+
197
+ {
198
+
199
+ SetUpItem(item);
200
+
201
+ }
202
+
203
+ }
204
+
205
+
206
+
207
+ /// <summary>
208
+
209
+ /// アイテムの生成
210
+
211
+ /// </summary>
212
+
213
+ /// <param name="pos">Position.</param>
214
+
215
+ public void Create(Vector3 pos)
216
+
217
+ {
218
+
219
+ var script = Instantiate<item>(ItemPrefab, pos, Quaternion.identity);
220
+
221
+ //アイテムの初期化
222
+
223
+ SetUpItem(script);
224
+
225
+ }
226
+
227
+
228
+
229
+ /// <summary>
230
+
231
+ /// アイテムの初期化
232
+
233
+ /// </summary>
234
+
235
+ /// <param name="item">Item.</param>
236
+
237
+ void SetUpItem(item item)
238
+
239
+ {
240
+
241
+ //アイテムの初期化
242
+
243
+ item.Initialized(1);
244
+
245
+ item.OnDestroyItem += OnDestroyItem;
246
+
247
+ }
248
+
249
+
250
+
251
+ /// <summary>
252
+
253
+ /// itemが破棄されたタイミングで呼ばれるイベント
254
+
255
+ /// </summary>
256
+
257
+ /// <param name="item">Item.</param>
258
+
259
+ void OnDestroyItem(item item)
260
+
261
+ {
262
+
263
+ //itemが破棄されたのでDataManagerにスコア通知
264
+
265
+ DataManager.Instance.AddScore(item.AddScore);
266
+
267
+ }
268
+
269
+ }
270
+
271
+ ```
272
+
273
+
274
+
275
+ ScoreTxt スコアの表示を担当
276
+
277
+ ```C#
278
+
279
+ using UnityEngine;
280
+
281
+ using UnityEngine.UI;
282
+
283
+
284
+
285
+ public class ScoreTxt : MonoBehaviour
286
+
287
+ {
288
+
289
+ /// <summary>
290
+
291
+ /// テキストを設定
292
+
293
+ /// </summary>
294
+
295
+ [SerializeField] Text TxtRender;
296
+
297
+
298
+
299
+ void Start()
300
+
301
+ {
302
+
303
+ //初期スコアを設定
304
+
305
+ OnAddScore(DataManager.Instance.Score);
306
+
307
+
308
+
309
+ // スコア追加イベントを受け取る
310
+
311
+ DataManager.Instance.OnAddScore += OnAddScore;
312
+
313
+ }
314
+
315
+
316
+
317
+ /// <summary>
318
+
319
+ /// スコアがカウントされると呼ばれる
320
+
321
+ /// </summary>
322
+
323
+ /// <param name="score">Score.</param>
324
+
325
+ void OnAddScore(int score)
326
+
327
+ {
328
+
329
+ TxtRender.text = score.ToString();
330
+
331
+ }
332
+
333
+ }
334
+
335
+ ```
336
+
337
+
338
+
339
+ item アイテム 少々改変しました
340
+
341
+ ```C#
342
+
343
+ using System;
344
+
345
+ using UnityEngine;
346
+
347
+
348
+
349
+ public class item : MonoBehaviour
350
+
351
+ {
352
+
353
+ /// <summary>
354
+
355
+ /// itemが削除される際に呼ばれるイベント
356
+
357
+ /// </summary>
358
+
359
+ public event Action<item> OnDestroyItem = delegate {};
360
+
361
+
362
+
363
+ /// <summary>
364
+
365
+ /// 追加するスコア
366
+
367
+ /// </summary>
368
+
369
+ /// <value>The add score.</value>
370
+
371
+ public int AddScore{ get; private set; }
372
+
373
+
374
+
375
+ public void Initialized(int addScore)
376
+
377
+ {
378
+
379
+ AddScore = addScore;
380
+
381
+ }
382
+
383
+
384
+
385
+ void OnTriggerEnter(Collider hit)
386
+
387
+ {
388
+
389
+ if (hit.CompareTag("Player"))
390
+
391
+ {
392
+
393
+ OnDestroyItem(this);
394
+
395
+ Destroy(gameObject);
396
+
397
+ }
398
+
399
+ }
400
+
401
+
402
+
403
+ void OnDestroy()
404
+
405
+ {
406
+
407
+ //イベントがバインドされている場合、GCに回収されない場合があるので破棄する
408
+
409
+ OnDestroyItem = null;
410
+
411
+ }
412
+
413
+ }
414
+
415
+ ```

2

追記

2019/04/02 14:08

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -16,4 +16,6 @@
16
16
 
17
17
  ・ScoreTxt DataManagerのスコアが加算されたら表示するスクリプト
18
18
 
19
+ ・ItemCreator itemの生成、itemに対して一括処理したい内容(消した時の獲得スコアなど)を記述するスクリプト
20
+
19
21
  ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト

1

追記

2019/04/02 12:18

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,3 +1,19 @@
1
1
  回答させていいただきます。
2
2
 
3
3
  ```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
4
+
5
+
6
+
7
+ ただ、あまり良い方法とは言えません。
8
+
9
+ スコアを管理するスクリプトを用意して、そちらに通知するのが良いと思います。
10
+
11
+ 僕なら下記のようにします。
12
+
13
+
14
+
15
+ ・DataManager スコアを管理するスクリプト
16
+
17
+ ・ScoreTxt DataManagerのスコアが加算されたら表示するスクリプト
18
+
19
+ ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト