Unity C#のメソッド(関数)の使い方 | Unity入門の森 ゲームの作り方

Unity C#のメソッド(関数)の使い方

メソッドについての画像 Unity C#入門講座
メソッドはアプリの処理をまとめたもの。


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

今回の記事ではメソッド(関数)についてみていきます。

以前の記事でもメソッド自体を既に使っています。今回の記事を読むことで色々な種類のメソッドを作ることができますので、是非呼んでみてください。

前回の記事:

UnityC#の配列の使い方 一次元配列・多次元配列・ジャグ配列
今回の記事では配列について解説していきます。 配列を使用することでたくさんのデータを一つの変数にまとめられます。 前回の記事: 配列(Array)とは 配列とは同じ型を持つ値を一つの変数にまとめた参照型の値になります。 C#では配列のように...

【Line登録者限定のプレゼントもあるよ!】

メソッド(関数)とは

メソッドは定義して呼び出すの画像

メソッドはクラスの中で定義して、他のメソッドの中で呼び出して使うもの。

メソッドとはスクリプトの処理をまとめたもので、アプリケーションはたくさんのメソッドを組み合わせて構築されています。また、クラスに所属していないメソッドは関数とも呼ばれます。

機能や使い方は同じですがC#はオブジェクト指向言語なのでこの記事では以降、メソッドと呼びます。

メソッドを使用する際は先に定義し、それを呼び出す必要があります。

メソッドの呼び出し方

メソッドの呼び出し方の画像

メソッドはどのクラスのものか分かるようにして呼び出す。

メソッドの呼び出しはこれまでの記事で何回か書いていますが、改めて紹介します。

C#ではメソッドは全てクラスのメンバになっていますので、メソッド呼び出しにはどのクラスのものか指定する必要があります。

メソッドの呼び出し方:<クラス名 or 変数名> . <メソッド名> (<引数>…)

メソッドには引数という入力値を渡すことができます。引数の数はメソッドによって異なりますが、必ずメソッドの定義にある個数分、値を渡してください。

また戻り値というメソッドの呼び出し結果を呼び出し元に出力するものがあります。戻り値は値と同じように使うことができ、他の変数に代入したり計算の中に組み込むことができます。

メソッドの書き方(定義)と構造

メソッドの書き方の画像

メソッドの書き方は先頭に戻り値、メソッド名、引数を順に書いた後、鉤括弧の中に処理を書いていく。

呼び出し方について説明しましたので、次はメソッドの定義の書き方について説明していきます。

メソッドはクラスの中だけに書くことができます。

メソッドの定義:<戻り値> <メソッド名> (<引数>, ...) { <メソッド内で行う処理> }

構造を大きく分けると次のようになります。

  • 戻り値
  • メソッド名
  • 0個以上の引数
  • メソッド内で行う処理

この中で特に戻り値と引数がメソッドの大きな要素になりますので、これらについて詳しく解説していきます。

戻り値について

メソッドの戻り値の画像

戻り値はメソッドの処理結果になる。呼び出し先で値として使うことができる。

戻り値には型名を指定します。メソッドは必ず指定した型の値をreturnキーワードで指定する必要があります。

戻り値が必要ではない時はvoid型を指定してください。その時はreturnキーワードを書く必要はありません。

また、C#の文法上の都合から戻り値は一つしか書くことができません。複数の値を戻り値にしたい時はそのようなクラスを作るか、タプルを利用してください。

タプル(Tuple)について

タプルはクラス定義を簡略して使うことができる値型の型になります。

メソッドの中で簡単に複数の値をまとめることができる便利な型になります。

ref returnとref local

戻り値の型名の前にrefキーワードを付けると、メソッドが所属しているクラスのメンバ変数への参照値を出力することができます。その際は呼び出し元でもrefキーワードを付ける必要があります。

かなり深く突っ込んだ使い方になりますので紹介だけに留めておきます。

引数について

メソッドの引数の画像

引数はメソッドの入力値になり、変数のように使える。色々な渡し方がある。

引数はメソッドに渡す入力値になります。0個以上の好きな個数を指定できます。

引数の書き方は次のようになります。基本的に変数と同じになります。

<型名> <引数名>

引数のデフォルト値

引数にはデフォルト値を指定することができます。

デフォルト値付きの引数は定義の際、必ず引数の最後に書く必要がありますが、これはC#の文法上の都合で呼び出しの時に見分けがつかなくなるためです。最後に書くならいくつでも引数にデフォルト値をつけることができます。

名前付き引数の渡し方

メソッドを呼び出す時には引数をメソッドで決められた順序で書く必要がありますが、名前付き引数を使うとある程度自由な順序で書くことができます。

  • 名前付き引数の書き方:<引数名> : <値>

名前付き引数を使用する時は引数名と’:’を先に書いた後に値を書きます。

名前付き引数は通常の引数と組み合わせて使うことができますが、その際の通常の引数はメソッドの定義と同じ位置に書く必要があります。

全て名前付き引数の場合は、自由な位置に書くことができます。

名前付き引数はデフォルト値付きの場合でも使えます。

引数に渡す値についての注意点

引数はコピーされるの画像

引数はコピーされてメソッドに渡される。メソッド内で引数を変更した時、値型には影響はでず、参照型の場合は影響が出る。

メソッドの呼び出しの時に引数として渡す値は基本的にその値がコピーされてメソッドに渡されます。そのため、引数をメソッドの中で変更しても呼び出し側の値は変更されません

ただし、参照型の場合には注意が必要です。

参照型の中身は

  • その構造がどのデータを指すのか
  • 指しているデータの実態

の2つに分かれており、引数に渡す際はその内のどのデータを指すのかという情報がコピーされます。

このためメソッド内で参照型の引数のメンバを変更した時はデータの実態側に影響を与えるため、呼び出し側にもその影響が出ることになります。

例えば、以下のコードでは参照型であるクラスをメソッドの引数で渡しています。

また、次のコードのように参照型の引数の値を上書きすると、どのデータを指すのかという情報を変更することになります。そのため変更後にメンバの値を変えたとしても呼び出し側には影響を与えません。

引数につけることができるキーワード

引数用のキーワードの画像

引数にはメソッドへの渡し方を指定することができる。指定することでメソッド内の変更を呼び出し側にも影響を与えることができる。

引数にはいくつかのキーワードを付けることができます。

先に引数はコピーされてメソッドに渡されると説明しましたが、これらのキーワードを使用することでそれとは異なる渡し方ができます。

キーワードを付けることで引数の値を読み取り専用にしたり、呼び出し元には影響を与えられるようにできます。

  • in:引数を読み取り専用の参照値として扱う。
  • ref:引数を参照値として渡す。
  • out:引数で渡した変数をメソッド内で設定するように指定する。

inキーワード付き引数

inキーワードを引数の前に書くと、その引数は読み取り専用の参照値として渡すようになります。

引数自体の値を変更できませんが、参照値なのでメンバは変更でき、呼び出し元にも影響がでます。

また、どこかで宣言した変数でないと渡せなくなるので注意してください

struct型などデータサイズが大きな値型をコピーすると処理負荷が高くなりますが、inキーワードを付け参照型として扱うことでコピーを避けることができます

inキーワードは呼び出し時には省略することができます。

refキーワード付き引数

refキーワードを引数につけるとその引数を参照値として扱うようになり、メソッド内の変更をメソッド呼び出し側にも与えることができます。

inキーワードと似ていますが、こちらは引数の値を変更することができます。

outキーワード付き引数

outキーワードをつけると、戻り値以外にもその引数を介してメソッドからの出力を受け取れる様になります。

outキーワードをつけた引数は必ずそのメソッド内で値を設定する必要があるので注意してください。

outキーワードの簡略化された書き方について

outキーワードが指定された引数は呼び出しの中で直接、変数宣言を行うことができます。

メソッドのオーバーロード

メソッドのオーバーロードの画像

引数が異なるなら同じ名前のメソッドを作ってもいい。ただし、戻り値だけが異なるのはダメ。

C#では同じメソッド名を持つが引数が異なるメソッドを定義することができます。このことをメソッドのオーバーロード(Overload)と呼びます。

引数が異なるとみなされる条件は以下のものになります。

  • 引数の型の順序が異なる。
  • inrefoutキーワードの有無。

戻り値だけが異なる場合はオーバーロードすることはできませんの注意してください。

なお、デフォルト値付き引数によって引数の数が見かけ上、一致してしまう場合でもオーバーロードできません。

アローキーワード ‘=>’

メソッドの簡略記法の画像

鉤括弧の代わりに「=>」を使うとメソッドを簡単に書くことができる。ただし、一つの式だけしか書けない。

アローキーワード(‘=>’)を使用してメソッドを書くと、カギ括弧とreturn文を省略してメソッドの中身を書くことができます。

アローキーワードはラムダ関数(※)などメソッドを簡単に書きたい時に使用されます。

(※ラムダ関数はメソッドの中に書くことができるメソッドになります。)

アロー演算子を使用した場合はメソッドの中身は必ず値を返す一文でなければならず、変数を宣言したり、二つ以上の文を書くことはできません。

どうしても書きたい時は?演算子を使用してください。

【実践】Unityで実際にメソッドを作って使ってみよう!

サンプルコードを実行した時の画像

実行中にValueの値を変更すると色の赤みを調節することができる。

それでは実際にUnityでメソッドを作って使ってみましょう!

これまででもStart()やUpdate()と既にメソッドを作っていましたが、今回は好きなメソッドを作って実際に呼び出してみましょう!

サンプルコードではChangeColor(Color, float)というメソッドを作って、Updateメソッドの中で呼び出しています。

まとめ

今回の記事ではメソッドについて学びました。簡単にまとめると以下のようになります。

  • メソッドとはスクリプトの処理をまとめたもの。
  • メソッドは入力値(引数)を受け取り、値を出力する(戻り値)。
  • 何も値を出力しない時はvoid型を指定する。
  • 引数に渡した値はコピーされるので、そのメソッド以外には影響を与えない。
  • ただしクラス型など参照型を引数として与えると参照先のデータに影響が出る。
  • メソッドに渡す際に元の値をコピーされたくない場合はinキーワードを使ういい。
  • 引数自体にメソッドの処理内容の影響を与えたい時はrefoutキーワードを指定する。
  • 引数が異なる場合は同じ名前のメソッドがあってもいい(オーバーロード)
  • アローキーワードを使うと制約があるが簡単にメソッドの中身を書くことができる。

以上になります。それでは次の記事に進んでいきましょう!

Unity C#の文字列と文字列処理メソッドの使い方
今回の記事では文字列について解説していきます。 文字列を使えるようになると、アプリ上でテキストを表示できるようになります。 ゲーム内でメニュー画面の文字表示やダイアログメッセージを出したりする場合に必須ですね。 またそんな文字列を操作する文...

初心者向けUnityC#入門講座に戻る>>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

タイトルとURLをコピーしました