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

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

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

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

Unity

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

Q&A

解決済

2回答

1348閲覧

多種のステータスを持ったenemyを順番に出現させたい

BounceTime

総合スコア2

C#

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

Unity

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

2グッド

2クリップ

投稿2021/09/14 18:05

最初に

閲覧していただきありがとうございます。
C#及びUnity初心者です。
現在2Dゲームを製作しています。
まだ経験が浅くとてもレベルの低い質問で申し訳ございません。

前提・実現したいこと

HP,攻撃力,などのステータスやUIが全く違うenemyを作り順番に出現させたいと思っています。

HP,攻撃力,などのステータスやUIが全く違うenemyを作り順番に出現させたいと思っています。
有名どころだとパズドラ、モンストのように1ステージにつき1体のenemyを出現させ、enemyを撃破すると次のステージに進み、また新しいEnemyが1体現れる...

こうしたシステムを実装する際に一つずつGameObjectとScriptを用意するのではなく、一つのScriptで全く違うEnemyを管理して出現させる良い方法はございますでしょうか。

またこのような場合の良い参考資料などを知っておられましたら教えていただけると幸いです。

試したこと

ListにEnemyを一括管理しようと思い10種類のEnemyのステータスを入れたLIstを作成しましたがUnity側のGameObjectとの連動の仕方や、UIの管理、連動などがうまくいきませんでした

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6class Enemeis 7{ 8 public int EnemyHP; 9 public string EnemyName; 10 public int Enemyatp; 11} 12 13public class Enemy : MonoBehaviour 14{ 15 //このカウントでステージに対応したenemyを出そうと思いました。 16 public int EnemyCount = 0; 17 18 void Start() 19 { 20 Enemeis Series1; 21 Enemeis Series2; 22 Enemeis Series3; 23 Enemeis Series4; 24 Enemeis Series5; 25 Series1 = new Enemeis(); 26 Series1.EnemyName = "Normal"; 27 Series1.EnemyHP = 500; 28 Series1.Enemyatp = 100; 29 Series2 = new Enemeis(); 30 Series2.EnemyName = "Lilstrong"; 31 Series2.EnemyHP = 1000; 32 Series2.Enemyatp = 199; 33 Series3 = new Enemeis(); 34 Series3.EnemyName = "Strong"; 35 Series3.EnemyHP = 1000; 36 Series3.Enemyatp = 250; 37 Series4 = new Enemeis(); 38 Series4.EnemyName = "Heiger"; 39 Series4.EnemyHP = 3000; 40 Series4.Enemyatp = 200; 41 Series5 = new Enemeis(); 42 Series5.EnemyName = "Boss"; 43 Series5.EnemyHP = 777; 44 Series5.Enemyatp = 7777; 45 46 47 Enemeis[] i = new Enemeis[4]; 48 i[0] = Series1; 49 i[1] = Series2; 50 i[2] = Series3; 51 i[3] = Series4; 52 i[4] = Series5; 53 }
ara_ara👍を押しています

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

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

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

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

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

YAmaGNZ

2021/09/14 22:23

1つのEnemyの情報を格納するものを作ってそれを配列で持つというアプローチはいいと思うのですが 「うまくいかない」とはどうなるのですか? 参考になるものと言われても敵の出てくるものであれば複数種類の敵が出てくるものが殆どなので、アクションゲームにしろRPGにしろの作成過程が解説してあるようなページであれば殆ど出てきそうな内容の話だと思います。
guest

回答2

0

ベストアンサー

参考になるものはいっぱいありますよ。

注意点としては「自分のやらせたい事に固執する」と何も作れなくなります。まず「どのようなやり方があるのかを学ぶ」、そして「学んだ中で自分にできる範囲のものを作る」ことです。

投稿2021/09/15 00:04

bboydaisuke

総合スコア5308

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

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

0

私はUnityをやらないので質問を通してリファレンスやネット情報を確認しただけですが、コードと見比べて気になったので回答しておきます。

Enemiesがただのclassであることが問題なのではないでしょうか。

MonoBehaviourは持っている情報のシリアライズが必要です。
シリアライズというのは、データをメモリ情報に変換することです。
分かりやすくいうと、UnityはUnity側の都合でオブジェクトの状態のセーブとロードを繰り返しているのですが、そのために必要な作業がシリアライズです。

普通の変数(intやstring等)であれば適切にpublic fieldをMonoBehaviour側でシリアライズしてくれます。
しかし、あなたのEnemiesクラスはScriptableObjectやMonoBehaviourを継承していません。
ScriptableObjectは情報の入れ物と思っておいてください。

これが原因で、Startで初期化した内容をMonoBehaviourクラスは保存しておけないのではないでしょうか。
そのため、しばらくするとEnemies関係のフィールドは急に中身がなくなってしまうでしょう。

内部情報を持つクラスにScriptableObjectやMonoBehaviourを継承することが必要なのではないでしょうか。


その他の質問についても、一般的見地からで言えばお答えすることはできます。
※例えば、複数のEnemyの情報を纏めるのに適切なクラスデザインは何か、ステージ等の設計方法、というような話

投稿2021/09/15 06:56

編集2021/09/15 06:58
haru666

総合スコア1593

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

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

YAmaGNZ

2021/09/15 07:07

インスペクタから設定できるように等インスペクタ上に表示するときには[System.Serializable]属性や[SerializeField]属性をつけてあげる必要がありますが、ただのクラスを保持して内部で使用するだけであれば必要ないはずです。 MonoBehaviourを継承しないクラスであっても情報を保持することに問題はないはずです。 提示されているソースで問題があるのは敵の情報を格納する配列をローカルで定義していることだけだと思われます。 この敵データを利用する側や問題となっている点があきらかではないのでこれ以上のことについては分かりませんが・・・
YAmaGNZ

2021/09/15 07:27

というかScriptableObjectやMonoBehaviourを継承しないと意図しないタイミングでデータがなくなってしまうと読めてしまいます。
haru666

2021/09/15 07:36

そうでしたか…ただのクラスを保持するサンプルという観点でも検索してみたのですが、必要ないんですね。 最低でもSerializable等がクラス定義にアトリビュートとして定義されてるサンプルしか見つけられなかったのですが、不要なものなんですね。
YAmaGNZ

2021/09/15 07:46

そのあたりは通常のC#と変わりないですね。 オブジェクトにアタッチするのであればMonoBehaviourを継承するのですが、今回のようなただステータスを保持するだけであればMonoBehaviourは継承する必要がありません。 .NET Frameworkで定義されているクラスもMonoBehaviourを継承していませんしね。
haru666

2021/09/15 07:51

削除リクエストを投げておきますね。 後で軽くUnityを触ってみることにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問