※以下の回答は足りないものがありましたので追記しました。下方の追記部分もご覧ください。
私自身の都合で今現在Unityをインストールしてなく、Unity用のコードではないので恐縮ですが、for
文で希望の人数Max
?人分のName
、HP
フィールドを初期化したいのですよね。
恐らく以下のようなことがやりたいのではないかと思いました。(Visual Studio 2019 のC#コンソールアプリケーションです)
※[SerializeField]
の属性が使えないため、単なるコメントにしています。
C#
1namespace ConsoleApp3
2{
3 class Program
4 {
5 // [SerializeField]
6 int Max = 5;
7 // [SerializeField]
8 string[] Name;
9 // [SerializeField]
10 int[] HP;
11
12 // Name, HPフィールドを初期化するメソッド
13 public void InitializeFields()
14 {
15 Name = new string[Max];
16 // nullだとちょっと危険かもしれないので一応 ""で初期化(好きに修正してください)
17 for (int i = 0; i < Name.Length; i++)
18 {
19 Name[i] = string.Empty;
20 }
21
22 HP = new int[Max];
23 }
24
25 // UnityのMonoBehaviourでいうStart()相当メソッド
26 private void Start()
27 {
28 // フィールドをMax人分で初期化
29 InitializeFields();
30 }
31
32 static void Main(string[] args)
33 {
34 var obj = new Program();
35
36 obj.Start();
37 }
38 }
39}
データベースもどきを改造するのが私では難しすぎるならば、諦めることも含めてご助言いただけると嬉しいです。
諦めることなんて無いと思います。既存のものから改造、改良していくのは、正しいひとつのやり方です。
ただ、基本的な文法はちゃんと理解されることを強くお勧めします。そうでないと理解に無駄な時間を過ごしてしまいます。
追記しました: 2020-04-19: 16:28
先の私の回答は「質問者さん提示のC#コードでは、フィールドの初期化のコードが間違っている」との指摘のみだったので、私のサンプルのコードも最終的にやりたい
こととしては恐らく不適切なものでした。ご要望に沿ったかたちでUnityで実装してみましたので、ひとつの案としてご紹介します。
そもそも要望としてはキャラクター1つに対して以下のような管理をしたいということなので、
▼Chara1
キャラクター1の名前
キャラクター1のHPの数値
▼Chara2
キャラクター2の名前
キャラクター2のHPの数値
...
まず、名前とヒットポイント(HP)をもつキャラクターを表すクラスCharacter
を作成します。
C#
1// Character.cs
2// 名前とヒットポイント(HP)をもつキャラクターのクラス
3public class Character
4{
5 // ※プロパティの方が良いが、簡単にする為、単なるフィールドで。
6 public string Name = string.Empty;
7
8 public int HP = 0;
9}
次に、Character
クラスを配列で管理するCharacterList
を作成します。これがデータベースのコンポーネント本体です。Database
オブジェクトにアタッチします。
※実際には配列は、List
クラスを使った方が扱いやすいかもしれません。
C#
1using UnityEngine;
2
3// Databaseオブジェクトで使うCharacterListコンポーネント
4// Characterクラスを配列/リストで管理する
5public class CharacterList : MonoBehaviour
6{
7 // publicフィールドにしたので[SerializeField]属性は不要(?)
8 // https://docs.unity3d.com/jp/460/ScriptReference/SerializeField.html
9 //[SerializeField]
10 public int Max = 5;
11
12 //[SerializeField]
13 public Character[] Characters;
14
15 public void Initialize()
16 {
17 Debug.Log("CharacterList.Initialize()");
18
19 Characters = new Character[Max];
20 for (int i = 1; i <= Max; i++)
21 {
22 // "Name1", "Name2", ...の名前を生成
23 Character character = new Character();
24 character.Name = string.Format("Name{0}", i);
25 }
26 }
27
28 void Start()
29 {
30 Debug.Log("CharacterList.Start():");
31 }
32}
33
で、ゲーム(?)の本体でDatabase
オブジェクトをtargetObject
として参照し、CharacterList
クラスであるコンポーネントを呼び出します。
C#
1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4
5public class Runner : MonoBehaviour
6{
7 public GameObject targetObject;
8
9 // Start is called before the first frame update
10 void Start()
11 {
12 Debug.Log("Runner.Start(): started.");
13
14 // "Database"オブジェクトを探す
15 targetObject = GameObject.Find("Database");
16 if (targetObject == null)
17 {
18 // Databaseオブジェクトが見つからない
19 Debug.Log("Runner.Start(): unable to find Database");
20 return;
21 }
22
23 // "CharacterList"コンポーネントを取得
24 CharacterList list = targetObject.GetComponent<CharacterList>();
25 if (list == null)
26 {
27 // Databaseオブジェクト中のCharacterListコンポーネントが見つからない
28 return;
29 }
30
31 // Databaseオブジェクト、CharacterListの初期化
32 list.Initialize();
33
34 Debug.Log("Runner.Start(): done.");
35 }
36
37 // Update is called once per frame
38 void Update()
39 {
40
41 }
42}
Unityエディターの状況です。
最終的に質問者さんがやりたいことに合致しているか分かりませんが、恐らくこんな感じになるのではなかろうか、と。(C#のコードはあえて冗長な書き方にしました)
上記回答では納得できないかもしれませんし、Unityに詳しい他の回答者さんに私より適切な回答をいただけるかもしれません。しばらく質問を閉じずにいても良いかと思います。