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

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

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

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

Unity

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

Q&A

解決済

2回答

3487閲覧

ゲームで複数の特徴あるキャラクターを実装する場合、スクリプトはどうやって分けて書くものなのでしょうか?

Daichi_Takezawa

総合スコア8

C#

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

Unity

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

0グッド

2クリップ

投稿2018/06/24 02:15

編集2018/06/24 02:17

Unityでゲームのキャラクターを作りたいと思っています。

内容としては、基本的にクリックするとプレイヤーがジャンプするだけなのですが、そこをキャラクターごとに特徴を出していきたいと思っています。

例えば、Aのキャラクターは長くジャンプできるだとか、Bのキャラクターは二段ジャンプができるとかそんな感じです。

実装するにあたって疑問に思ったのですが、一つのスクリプトにAのキャラクラス、Bのキャラクラスとやってつくるのかそれとも、キャラごとにスクリプトを分けるべきなのか、あとは継承?などすべきなのか、私自身把握しておりません。

特徴あるキャラクターを複数つくる場合はどのようにスクリプトを分けていけばいいですか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

規模感により異なるかなと思います。

例のようにキャラ種類数が少なく、分岐パターンも少ない場合は
1つのコードに全部の挙動を記載して、キャラ種類を示す変数を1つ作ってif文で分岐、でいいかと。

反対に種類数が多かったり分岐パターンが多い場合は、継承やデリゲートで作る方法も考えられます。
(他にも色々あるので「デザインパターン」で検索するといいかもしれません)

■継承のイメージ

●キャラクタークラス
・移動する
・ジャンプする
・ダメージを食らう
・etc

●キャラクターAクラス(キャラクタークラスを継承)
・ジャンプする→メソッド上書き(オーバーライド)で長いジャンプが出来るようにする
※他メソッドは記載しなければ継承元のが使われる

●キャラクターBクラス(キャラクタークラスを継承)
・ジャンプする→メソッド上書き(オーバーライド)で二段ジャンプが出来るようにする
※他メソッドは記載しなければ継承元のが使われる

実際にオブジェクトに付けるのは
キャラクタークラス、キャラクターAクラス、キャラクターBクラスのいずれか。

■デリゲートのイメージ

C#

1//キャラクター基底クラス 2public class Character : MonoBehaviour 3{ 4 public delegate void MyDelegate(); 5 public MyDelegate jump; 6 public MyDelegate die; 7 8 void Awake () 9 { 10 //デフォルトのメソッドを入れる 11 jump = DefaultJump; 12 die = DefaultDie; 13 } 14 15 void Update () 16 { 17 //該当メソッドを呼び出す 18 jump(); 19 die(); 20 } 21 22 void DefaultJump() 23 { 24 if (ジャンプボタンが押されている) { 25 ジャンプする処理 26 } 27 } 28 29 void DefaultDie() 30 { 31 if (HPが0になっている) { 32 プレイヤー死亡処理 33 } 34 } 35} 36 37//長いジャンプ処理 38public class LongJump : MonoBehaviour 39{ 40 void Start () 41 { 42 //自身のメソッドを入れる 43 GetComponent<Character>().jump = MyJump; 44 } 45 46 void MyJump() 47 { 48 if (ジャンプボタンが押されている) { 49 ジャンプする処理 50 } 51 } 52} 53 54//二段ジャンプ処理 55public class TwiceJump : MonoBehaviour 56{ 57 void Start () 58 { 59 //自身のメソッドを入れる 60 GetComponent<Character>().jump = MyJump; 61 } 62 63 void MyJump() 64 { 65 if (ジャンプボタンが押されている) { 66 ジャンプする処理 67 } 68 } 69}

実際にオブジェクトに付けるのは
「キャラクタークラス」+「LongJumpまたはTwiceJumpまたは無し」

投稿2018/06/25 04:44

sakura_hana

総合スコア11427

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

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

Daichi_Takezawa

2018/06/26 13:06

なるほど!周りにこういうことを聞ける方がいないのでとても勉強になりました。 検索もどうやって検索すればいいのかわからなかったので助かりました。 ありがとうございます。
guest

0

作り方は開発者のこだわり所だと思いますが、
個性はパラメータとして持たせ、メインルーチンは固定にするのがコード量を抑えられるため好まれてるんじゃないかと思います。
もちろん、キャラクター毎に別々のルーチンで動かすことも可能ですが、同じコードをコピーすることになる為、共通の要素の一部を変更したくなった場合にキャラクターの数だけ書き換えることになります。

投稿2018/06/24 09:49

efcode

総合スコア422

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

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

Daichi_Takezawa

2018/06/24 11:10

なるほど。つまり一つのスクリプトにそれぞれの特徴を書いて、キャラごとに処理をわけるということですね。ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問