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

回答編集履歴

5

回答修正します。

2019/04/06 11:14

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,3 +1,73 @@
1
+ ### [追記] 追記していただいた画像について
2
+ どちらも合ってます。Creator.csのコードも問題ありません。
3
+
4
+ ### [追記] スコアが9ずつ増えていきます
5
+ これは、今分かりません。下記コードで試してみて9つ増えるのであれば言ってください。
6
+
7
+ ### [追記] コードを一部修正します。
8
+ コード見ました。```itemCreator```をstaticにしてましたがstaticは理解するまで使わない方が良いです。といっても慣れた頃には使わない方が良いコードが書けると理解すると思います。今は```DataManager```ぐらいにしておくのがおすすめです。```DataManager```は変えず、下記のような形でどうでしょうか?
9
+
10
+ itemCreator.cs
11
+ ```C#
12
+ using UnityEngine;
13
+ using System.Collections;
14
+ using System.Collections.Generic;
15
+
16
+ public class itemCreator : MonoBehaviour
17
+ {
18
+ //フォルダに入れたitemをアタッチ
19
+ public GameObject target;
20
+
21
+ void Start()
22
+ {
23
+ DataManager.Instance.OnAddScore += OnAddScore;
24
+ }
25
+
26
+ public void Create()
27
+ {
28
+ var pos = GetRandomPos();
29
+ Instantiate(target, pos, Quaternion.identity);
30
+ }
31
+
32
+ //スコアが加算された時に呼ばれる
33
+ public void OnAddScore(int score)
34
+ {
35
+ //スコアが加算されたので生成
36
+ Create();
37
+ }
38
+
39
+ Vector3 GetRandomPos()
40
+ {
41
+ return new Vector3(
42
+ UnityEngine.Random.Range(-9.0f, 9.0f),
43
+ 0.5f,
44
+ UnityEngine.Random.Range(-9.0f, 9.0f)
45
+ );
46
+ }
47
+ }
48
+ ```
49
+
50
+ item.cs
51
+ ```C#
52
+
53
+ using UnityEngine;
54
+
55
+ public class item : MonoBehaviour
56
+ {
57
+ void OnTriggerEnter(Collider hit)
58
+ {
59
+ if (hit.CompareTag("Player"))
60
+ {
61
+ DataManager.Instance.AddScore(100);
62
+ Destroy(gameObject);
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+
69
+ ### 過去回答
70
+
1
71
  回答させていいただきます。```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
2
72
 
3
73
  ただ、あまり良い方法とは言えません。

4

追記

2019/04/06 11:14

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -9,9 +9,10 @@
9
9
  ・ItemCreator itemの生成、itemに対して一括処理したい内容(消した時の獲得スコアなど)を記述するスクリプト
10
10
  ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト
11
11
 
12
- ### [追記]書いてみたので共有し
12
+ ### [追記]書いてみました
13
+ 書いてみたので共有します。参考になりますと幸いです。
13
14
 
14
- DataManager データの管理を担当
15
+ **DataManager データの管理を担当**
15
16
  DontDestroyOnLoadを付与したシングルトンです。
16
17
 
17
18
  ```C#
@@ -80,7 +81,7 @@
80
81
  }
81
82
  ```
82
83
 
83
- ItemCreator アイテムの生成とアイテムに一括処理したい内容を記述
84
+ **ItemCreator アイテムの生成とアイテムに一括処理したい内容を記述**
84
85
  ```C#
85
86
  using UnityEngine;
86
87
 
@@ -135,7 +136,7 @@
135
136
  }
136
137
  ```
137
138
 
138
- ScoreTxt スコアの表示を担当
139
+ **ScoreTxt スコアの表示を担当**
139
140
  ```C#
140
141
  using UnityEngine;
141
142
  using UnityEngine.UI;
@@ -167,7 +168,7 @@
167
168
  }
168
169
  ```
169
170
 
170
- item アイテム 少々改変しました
171
+ **item 少々改変しました**
171
172
  ```C#
172
173
  using System;
173
174
  using UnityEngine;

3

追記

2019/04/02 14:10

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,5 +1,4 @@
1
- 回答させていいただきます。
2
- ```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
1
+ 回答させていいただきます。```int sc_count```を```static int sc_count```に変更し、```Start```の```sc_count =0;```を削除するとカウントされるはずです。
3
2
 
4
3
  ただ、あまり良い方法とは言えません。
5
4
  スコアを管理するスクリプトを用意して、そちらに通知するのが良いと思います。
@@ -8,4 +7,202 @@
8
7
  ・DataManager スコアを管理するスクリプト
9
8
  ・ScoreTxt DataManagerのスコアが加算されたら表示するスクリプト
10
9
  ・ItemCreator itemの生成、itemに対して一括処理したい内容(消した時の獲得スコアなど)を記述するスクリプト
11
- ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト
10
+ ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト
11
+
12
+ ### [追記]書いてみたので共有します
13
+
14
+ DataManager データの管理を担当
15
+ DontDestroyOnLoadを付与したシングルトンです。
16
+
17
+ ```C#
18
+ using System;
19
+ using UnityEngine;
20
+
21
+ public class DataManager : MonoBehaviour
22
+ {
23
+ //シングルトン化 DataManager.Instanceで何処からでもアクセスできます。
24
+ public static DataManager Instance
25
+ {
26
+ get{
27
+ if (_instance == null)
28
+ {
29
+ _instance = LoadInstance();
30
+ }
31
+ return _instance;
32
+ }
33
+ }
34
+ static DataManager _instance;
35
+
36
+ /// <summary>
37
+ /// スコアが追加されたのを通知
38
+ /// </summary>
39
+ public event Action<int> OnAddScore = delegate {};
40
+
41
+ /// <summary>
42
+ /// 現在のスコア
43
+ /// </summary>
44
+ /// <value>The score.</value>
45
+ public int Score{ get; private set; }
46
+
47
+ void Awake()
48
+ {
49
+ if(_instance != null
50
+ && _instance != this)
51
+ {
52
+ Destroy(gameObject);
53
+ }
54
+ }
55
+
56
+ public void AddScore(int addScore)
57
+ {
58
+ //スコアを加算
59
+ Score += addScore;
60
+ //通知
61
+ OnAddScore(Score);
62
+ }
63
+
64
+ /// <summary>
65
+ /// インスタンスの設定
66
+ /// </summary>
67
+ public static DataManager LoadInstance()
68
+ {
69
+ var instance = FindObjectOfType<DataManager>();
70
+
71
+ if(instance == null)
72
+ {
73
+ var go = new GameObject("DataManager", new []{typeof(DataManager) });
74
+ instance = go.GetComponent<DataManager>();
75
+ }
76
+
77
+ DontDestroyOnLoad(instance.gameObject);
78
+ return instance;
79
+ }
80
+ }
81
+ ```
82
+
83
+ ItemCreator アイテムの生成とアイテムに一括処理したい内容を記述
84
+ ```C#
85
+ using UnityEngine;
86
+
87
+ public class ItemCreator : MonoBehaviour
88
+ {
89
+ /// <summary>
90
+ /// アイテムのPrefabをHierarchyから設置
91
+ /// </summary>
92
+ [SerializeField] item ItemPrefab;
93
+
94
+ void Awake()
95
+ {
96
+ //すでにHierarchyに設置されているitemがあれば初期化します。
97
+ //FindObjectsOfTypeは重い処理なのであまり使わない方が良いです。
98
+ foreach (var item in FindObjectsOfType<item>())
99
+ {
100
+ SetUpItem(item);
101
+ }
102
+ }
103
+
104
+ /// <summary>
105
+ /// アイテムの生成
106
+ /// </summary>
107
+ /// <param name="pos">Position.</param>
108
+ public void Create(Vector3 pos)
109
+ {
110
+ var script = Instantiate<item>(ItemPrefab, pos, Quaternion.identity);
111
+ //アイテムの初期化
112
+ SetUpItem(script);
113
+ }
114
+
115
+ /// <summary>
116
+ /// アイテムの初期化
117
+ /// </summary>
118
+ /// <param name="item">Item.</param>
119
+ void SetUpItem(item item)
120
+ {
121
+ //アイテムの初期化
122
+ item.Initialized(1);
123
+ item.OnDestroyItem += OnDestroyItem;
124
+ }
125
+
126
+ /// <summary>
127
+ /// itemが破棄されたタイミングで呼ばれるイベント
128
+ /// </summary>
129
+ /// <param name="item">Item.</param>
130
+ void OnDestroyItem(item item)
131
+ {
132
+ //itemが破棄されたのでDataManagerにスコア通知
133
+ DataManager.Instance.AddScore(item.AddScore);
134
+ }
135
+ }
136
+ ```
137
+
138
+ ScoreTxt スコアの表示を担当
139
+ ```C#
140
+ using UnityEngine;
141
+ using UnityEngine.UI;
142
+
143
+ public class ScoreTxt : MonoBehaviour
144
+ {
145
+ /// <summary>
146
+ /// テキストを設定
147
+ /// </summary>
148
+ [SerializeField] Text TxtRender;
149
+
150
+ void Start()
151
+ {
152
+ //初期スコアを設定
153
+ OnAddScore(DataManager.Instance.Score);
154
+
155
+ // スコア追加イベントを受け取る
156
+ DataManager.Instance.OnAddScore += OnAddScore;
157
+ }
158
+
159
+ /// <summary>
160
+ /// スコアがカウントされると呼ばれる
161
+ /// </summary>
162
+ /// <param name="score">Score.</param>
163
+ void OnAddScore(int score)
164
+ {
165
+ TxtRender.text = score.ToString();
166
+ }
167
+ }
168
+ ```
169
+
170
+ item アイテム 少々改変しました
171
+ ```C#
172
+ using System;
173
+ using UnityEngine;
174
+
175
+ public class item : MonoBehaviour
176
+ {
177
+ /// <summary>
178
+ /// itemが削除される際に呼ばれるイベント
179
+ /// </summary>
180
+ public event Action<item> OnDestroyItem = delegate {};
181
+
182
+ /// <summary>
183
+ /// 追加するスコア
184
+ /// </summary>
185
+ /// <value>The add score.</value>
186
+ public int AddScore{ get; private set; }
187
+
188
+ public void Initialized(int addScore)
189
+ {
190
+ AddScore = addScore;
191
+ }
192
+
193
+ void OnTriggerEnter(Collider hit)
194
+ {
195
+ if (hit.CompareTag("Player"))
196
+ {
197
+ OnDestroyItem(this);
198
+ Destroy(gameObject);
199
+ }
200
+ }
201
+
202
+ void OnDestroy()
203
+ {
204
+ //イベントがバインドされている場合、GCに回収されない場合があるので破棄する
205
+ OnDestroyItem = null;
206
+ }
207
+ }
208
+ ```

2

追記

2019/04/02 14:08

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -7,4 +7,5 @@
7
7
 
8
8
  ・DataManager スコアを管理するスクリプト
9
9
  ・ScoreTxt DataManagerのスコアが加算されたら表示するスクリプト
10
+ ・ItemCreator itemの生成、itemに対して一括処理したい内容(消した時の獲得スコアなど)を記述するスクリプト
10
11
  ・Item 現在のitemスクリプトのスコア関連を無くしたスクリプト

1

追記

2019/04/02 12:18

投稿

IShix
IShix

スコア1729

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