Movatterモバイル変換


[0]ホーム

URL:


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

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


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

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

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

前回の記事:

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

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

メソッド(関数)とは

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

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

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

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

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

メソッドの呼び出し方

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

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

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

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

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

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

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

メソッド呼び出しの一例
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//サンプル用に簡単なクラスを定義している。
classA{
  publicvoidMethod(){}
  publicintMethod2(inta,intb){returna+b;}
}
 
vara=newA();
//aのメンバであるMethod()を呼び出している。
a.Method();
 
//aのメンバであるMethod2を呼び出している。
// Method2は引数を2つ取り、int型の戻り値を返すメソッドになるので、
// 引数を1と2の2つ渡してあげている。
// また、戻り値をcの初期値として使っている。
varc=a.Method2(1,2);
 
//戻り値は以下のように値と同じように使うこともできる。
vard=1+a.Method2(3,4);

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

メソッドの書き方の画像

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

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

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

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

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

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

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

戻り値について

メソッドの戻り値の画像

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

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

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

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

タプル(Tuple)について

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

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

タプルの使い方
C#
1
2
3
4
5
6
7
8
9
10
11
12
{//タプルの使い方
  (int,float,string)a=(10,1f,"ABC");
  intn1=a.Item1;// <- n1 == 10
  floatn2=a.Item2;// <- n2 == 1f
  stringn3=a.Item3;// <- n3 == "ABC"
}
 
{//名前つきタプル
  (intNo,stringName)b=(-1,"Tuple");
  intn1=b.No;// <- n1 == -1
  stringn2=b.Name;// <- n2 == "Tuple"
}

ref returnとref local

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

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

引数について

メソッドの引数の画像

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

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

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

<型名> <引数名>

引数のデフォルト値

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

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

デフォルト値付きの引数の書き方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classA{
  //デフォルト値付きの引数
  publicvoidMethod(inta=10){}
 
  //必ず、引数の最後に書く必要がある。
  publicvoidMethod2(inta,intb=10);
 
  //aのように後にデフォルト値なしの引数を書くことはできない。
  publicvoidNG3(inta=10,intb,floatc);
}
 
vara=newA();
//呼び出しの時はデフォルト値付きのものは省略できる。
a.Method();//<- OK, 引数aには10が渡される。
a.Method(-1);// <- OK. 引数aには-1が渡される。
a.Method2(10);// <- OK
a.Method2(10,-234);// <- OK

名前付き引数の渡し方

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

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

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

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

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

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

名前付き引数の例
C#
1
2
3
4
5
6
7
8
9
10
11
classA{
  publicvoidMethod(inta,intb,intc){
    ...
  }
}
 
varinst=newA();
//次の2つは同じ引数を渡している。
inst.Method(c:100,a:10,b:-1);
inst.Method(10,-1,100);
inst.Method(a:10,-1,c:100);

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

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

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

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

引数の注意点・値型の時
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
classA{
  publicvoidMethod(inta){
    a+=2;//引数aの値を変更してみる。
  }
}
varinst=newA();
intA=10;
//Methodの引数aに変数Aを渡す
// 変数AをコピーしたものがMethod()の中で+2されている。
inst.Method(a);
 
//値を確認してみると、変数Aの値は変わっていないことがわかる
boolOK=A==10;// <- OK == true
boolBad=A==12;// <- Bad == false

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

参照型の中身は

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

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

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

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

引数の注意点・参照型の時その1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classA{
  publicvoidMethod(Datadata){
    data.Value+=2;//Data型のValue変数の値を変更してみる。
  }
}
classData{
  publicintValue=0;
}
varinst=newA();
vard=newData();
d.Value=100;
 
//Methodの引数dataに変数dを渡す
// 変数dのどのデータを指しているのかという情報をコピーしたものがMethod()の中に渡される。
inst.Method(d);
 
//値を確認してみると、変数dのメンバ変数の値が変わっていることがわかる
boolOK=(d.Value==102);// <- OK == true
boolBad=(d.Value==100);// <- Bad == false

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

引数の注意点・参照型の時その2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
classA{
  publicvoidMethod(Datadata){
    data=newData();//引数dataに新しく作成した実態データを設定する。
    data.Value=-1;//新しく作成した実態データのValueの値を変更している
  }
}
classData{
  publicintValue=0;
}
varinst=newA();
vard=newData();
d.Value=100;
 
//Methodの引数dataに変数dを渡す
// 変数dのどのデータを指しているという情報をコピーしたものがMethod()の中に渡される。
inst.Method(d);
 
//値を確認してみると、変数dのメンバ変数の値は変わっていないことがわかる
boolOK=(d.Value==100);// <- OK == true
boolBad=(d.Value==-1);// <- Bad == false

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

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

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

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

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

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

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

inキーワード付き引数

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

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

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

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

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

inキーワードの使い方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
classA{
  publicvoidMethod(ininta,inStructs,inClassc){
    a=10;// <- NG
    s=newStruct();// <- NG
    c=newClass();// <- NG
 
    s.Value=10;// <- OK
    c.Value=20;// <- OK
  }
}
classClass{
  publicintValue;
}
structStruct{
  publicintValue;
}
 
varinst=A();
inta=0;
Structs=newStruct();
Classc=newClass();
//呼び出しの時はinキーワードは省略できる。
inst.Method(a,ins,c);

refキーワード付き引数

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

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

refキーワードの使い方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
classA{
  //refキーワードは引数の前に書くこと
  publicvoidMethod(refinta){
    a+=2;
  }
  publicvoidMethod(refDatadata){
    data=newData();//引数dataに新しく作成した実態データを設定する。
    data.Value=-1;//新しく作成した実態データのValueの値を変更している
  }
}
classData{
  publicintValue=0;
}
varinst=newA();
intA=100;
 
//Methodの引数aに変数Aを渡す
// こちらでも引数として渡す値の前にrefを書くこと
inst.Method(refA);
 
//値を確認してみると、変数Aの値が変わっていることがわかる
boolOK=(A==102);// <- OK == true
boolBad=(A==100);// <- Bad == false
 
 
//参照型の場合も同じ
DataD=newData();
D.Value=100;
 
varprev=D;//<- 引数に渡す前の実態データを指す情報をコピーしておく
inst.Method2(refD);
 
boolOK2=(D.Value==-1);
boolBad2=(D.Value==100);
 
//実態データが置き換わっていることの確認
boolisEqual=(prev==D);// <- falseになる。

outキーワード付き引数

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

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

outキーワードの使い方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
classA{
  //outキーワードは引数の前に書くこと
  publicvoidMethod(outinta){
    a=2;
  }
  publicvoidMethod2(outDatadata){
    data=newData();//引数dataに新しく作成した実態データを設定する。
    data.Value=-1;//新しく作成した実態データのValueの値を変更している
  }
}
classData{
  publicintValue=0;
}
varinst=newA();
intA=100;
//Methodの引数dataに変数dを渡す
// こちらでも引数として渡す値の前にoutを書くこと
inst.Method(outd);
//値を確認してみると、変数Aの値が変わっていることがわかる
boolOK=(A==2);// <- OK == true
boolBad=(A==100);// <- Bad == false
 
 
//参照型の場合も同じ
DataD;// <- 宣言のみでOK
inst.Method2(outD);
 
boolOK2=(D.Value==-1);
// Method2の中で値が設定されていることを確認している
boolisInitial=(D!=null);// <- true
outキーワードの簡略化された書き方について

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

outキーワードの簡略した書き方
C#
1
2
3
4
5
6
7
8
9
10
11
classA{
  publicvoidMethod(outintb){
    b=100;
  }
}
 
varinst=newA();
// outキーワードは引数の中で変数宣言できる。
inst.Method(outintnewValue);
 
boolOK=(newValue==100);// <- true

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

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

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

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

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

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

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

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

メソッドのオーバーロードの一例
C#
1
2
3
4
5
6
7
8
9
10
11
classA{
  // オーバーロード可能なもの
  publicintMethod(){...}
  publicintMethod(inta){...}
  publicfloatMethod(floata){...}
  publicfloatMethod(inta,intb){...}
 
  // NGなもの
  publicvoidMethod(){...}
  publicintMethod(floata){...}
}

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

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

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

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

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

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

アロー演算子の使い方
C#
1
2
3
4
classA{
  //引数aを+10した値を返すメソッド
  publicintMethod(inta)=>a+10;
}

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

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

?演算子とアローキーワードを使ったメソッドの例
C#
1
2
3
4
5
6
classA{
  publicintMethod(inta)
    =>(a%2)==0
      ?a*20
      :a;
}

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

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

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

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

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

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

実際にメソッドを作って呼び出してみよう!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
usingUnityEngine;
 
publicclassSample:MonoBehaviour
{
  publicfloatValue=0f;
  publicColorColor=Color.white;
  publicMeshRendererMesh;
 
  //引数に渡されたColorを引数vを使って新しいColorを作るメソッド
  ColorChangeColor(Colorcolor,floatv){
    color.r=v;
    returncolor;
  }
 
  voidUpdate(){
    //毎フレームValueとColorを使って新しい色を計算している。
    varcolor=ChangeColor(Color,Value);
    if(Mesh!=null)Mesh.material.color=color;
  }
}

まとめ

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

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

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

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

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



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

関連記事

Unity C#入門講座

UnityC#の配列の使い方 一次元配列・多次元配列・ジャグ配列

今回の記事では配列について解説していきます。配列を使用することでたくさんのデータを一つの変数にまとめられます。前回の記事:配列(Array)とは配列とは同じ型を持つ値を一つの変数にまとめた参照型の値になります。C#では配列のようにたくさんの...
2021.09.11
Unity C#入門講座
Unity C#入門講座

Unity C#スクリプトの構造 スクリプトの作成と実行方法

前回はUnityとC#について簡単に解説しました。前回の記事↓今回の記事ではいよいよ実際にUnity上ではじめてのプログラミングに挑戦です!Unity C#スクリプトを作成・実行していきましょう!C#スクリプトを作成してGameObject...
2023.02.02
Unity C#入門講座
Unity C#入門講座

UnityC#のLinq・属性・拡張メソッド・クラスの部分定義の使い方

今回の記事では拡張メソッド、Linq、属性、クラスの部分定義など開発にとても役立つC#の機能を説明します。前回のデリゲートとイベントはちょっと難易度が高かったですが、今回の記事はもう少し取り組みやすくなります。ぜひ読んでみてください。前回の...
2023.04.22
Unity C#入門講座
Unity C#入門講座

UnityC#のインターフェースの使い方・ポリモーフィズムの考え方

今回の記事ではオブジェクト指向の重要な機能であるインターフェースとポリモーフィズムについて解説していきます。インターフェイスを使いこなせるようになるとプログラム全体の管理がしやすくなります。また、Unityなどフレームワークやライブラリはイ...
2021.09.11
Unity C#入門講座
Unity C#入門講座

Unity C#の繰り返し処理の使い方 for文・while文・foreach文

今回の記事では繰り返し処理についてみていきます。アプリ開発ではたくさんのデータに対して同じ処理を行いたい時があるのですが、その時に繰り返し処理を利用することになります。前回の条件分岐の制御文と併せてプログラミングの超重要ポイントの一つです。...
2021.09.11
Unity C#入門講座
Unity C#入門講座

Unity C#の条件分岐の使い方 if文・switch文

今回の記事では制御文について解説していきます。制御文にはいくつか分類があるのですが、ここでは条件分岐と呼ばれるif文とswitch文について見ていきます。前回の記事:制御文と条件分岐について制御文とはプログラムの処理を実行するかしないかを制...
2021.09.11
Unity C#入門講座

コメント

コメントをどうぞコメントをキャンセル

メールアドレスが公開されることはありません。

CAPTCHA


↓知りたいことを検索してね

Unity入門の森 インディーゲームリリース!

魔女と召喚獣

 

Seeker of Darkness

 

呪術迷宮をリリース

unity入門の森 ゲームの作り方のyoutubeチャンネル

unity入門の森 ゲームの作り方
「unity入門の森 ゲームの作り方」のyoutubeチャンネル。unityを用いたゲームプログラミング、unityスクール、ゲームクリエイターになりたい方向けの情報を中心に発信。インディーゲームクリエイター・プロゲーマー・ゲーム実況者を目...
www.youtube.com

ブログランキング参加中(クリックして応援してくれると嬉しいな)

にほんブログ村 教育ブログ プログラミング教育へ
にほんブログ村

カテゴリー

最近の投稿

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

[8]ページ先頭

©2009-2025 Movatter.jp