回答編集履歴

1

サンプルコードをより適切なもので追記

2020/04/19 07:29

投稿

dodox86
dodox86

スコア9183

test CHANGED
@@ -1,3 +1,9 @@
1
+ ---
2
+
3
+ **※以下の回答は足りないものがありましたので追記しました。下方の追記部分もご覧ください。**
4
+
5
+
6
+
1
7
  私自身の都合で今現在Unityをインストールしてなく、Unity用のコードではないので恐縮ですが、`for`文で希望の人数`Max`?人分の`Name`、`HP`フィールドを初期化したいのですよね。
2
8
 
3
9
  恐らく以下のようなことがやりたいのではないかと思いました。(Visual Studio 2019 のC#コンソールアプリケーションです)
@@ -99,3 +105,241 @@
99
105
  諦めることなんて無いと思います。既存のものから改造、改良していくのは、正しいひとつのやり方です。
100
106
 
101
107
  ただ、基本的な文法はちゃんと理解されることを強くお勧めします。そうでないと理解に無駄な時間を過ごしてしまいます。
108
+
109
+
110
+
111
+ ---
112
+
113
+ **追記しました: 2020-04-19: 16:28**
114
+
115
+
116
+
117
+ 先の私の回答は「質問者さん提示のC#コードでは、フィールドの初期化のコードが間違っている」との指摘のみだったので、私のサンプルのコードも最終的にやりたい
118
+
119
+ こととしては恐らく不適切なものでした。ご要望に沿ったかたちでUnityで実装してみましたので、ひとつの案としてご紹介します。
120
+
121
+
122
+
123
+ そもそも要望としてはキャラクター1つに対して以下のような管理をしたいということなので、
124
+
125
+ ```
126
+
127
+ ▼Chara1
128
+
129
+ キャラクター1の名前
130
+
131
+ キャラクター1のHPの数値
132
+
133
+ ▼Chara2
134
+
135
+ キャラクター2の名前
136
+
137
+ キャラクター2のHPの数値
138
+
139
+ ...
140
+
141
+ ```
142
+
143
+
144
+
145
+ まず、名前とヒットポイント(HP)をもつキャラクターを表すクラス`Character`を作成します。
146
+
147
+ ```C#
148
+
149
+ // Character.cs
150
+
151
+ // 名前とヒットポイント(HP)をもつキャラクターのクラス
152
+
153
+ public class Character
154
+
155
+ {
156
+
157
+ // ※プロパティの方が良いが、簡単にする為、単なるフィールドで。
158
+
159
+ public string Name = string.Empty;
160
+
161
+
162
+
163
+ public int HP = 0;
164
+
165
+ }
166
+
167
+ ```
168
+
169
+
170
+
171
+ 次に、`Character`クラスを配列で管理する`CharacterList`を作成します。これがデータベースのコンポーネント本体です。`Database`オブジェクトにアタッチします。
172
+
173
+ ※実際には配列は、`List`クラスを使った方が扱いやすいかもしれません。
174
+
175
+ ```C#
176
+
177
+ using UnityEngine;
178
+
179
+
180
+
181
+ // Databaseオブジェクトで使うCharacterListコンポーネント
182
+
183
+ // Characterクラスを配列/リストで管理する
184
+
185
+ public class CharacterList : MonoBehaviour
186
+
187
+ {
188
+
189
+ // publicフィールドにしたので[SerializeField]属性は不要(?)
190
+
191
+ // https://docs.unity3d.com/jp/460/ScriptReference/SerializeField.html
192
+
193
+ //[SerializeField]
194
+
195
+ public int Max = 5;
196
+
197
+
198
+
199
+ //[SerializeField]
200
+
201
+ public Character[] Characters;
202
+
203
+
204
+
205
+ public void Initialize()
206
+
207
+ {
208
+
209
+ Debug.Log("CharacterList.Initialize()");
210
+
211
+
212
+
213
+ Characters = new Character[Max];
214
+
215
+ for (int i = 1; i <= Max; i++)
216
+
217
+ {
218
+
219
+ // "Name1", "Name2", ...の名前を生成
220
+
221
+ Character character = new Character();
222
+
223
+ character.Name = string.Format("Name{0}", i);
224
+
225
+ }
226
+
227
+ }
228
+
229
+
230
+
231
+ void Start()
232
+
233
+ {
234
+
235
+ Debug.Log("CharacterList.Start():");
236
+
237
+ }
238
+
239
+ }
240
+
241
+
242
+
243
+ ```
244
+
245
+
246
+
247
+ で、ゲーム(?)の本体で`Database`オブジェクトを`targetObject`として参照し、`CharacterList`クラスであるコンポーネントを呼び出します。
248
+
249
+ ```C#
250
+
251
+ using System.Collections;
252
+
253
+ using System.Collections.Generic;
254
+
255
+ using UnityEngine;
256
+
257
+
258
+
259
+ public class Runner : MonoBehaviour
260
+
261
+ {
262
+
263
+ public GameObject targetObject;
264
+
265
+
266
+
267
+ // Start is called before the first frame update
268
+
269
+ void Start()
270
+
271
+ {
272
+
273
+ Debug.Log("Runner.Start(): started.");
274
+
275
+
276
+
277
+ // "Database"オブジェクトを探す
278
+
279
+ targetObject = GameObject.Find("Database");
280
+
281
+ if (targetObject == null)
282
+
283
+ {
284
+
285
+ // Databaseオブジェクトが見つからない
286
+
287
+ Debug.Log("Runner.Start(): unable to find Database");
288
+
289
+ return;
290
+
291
+ }
292
+
293
+
294
+
295
+ // "CharacterList"コンポーネントを取得
296
+
297
+ CharacterList list = targetObject.GetComponent<CharacterList>();
298
+
299
+ if (list == null)
300
+
301
+ {
302
+
303
+ // Databaseオブジェクト中のCharacterListコンポーネントが見つからない
304
+
305
+ return;
306
+
307
+ }
308
+
309
+
310
+
311
+ // Databaseオブジェクト、CharacterListの初期化
312
+
313
+ list.Initialize();
314
+
315
+
316
+
317
+ Debug.Log("Runner.Start(): done.");
318
+
319
+ }
320
+
321
+
322
+
323
+ // Update is called once per frame
324
+
325
+ void Update()
326
+
327
+ {
328
+
329
+
330
+
331
+ }
332
+
333
+ }
334
+
335
+ ```
336
+
337
+ Unityエディターの状況です。
338
+
339
+ ![イメージ説明](4cb323906162bfe9cc94c26de140c6ea.png)
340
+
341
+
342
+
343
+ 最終的に質問者さんがやりたいことに合致しているか分かりませんが、恐らくこんな感じになるのではなかろうか、と。(C#のコードはあえて冗長な書き方にしました)
344
+
345
+ 上記回答では納得できないかもしれませんし、Unityに詳しい他の回答者さんに私より適切な回答をいただけるかもしれません。しばらく質問を閉じずにいても良いかと思います。