質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

982閲覧

Prefabの関数をゲーム中に変更する

3UP78828293

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/02/21 14:00

現在、全方位シューティングを作っているのですが、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内の関数を変更することは可能でしょうか?可能であれば方法を、不可能であれば別の対処法をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2021/02/22 01:26

まず、ヨーダ記法を使わないところから初めて下さい。 可読性が悪いです。
Yukirr4_

2021/02/23 02:32

m_killsを増やした後そのゲームオブジェクトを破棄してしまったらm_killsも破棄されますよね?
3UP78828293

2021/02/23 03:27

そうなんです。 どうしたらこの変数を保存しておけるのかが知りたいです。
退会済みユーザー

退会済みユーザー

2021/02/23 05:14

①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の仕様を分かった上で問題ないならご利用をって感じ。 ③をもうちょっと加工してシングルトンにしてって方法は調べれば沢山解説がある方法の一つ。
3UP78828293

2021/02/24 09:57

ありがとうございます!!試してみます!!
3UP78828293

2021/02/25 10:14

すみません、static関数に関してもう少し詳しくお願いできますか?? あと、5体分の敵でそれぞれ別に数えたい場合はStaticは使えないんですか?? Staticを試して見たところ、Debug.Logで見てみましたがすぐにゼロになってしまってました。
退会済みユーザー

退会済みユーザー

2021/02/25 11:43

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である必要もないです。
3UP78828293

2021/02/26 11:23

なるほど、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問