kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

C#(Unity Script)でのClassの継承などのメモメモ

かずまです。

ふとコードを書いていて、そういえばあんまり継承とか使わないけど、使ってコード書くとよりわかりやすく書けるんだろうか、と疑問が湧いてきたので、ちょっとしたコードを書いてみました。

派生クラス(以後、サブクラス)をPlayer, Enemyとし、基底クラス(以後、スーパークラス)をMovementとします。(Movementはいい名前が浮かばなかった。)
基本的にPlayerとEnemyは同じLogicで動き、体力やIDなどが割り振られていることが多いので基底クラスに書いて継承すれば綺麗に書けるんじゃないか、と思います。

qiita.com
このサイトのStep6ぐらいのイメージ(絵を書くのがあれなのでリンクでごまかします。)

C#でのスーパークラスは virtual を使って書く

公式リファレンス
virtual (C# Reference)

注意

  1. UnityではMonoBehaviourがクラスに継承されていなければGameObjectのコンポーネントとしてスクリプトを持たせることができないので、スーパクラスのMovementに継承しておきます。そうすることであとはサブクラスのPlayerとEnemyはMovementを継承するだけでいい!
  2. C#ではClassの継承は1つしかできません。Interfaceは複数継承できます。

ではコードを書いてみます。

スーパークラス

サブクラス

イメージとしてはこんな感じですかね?
f:id:kazumalab:20160714154657p:plain

間違ってたらご指摘ください(UML的、全般的に)

ここではDamageというinterfaceは気にしなくて大丈夫です。(継承している部分も)

base

base (C# Reference)

Playerクラスにbaseというコードを書きました。
これはスーパークラスのメソッドを呼び出しているので、ここではDebug.Log("override move.");が呼び出されるということになります。

interface

さて、先ほど無視したinterfaceについて見ていきます。

Interfaceに関しては
csharp.sevendays-study.com
ここの図5.1あたりを参照参照するとわかりやすいです。
(携帯の機能のあたり)

上記コードPlayerとEnemyでは受けるダメージ(get_damage)のパラメータが違うということでinterfaceを継承し、返すダメージの大きさを変えています。

結論

継承難しい。

12/21追記

namespaceを使うとモジュールを分けられたりするので結構便利です。

ufcpp.net

こことか見るといいかもですね。

あとはコードが綺麗に書きたいですねぇ。