「IDamageableって何?」「interfaceって継承と何が違うの?」
こんな疑問が浮かびますよね。
インターフェースは、クラス設計の中でも最初は出番が少ない概念です。
しかし、プレイヤー・敵・壊れる箱など「ダメージを受けられるもの」を1つの型でまとめて扱いたい場面では、とても便利です。
この記事では、interfaceの役割、「できること」の契約としての考え方、Unityゲームでの具体例まで整理します。
頻度は低くても、検索で来た方がすぐ使える内容を中心に書きます。
- interfaceという言葉の意味が分からず、サンプルコードが読めない
- 継承との違いが整理できず、どちらを使えばいいか迷う
- GetComponent<IDamageable>がnullになる原因が分からない
✨ この記事でわかること
- interface(インターフェース)の役割と契約の考え方
- 継承との違いと使い分け
- IDamageableの実装と攻撃側からの参照方法
- ゲームでよく使うinterfaceの例
- 初心者がinterfaceを導入するタイミング
- 初心者でも理解できる解説
\プログラミング未経験でも大丈夫!まずは1本作り切ろう/
初心者が最初に選ぶならコレ
Unity ノンフィールドRPG
+スレスパ風JRPG講座
Unity6対応・スマホ化対応の最新カリキュラム。「何から始めればいいかわからない」という初心者でも、ステップごとに手を動かすだけでRPGが完成します。
憧れのアクションゲームに挑戦
Unity 2Dアクションゲーム
の作り方講座(ロックマン風)
初心者でもロックマン風の横スクロールACTが作れる講座。7ステージ+ラスボスという本格構成で、スマホ化・広告実装まで対応。「自分のゲームをリリースしたい」夢を叶えます。
3Dゲーム開発の入口はここ
ゼルダ風3Dアクションゲーム
の作り方講座
「3Dゲームって難しそう…」と感じている初心者向けの講座。全16回でゼルダ風3Dアクションがスマホ対応で作れるようになります。3D開発の基礎がしっかり身につきます。
インターフェースとは何か
インターフェース(interface)は、「このクラスは、こういうメソッドを持っていなければならない」という約束(契約)を定義する仕組みです。
中身の処理は書きません。
メソッド名と型だけを宣言します。
public interface IDamageable
{
void TakeDamage(int amount);
int CurrentHp { get; }
}
クラス名の先頭に「I」を付けるのがC#の慣習です(I = Interface)。
TakeDamageを実装したクラスは、IDamageable型として扱えるようになります。
継承との違い
継承とインターフェースは、どちらも「型の関係」を表しますが、役割が異なります。
| 比較項目 | 継承(class) | インターフェース(interface) |
|---|---|---|
| 関係のイメージ | 「〜である」(is-a)スライムは敵である | 「〜できる」(can-do)プレイヤーはダメージを受けられる |
| 数の制限 | 親クラスは1つだけ | 複数のinterfaceを実装できる |
| 中身 | フィールドや処理をそのまま受け継ぐ | メソッドの「形」だけ約束する |
PlayerとEnemyは別の継承木にいても、どちらもIDamageableを実装すれば、同じ攻撃処理からダメージを与えられます。
IDamageableの実装例
プレイヤー、敵、壊れる宝箱を、1つの攻撃スクリプトから扱う例です。
public interface IDamageable
{
void TakeDamage(int amount);
}
public class PlayerHealth : MonoBehaviour, IDamageable
{
private int hp = 100;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("プレイヤー HP:" + hp);
}
}
public class EnemyHealth : MonoBehaviour, IDamageable
{
[SerializeField] private int hp = 30;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0) Destroy(gameObject);
}
}
クラス宣言の「: MonoBehaviour, IDamageable」のように、MonoBehaviour継承とinterface実装を同時に書けます。
カンマで区切るのがポイントです。

interfaceは「共通の入口」を作る道具です。
中身がPlayerでもEnemyでも、TakeDamageさえ呼べれば攻撃側は詳細を知る必要がありません。
最初は「攻撃側を1本にまとめられる」という実利だけ覚えておけば十分です。
複数interfaceの実装
C#では、1つのクラスが複数のinterfaceを実装できます。
プレイヤーが「ダメージを受けられる」かつ「アイテムを拾える」場合の例です。
public interface IPickupable
{
void PickUp;
}
public class PlayerController : MonoBehaviour, IDamageable, IPickupable
{
private int hp = 100;
public void TakeDamage(int amount) { hp -= amount; }
public void PickUp { Debug.Log("アイテム取得"); }
}
カンマでinterfaceを並べれば、能力を組み合わせて追加できます。
継承は1つだけですが、interfaceは複数持てる——この違いが設計上の大きなポイントです。
攻撃側からinterface型で参照する
攻撃判定スクリプトは、相手がプレイヤーか敵かをif文で分岐しなくてよくなります。
public class Bullet : MonoBehaviour
{
[SerializeField] private int damage = 10;
void OnTriggerEnter(Collider other)
{
IDamageable target = other.GetComponent<IDamageable>;
if (target != null)
{
target.TakeDamage(damage);
Destroy(gameObject);
}
}
}
GetComponent<IDamageable>は、そのGameObjectにIDamageableを実装したコンポーネントがあれば取得します。
宝箱用のBreakableBox脚本を後から追加しても、弾丸側のコード変更は不要です。
interface実装の確認手順
- interfaceを定義する(例:IDamageable)
- 対象クラスにinterfaceを実装宣言する
- 宣言したメソッドを必ず実装する(未実装だとコンパイルエラー)
- 参照側はinterface型でGetComponentする
ゲームでよく使うinterfaceの例
実務やサンプルコードでよく見るinterfaceには、次のようなものがあります。
- IDamageable:ダメージを受けられる対象
- IInteractable:調べる・話しかける対象
- IPickupable:拾えるアイテム
名前はプロジェクトごとに自由ですが、「I + 形容詞/動詞可能形」で統一すると、チーム開発でも読みやすくなります。
最初の1つはIDamageableから始めるのがおすすめです。
初心者がinterfaceを使うタイミング
interfaceは設計が進んでから必要になることが多いです。
次のような状況になったら検討しましょう。
- 同じ処理を、プレイヤー・敵・オブジェクトにコピペしている
- if (other.tag == “Player”) の分岐が増え続けている
- 新しい「ダメージ対象」を追加するたびに、攻撃側を書き換えている
敵が1種類、プレイヤーだけのプロトタイプ段階では、無理にinterfaceを入れなくて大丈夫です。
機能が増えてからリファクタリングで導入する進め方でも問題ありません。

「interface = 共通のリモコンボタン」だと覚えるとイメージしやすいです。
中身は違っても、TakeDamageボタンを押せば反応する、という関係ですね。
よくあるつまずき
interfaceを初めて書くとき、次のエラーに出会いやすいです。
- メソッド未実装 → interfaceで宣言したメソッドをクラス内に書く
- GetComponentがnull → 相手側にinterfaceを実装したコンポーネントが付いているか確認
- public修飾子 → interface経由で呼ぶメソッドはpublicが基本
- 過剰設計 → 使うクラスが2つだけのうちは、普通の参照でも十分な場合がある
「interfaceを使わないとダメ」ではありません。
コードの見通しが悪くなってきたタイミングで導入する、というスタンスで大丈夫です。

IDamageableを1つ作って、PlayerとEnemyに実装するだけでも十分な学習になります。
弾丸からGetComponentで叩いてみましょう。
記事を読んで「作ってみたい!」と思ったら!初心者でも1本完成できる講座で実力をつけよう
知識を読むだけで終わらせるのはもったいない。実際に手を動かしてゲームを1本完成させることで、理解が一気に深まります。プログラミング未経験からでも取り組める講座で、ゲーム開発の第一歩を踏み出しましょう。
Unity ノンフィールドRPG+スレスパ風JRPG講座【Unity6対応!初心者でもデッキ構築×JRPGをスマホ向けに作れる!】

- Unity6対応・スマホ化対応で最新環境のゲーム開発が学べる
- Slay the Spire風のデッキ構築システム×JRPGの組み合わせを実装
- 初心者でも迷わず進められる丁寧な解説構成
- ノンフィールドRPGとデッキ構築JRPGの2つをまとめて学べるセット講座
Unity ノンフィールドRPGの作り方講座+Slay the Spire風デッキ構築JRPGの作り方講座は、プログラミング未経験の初心者でも取り組みやすい、ステップバイステップ形式の講座です。
Unity6対応・スマホ化対応の最新カリキュラムで、読んで「なるほど」と思った知識を、実際に動くゲームとして形にする体験ができます。
「何から始めればいいかわからない…」という初心者が最初に選ぶ一本として最適な講座です。
Unity6対応・スマホ化対応の最新カリキュラム
ゼロからでもRPGを完成させよう
→ スレスパ風デッキ構築JRPG講座を見てみる
初心者でもスマホ対応のRPGが作れる!まずは1本完成を目指そう!
Unity 2Dアクションゲームの作り方講座(ロックマン風)【全16回!初心者でもスマホ化・広告実装まで対応した本格横スクロールACTが作れる!】

- ロックマン・マリオ・カービィのような横スクロールACTをゼロから開発
- 7ステージ+ラスボスステージの本格的なゲーム設計を初心者でも実現
- スマホ化・AdMob広告実装まで対応してリリースまで見据えた構成
- 敵AI15体・多彩なマップギミック・武器システムを完全実装
- 完全オリジナルゲームをアセット不使用で素材提供付きで制作
Unity 2Dアクションゲームの作り方講座(ロックマン風)は、ロックマン・スーパーマリオ・星のカービィのような2D横スクロールアクションゲームを、初心者でもゼロから開発できるようになる講座です。
全16回で当たり判定・物理挙動・敵AIの知識を実際のゲームコードとして実装する体験が詰め込まれています。スマホ化・広告実装まで対応しているため、「作って終わり」ではなくリリースまで見据えた実践スキルが身につきます。
「憧れのアクションゲームを自分の手で作ってみたい」という初心者に強くおすすめの一本です。
スマホ化・広告実装まで対応した本格横スクロールACT
初心者でもロックマン風2Dアクションをリリースまで作り上げよう
→ 2Dアクションゲームの作り方講座を見てみる
初心者でも本格ACTが完成する!広告収益まで視野に入れた実践スキルを手に入れよう!
ゼルダ風3Dアクションゲームの作り方講座【全16回!初心者でも3Dアクションがスマホ対応で作れる!】

- ゼルダの伝説・モンハン・原神のような3Dアクションをゼロから開発
- 「3Dは難しそう」と感じている初心者でも取り組みやすい丁寧な解説構成
- スマホ化対応で実機で動かせるゲームが完成
- アセットを使った実践的なゲーム開発手法が身につく
- 画像・動画・全ソースコード公開の充実したサポート
ゼルダ風3Dアクションゲームの作り方講座は、「3Dゲームは難しそう…」と感じている初心者こそおすすめの入門講座です。
全16回の丁寧な解説で、ゼルダの伝説・モンハン・原神のような本格的な3Dアクションゲームを確実に完成まで導きます。スマホ化対応で実機で動かせるため、初めて3Dゲームを作り上げた達成感がひときわ大きい講座です。
「3Dゲームを自分でも作れるか試してみたい」という初心者の最初の一歩として最適です。
初心者でも3Dアクションがスマホ対応で完成する
ゼルダ風3Dアクションゲームで3D開発の壁を一気に突破しよう
→ ゼルダ風3Dアクションゲームの作り方講座を見てみる
全16回でスマホで動くオリジナル3Dゲームを完成させよう!
まとめ
C#のインターフェースは、「こういうメソッドを持つ」という契約を定義する仕組みです。
IDamageableのようにダメージ処理を共通化すると、攻撃側は相手の種類を気にせずTakeDamageを呼べます。
継承が「〜である」関係なら、interfaceは「〜できる」関係を表します。
最初から全部使う必要はなく、if分岐が増えてきたタイミングで導入すれば十分です。
設計力を伸ばしたい方は、Unity入門の森でゲーム制作を通じてC#の考え方も深められます。
今日はIDamageableを定義して、PlayerHealthに実装するところから試してみてください。



コメント