回答編集履歴
1
サンプルコードをより適切なもので追記
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に詳しい他の回答者さんに私より適切な回答をいただけるかもしれません。しばらく質問を閉じずにいても良いかと思います。
|