現在、全方位シューティングを作っているのですが、Prefabにそれぞれ異なる(Script本体は一緒、変数の値が違う)5体の敵がいます。それらの敵を倒した回数を取得し、計算してスコアにしようとしたのですが、倒した回数がどうやっても取得できません。敵が倒される瞬間のDestroy関数の直前でm_kills変数を+1したいのですができませんでした。
if (collision.name.Contains("Shot")) { Instantiate( m_explosionPrefab, collision.transform.localPosition, Quaternion.identity); Destroy(collision.gameObject); m_HP--; if (0 < m_HP) return; var audioSource = FindObjectOfType<AudioSource>(); audioSource.PlayOneShot(m_DeathClip); m_kills += 1; Destroy(gameObject);
Destroyでスプライトが消えてしまうのはわかっているのですが、Prefab内の関数を変更することは可能でしょうか?可能であれば方法を、不可能であれば別の対処法をお願いします。
まず、ヨーダ記法を使わないところから初めて下さい。
可読性が悪いです。
m_killsを増やした後そのゲームオブジェクトを破棄してしまったらm_killsも破棄されますよね?
そうなんです。
どうしたらこの変数を保存しておけるのかが知りたいです。
①m_killsをstaticにする。
②別にScoreを管理するクラスを作って、int score変数を作る。
public void AddScore(int score) => this.score += score;
とか作っとく。
質問のスクリプトのAwakeもしくはStart時にScoreクラスの参照を取得。参照.AddScore(1);としてScoreクラスに加算したい値を与える。
③Scoreのクラスを作って、public static int score変数を作って、Score.score += 1;とする。
基本系は②だと思う。
①は手抜き?軽く動作確認とか、staticの仕様を分かった上で問題ないならご利用をって感じ。
③をもうちょっと加工してシングルトンにしてって方法は調べれば沢山解説がある方法の一つ。
ありがとうございます!!試してみます!!
すみません、static関数に関してもう少し詳しくお願いできますか??
あと、5体分の敵でそれぞれ別に数えたい場合はStaticは使えないんですか??
Staticを試して見たところ、Debug.Logで見てみましたがすぐにゼロになってしまってました。
staticメソッドの説明はできないです。すみません。
staticメソッドは当たり前のように使いますが、私の知識、言葉で説明ってなると難しいです、それで本当に正しいか?って部分もありますし言葉に変換できないです。
すぐに0になるのは0を代入している部分があるからです。
5体分の敵で別に扱うとなると
配列、リストなどで5体分を管理できる変数などを用意するならstaticでも問題なく出来ます。
ただの単一のint型の変数(値型)では無理でしょう。
質問のm_killsという値が別々のものとした場合、そもそもその値を管理するスクリプトがDestroyされるGameObjectにアタッチされているという設計に問題があるのではないかと思います。
Destroyされるものだけど強引に書いたとして、そのgameObject自体を識別するためにidを持たせて、
public int id; // 固有の値をつける
public static int[] m_kills = new int[5];
m_kills[id] += 1; // 個別にスコアを管理する
とかして値を持てる変数を用意すればできますが、、、
あと、選択肢にstaticしか書いてなかったので悪いですが、Destroyされる前提で同一コード内だとstaticなら残る(そもそもインスタンスメンバーじゃないので消えない)あとアクセスが楽ってだけですので方法が変わればstaticである必要もないです。
なるほど、ありがとうございます!
あなたの回答
tips
プレビュー