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

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

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

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

Q&A

解決済

1回答

995閲覧

複数種類の自機を作りたい場合の記述の方法をご教示ください

Melipofolia

総合スコア6

Unity

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

0グッド

1クリップ

投稿2020/03/29 03:35

前提・実現したいこと

2Dシューティングを作成したいと考えています。Unityに関しては初心者です。
ある目的から複数種類の自機が必要になるため、あらかじめPlayerStandardクラスに全種類の自機が共通して持つ変数と処理を記述し、それとは別に個別の自機が持つ変数と処理を各自のクラスが保持しているという状態を作りたいと考えました。

発生している問題・エラーメッセージ

PlayerStandardと個別の自機のクラス(ここではIchikaplayer)を以下のように設定し、
自機にIchikaplayer.csのみをアタッチしたところ、コンパイルエラーとなりました。

該当のソースコード

C#

1PlayerStandard.cs 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6//すべての自機が共通して持つパラメータや動作機能の設定 7 8public class PlayerStandard : MonoBehaviour 9{ 10 // 移動スピード 11 public float speed; 12 13 //残機数 14 public float rest; 15 16 //エクステンドアイテム取得数 17 public float lifechips; 18 19 //エクステンドアイテム必要数初期値 20 public float lifeinitial; 21 22 //1回当たりのエクステンドアイテム必要数増加量 23 public float lifegradiant; 24 25 //エクステンドした回数 26 public float extendedtimes; 27 28 //エクステンドに必要なアイテム総数= lifeinitial + lifegradient * extendedtimes 29 30 //自機のパワー 31 public float playerpower; 32 33 //シールド残量 34 public float shieldtoughness; 35 36 //シールド状態 37 //0:ironclad 1:shieldbreak 2:shieldrecovering 3:absolute 4:wingmode 38 //0の時以外は被弾すると死 39 public int shieldvalidness; 40 41 //MSキーが連打されているかどうか 42 protected int MSbeat; 43 44 //MSキーが何フレームの間連打されているか 45 protected int MSbeattime; 46 47 //MSキーが何フレームの間押下されているか 48 protected int MSholdtime; 49 50 //SWキーが連打されているかどうか 51 protected int SWbeat; 52 53 //SWキーが何フレームの間連打されているか 54 protected int SWbeattime; 55 56 //SWキーが何フレームの間押下されているか 57 protected int SWholdtime; 58 59 //DCキーが何フレームの間押下されているかどうか 60 protected int DCholdtime; 61 62 void Update() 63 { 64 //移動関連 65 { 66 // 右・左 67 float x = Input.GetAxisRaw("Horizontal"); 68 69 // 上・下 70 float y = Input.GetAxisRaw("Vertical"); 71 72 // 移動する向きを求める 73 Vector2 direction = new Vector2(x, y).normalized; 74 75 // 移動する向きとスピードを代入する 76 GetComponent<Rigidbody2D>().velocity = direction * speed; 77 } 78 79 //MSキー入力関連_初期状態ではZキー,入力補助として左Shift 80 if (Input.GetKey(KeyCode.Z)) //MSキー押下状態の管理 81 { 82 MSholdtime++; //押されている間ずっとカウントアップ 83 } 84 else 85 { 86 MSholdtime = 0; //押されていない場合はずっと0 87 } 88 89 if (Input.GetKeyUp(KeyCode.Z)) //MSキー連打状態の管理 90 { 91 MSbeat = 15; //押された瞬間から15フレームの間連打状態 92 } 93 else if(MSholdtime == 0 && Input.GetKey(KeyCode.LeftShift)) 94 { 95 MSbeat = 1;  //Zが押されておらず、かつ左シフトの入力があればずっと連打状態 96 } 97 else 98 { 99 MSbeat--; //押された瞬間でない状態(入力されていないor押しっぱなし)はフレームごとにカウントが1減少 100 } 101 if (MSbeat > 0) //MSキー連打状態継続時間の管理 102 { 103 MSbeattime++; //連打状態=カウントが正の状態と定義し、その継続時間をカウント 104 } 105 else 106 { 107 MSbeattime = 0; //0またはそれ以下になった場合連打継続時間をリセット 108 } 109 110 //SWキー入力関連_初期状態ではXキー 111 if (Input.GetKey(KeyCode.X)) //SWキー押下状態の管理 112 { 113 SWholdtime++; //押されている間ずっとカウントアップ 114 } 115 else 116 { 117 SWholdtime = 0; //押されていない場合はずっと0 118 } 119 120 if (Input.GetKeyUp(KeyCode.X)) //SWキー連打状態の管理 121 { 122 SWbeat = 15; //押された瞬間から15フレームの間連打状態 123 } 124 else 125 { 126 SWbeat--; //押された瞬間でない状態(入力されていないor押しっぱなし)はフレームごとにカウントが1減少 127 } 128 if (SWbeat > 0) //SWキー連打状態継続時間の管理 129 { 130 SWbeattime++; //連打状態=カウントが正の状態と定義し、その継続時間をカウント 131 } 132 else 133 { 134 SWbeattime = 0; //0またはそれ以下になった場合連打継続時間をリセット 135 } 136 137 138 139 //被弾処理関連 140 } 141} 142 143Ichikaplayer.cs 144public class Ichikaplayer : PlayerStandard 145{ 146 //ヒット数 147 public float ichikahitcount; 148 149 //ヒット継続時間 150 public float ichikahittime; 151} 152 153 // Start is called before the first frame update 154 void Start() 155 { 156 157 } 158 159 // Update is called once per frame 160 void Update() 161 { 162 163 }

試したこと

Ichikaplayer.csそのものを削除し、PlayerStandard.csのみをアタッチしたところ、
コンパイルエラーにならずに十字キーによってキャラを移動する動作はできました。
このことからクラスの継承の方法が間違っているのだろうと思っています。
身の程知らずの大きなものに手を出そうとした弊害と反省しております。
クラスの継承方法等、ご教示くださるとありがたいです。

補足情報(FW/ツールのバージョンなど)

Unity 2019.3.7f1を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

これって実際のコードですか? だとしたら、Ichikaplayerクラスの定義が以下で終わってしまっているので、メソッドの定義がクラス定義の外に出てしまっているので、そのためにエラーが出ているのだと思います。

public class Ichikaplayer : PlayerStandard { //ヒット数 public float ichikahitcount; //ヒット継続時間 public float ichikahittime; } // クラスの定義がここで終わっている

StartUpdateメソッドをクラス定義の中に入れたらコンパイルエラーは解消されると思います。

投稿2020/03/29 04:03

edo_m18

総合スコア2283

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

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

Melipofolia

2020/03/29 04:21

ありがとうございます PlayerStandard.csのみをアタッチした時と同じように正常に動きました
Melipofolia

2020/03/29 04:30 編集

すみません見間違いでした。 動きませんでしたがこれはIchikaplayer側のUpdateに継承元側のUpdateが上書きされているということでよろしいでしょうか 可能であればどのようにすれば継承元継承先双方の内容が適応されるかもご教示願えないでしょうか
edo_m18

2020/03/29 07:28

そうですね。Updateメソッドが上書きしてしまっています。なので、ベースクラスのUpdateをprotectedより上の公開レベルにした上で、virutal関数化する必要があります。 C#ではbaseクラスのメソッドを呼び出すにはbase.Hogeとする必要があるので、Ichikaplayer側ではbase.Updateを呼び出してやれば意図した動きになると思います。 ここからはよりよい実装という視点での意見になりますが、baseを呼び出さなければならない、というのはよくやるミスにつながるので、例えばベースクラス側でvirtualな差し込み用メソッドを定義しておき、派生クラスでは(必要であれば)それを呼び出す、というふうにするといいかと思います。 例えばこんな感じ↓ ``` // PlayerStandard側 void Update() { // ... 前略 OnUpdate(); } protected virtual void OnUpdate() { } ------------------- // Ichikaplayer側 protected override void OnUpdate() { // Ichikaplayer側の差し込み処理 } ```
Melipofolia

2020/03/29 07:50

ありがとうございます そのあたりを勉強しながら組んでみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問