前回のメソッドの説明と使い方はどうでしたか。
今回はクラスの説明です。クラスは簡単にいうと設計図です。その設計図には関係のある変数とメソッドがまとめられています。
新しいことばかりだと思ってやだと思うかもしれませんが、これからのプログラミングを助けてくれるものだと考えれば、知ろうと思えます(ポジティブ)
クラスは設計図
クラスは簡単にいうと設計図です。
その設計図には関係のある変数とメソッドがまとめられています。
とりあえず下にすすみましょう。
クラスはスクリプトが見にくくなるのを助けてくれる
- 戦士の変数やメソッド
- 賢者の変数やメソッド
- 魔法使いの変数やメソッド
- 敵の変数やメソッド
もしクラスがなかった場合、こやつらの変数やメソッドをまとめるのは大変です。
「戦士のメソッドどれだっけ。あーこれか、あれ変数はどれ、これは魔法使いの変数だった」
みたいなことがおきます。
しかし、クラスを作ることによって、関係のあるメソッドと変数がひとまとめになります。
「戦士の変数とメソッドはここのクラスに書いてある」「賢者の変数やメソッドはここのクラスに書いてある」とわかりやすく管理できるようになるのです。
とりあえ変数とメソッドをまとめてくれているいいヤツです。
RPGの主人公のクラス
RPGの主人公のクラスを作る場合を考えていきます。
●RPGの主人公のクラス(設計図)
変数
- HP
- MP
メソッド
- 武器で攻撃する
- 魔法で攻撃する
- 逃げる
(正確にはメンバ変数とメンバメソッドといいます。あとで説明するのだ)
変数とメソッドをクラスとしてひとまとめることができるのです。他の魔法使いや敵のHPやMPの変数と同じ場所に書かないので、変数とメソッドを管理しやすくなります。
クラスは設計図なので設計図をもとにしてものを作ることが必要
あくまでクラスは設計図です。設計図をもとにしたものを作らないと意味がないし、使えません。
設計図をもとにしてつくられたものを「インスタンス」といいます。
クラスの中で使う変数をメンバ変数、クラスの中で使うメソッドをメンバメソッド
- クラスの中で使う変数をメンバ変数
- クラスの中で使う変数をメンバメソッド
といいます。
RPGの主人公のクラス(設計図)の例だと
●メンバ変数
- HP
- MP
●メンバメソッド
- 武器で攻撃する
- 魔法で攻撃する
- 逃げる
これです。
クラスは型のように使える
- int age;
- string name;
これで変数を使うことができました。
Player mainPlayer;
このようにして「mainPlayer」という変数を使うことができます。
「Player」が「int」や「string」の型のような役割をしているということですね。
インスタンスの作成
クラス名 変数名 = new クラス名();
インスタンス作成には「クラス名 変数名 = new クラス名();」これで作成することができます。これで実体を作るという感じです。
インスタンス内のメソッドの呼び出し方
変数名.メンバメソッド(引数);
で呼び出せます。引数がなければ空白です。
クラス→クラスをもとにインスタンス→インスタンス内のメソッドを呼び出すことをしめしています。
クラスを使ったスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 1.クラス作成
public class Player
{
// 2.メンバ変数
private int hp = 200;
private int weapon_power = 50;
private int magic_power = 70;
// 3.メンバメソッド
//武器で攻撃する
public void WeaponAttack()
{
Debug.Log(this.weapon_power + "ダメージを武器で与えた");
}
// 魔法で攻撃する
public void MagicAttack(int magic_mp)
{
Debug.Log(this.magic_power + "ダメージを魔法で与えた");
Debug.Log("MPが" + magic_mp + "減った");
}
// 逃げる
public void GoAway()
{
Debug.Log("バトルから逃げた");
}
}
public class Test : MonoBehaviour
{
// Use this for initialization
void Start()
{
// 4.インスタンス作成
Player mainPlayer = new Player();
mainPlayer.WeaponAttack();
mainPlayer.MagicAttack(20);
mainPlayer.GoAway();
}
// Update is called once per frame
void Update()
{
}
}
クラス名 変数名 = new クラス名(); | インスタンスを作る |
変数名.メンバメソッド(引数); | インスタンス内のメソッドを呼び出す |
●結果
50ダメージを武器で与えた
70ダメージを魔法で与えた
MPが20減った
バトルから逃げた
になります。下でスクリプトの説明しています。
1.クラス作成
// 1.クラス作成
public class Player
{
//略
}
クラス作成です。「Player」クラスを作っています。「Player」の設計図ですから、この中にHPやら武器攻撃のメソッドを書いていきます。
2.メンバ変数
// 2.メンバ変数
private int hp = 200;
private int weapon_power = 50;
private int magic_power = 70;
ここは「Player」クラス内で書かれています。メンバ変数を設定しています。
いつもと違うところがありますよね。なんかint型の前に「private」というものがついています。
これを使うと宣言したクラス以外でその変数にアクセスすることができなくなります。詳しくは「アクセス修飾子」と書いてある場所をご覧ください。
3.メンバメソッド
// 3.メンバメソッド
// 武器で攻撃する
public void WeaponAttack()
{
Debug.Log(this.weapon_power + "ダメージを武器で与えた");
}
// 魔法で攻撃する
public void MagicAttack(int magic_mp)
{
Debug.Log(this.magic_power + "ダメージを魔法で与えた");
Debug.Log("MPが" + magic_mp + "減った");
}
// 逃げる
public void GoAway()
{
Debug.Log("バトルから逃げた");
}
ここも「Player」クラス内です。メンバメソッドを書いています。メンバメソッドとっても、前に学んだメソッドとかわりません。処理がまとめられています。
ここでまたなにかおかしいことがあります。「this」ってなんぞや。
「this」はクラス内のメンバ変数を使う場合につけるものです。(つける習慣があればエラーが少なくなりんす)
4.インスタンス作成
void Start()
{
// 4.インスタンス作成
Player mainPlayer = new Player();
mainPlayer.WeaponAttack();
mainPlayer.MagicAttack(20);
mainPlayer.GoAway();
}
クラス名 変数名 = new クラス名(); | インスタンスを作る |
変数名.メンバメソッド(引数); | インスタンス内のメソッドを呼び出す |
これは「Test」クラス内にかかれてます。
「Player mainPlayer = new Player(); 」で「Player」クラスからインスタンスを作っています。設計図から実物をつくるイメージです。
「mainPlayer.WeaponAttack();やmainPlayer.MagicAttack(20);やmainPlayer.GoAway();」でインスタンス内のメソッドを呼び出しています。
「mainPlayer.MagicAttack(20);」は引数20を「MagicAttack」メソッドに渡しています。
アクセス修飾子
// 2.メンバ変数
private int hp = 200;
private int weapon_power = 50;
private int magic_power = 70;
なんか「private」がついてますね。「private」はアクセス修飾子といってこれをつけると、同じクラスのみからアクセス可能になります。
例えば、「Test」クラス内から、「hp」変数にアクセスすることはできません。「Test」クラス内に「Debug.Log(hp);」を書いてみてください。エラーがでます。
他にも「public」や「protected」というアクセス修飾子があります。
「public」をつければ他のどのクラスからでもアクセスすることができ、「protected」は同じクラス内とサブクラスからアクセスすることができます。
サブクラスに関してはここで説明しません。とりあえずよく出てくる、「public」と「private」は覚えておいてください。
public | どこからでもアクセス |
protected | 同じクラス内とサブクラスからアクセスできる |
private | 同じクラス内のみからアクセスできる |
まとめ
- クラスは設計図、設計図には関係のある変数とメソッドがまとめられている
- クラス(設計図)をもとにしてつくられたものを「インスタンス」
- クラスの中で使う変数をメンバ変数
- クラスの中で使う変数をメンバメソッド
クラス名 変数名 = new クラス名(); | インスタンスを作る |
変数名.メンバメソッド(引数); | インスタンス内のメソッドを呼び出す |
おつかれさまでした。「これ役立つの?」と思えることばかりだったと思います。ただ、絶対に役立ちますし、Unityと合わせた使い方の記事も作っていきます。
サンプルゲームをつくってみると「こういう使い方するんだ」とわかると思います。
作ってみてください。
コメント