前提・実現したいこと
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を使用しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/29 04:21
2020/03/29 04:30 編集
2020/03/29 07:28
2020/03/29 07:50