【Unity】チュートリアルの「Roll a Ball」をやってみる話 #4

記事をご覧いただき、誠に有難うございます。

投稿主の無能です。

今回は、PlayerControllerスクリプトの中身の説明と、Playerがもっと速くなるようにスクリプトを改修したいと思います。


スクリプトの中身

前回、何も考えずにUpdate内に追加してもらったスクリプトを再掲します。

float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(x, 0, z);

Visual Studio(以下VS)と表示が異なるのはご容赦ください。

まず1~3行目の、文頭からスペースまでです。
1~2行目ならfloat、3行目はRigidbodyですね。

これは、「=」の前の変数名の型を決める型名です。

floatは変数のデータ型で、浮動小数点数を扱います。単純に小数を扱う時はfloatを使う、覚えておけば問題ありません。
floatはUnityで滅茶苦茶使います。

3行目のRigidbodyは、前回PlayerにアタッチしたRigidbodyです。

型名の後、「=」の前までは変数名で、任意で名付けることができます。
とは言え一応決まりというか、後でコードを読み返す時や他の誰かに自分の書いたコードが読み易いように、慣習みたいなものがあります。
今回最低限の簡単なものだけをお伝えしますので、これだけは守ってコードを書いてみてください。
自分が読み返す時に非常に楽になります。

変数名の付け方


変数名は、まず意味のある英単語をチョイスしましょう。
Google翻訳が大活躍ですね。
無能も英語が苦手なので、いつもお世話になりっぱなしです。

1文字だけの場合は、後に続く命令文で簡単に判別できる方向などの場合に使われることが多く、その他の場合は1単語でも英単語を用います。

例えば「speed」とかですね。

1文字だけの変数名だったり、どこでどう使っているか分からない変数名はマジックナンバーと呼ばれ、これから出会うであろうバグの温床になりやすいです。
こうなるとどこがバグなのか、原因を究明するのに物凄く時間が掛かります。

ですので、
  • バグの温床を避ける
  • 誰かに見てもらうことを前提にコードを書く
と言った意味でもマジックナンバーは避けましょう。

3行目の変数名「rb」は「Rigid」と「body」の頭文字それぞれrとbを取ってrbとしています。
1~2行目のxとzは、方向を表しています。

あとは、変数名の最初の単語の頭文字は小文字その後の単語の頭文字は大文字、という慣習があります。
例えると「ballSpeed」とか「playerPower」とかですね。

この理由は関数と区別するためになります。
関数は別のスクリプトを書くときに解説したいと思います。

関数の場合、変数名は「BallSpeed」や「PlayerPower」などのように最初の英単語から大文字になる慣習があります。

変数と関数の名前を区別するため、変数の場合はLower Camel Case、関数の場合はUpper Camel Caseという呼び方がされています。

このLower/Upper Camel Caseですが、ラクダにたとえられています。

Lowerはラクダが首を下げていて、首から背中を辿るとこぶがあり、こぶから次のこぶまでが英単語で、こぶの頂点が大文字になるという感じです。

Upperはその逆で、ラクダが首を上げて最初から大文字になっています。後のこぶは共通です。

最低限、変数名の付け方になります。

「=」の意味

「=」(イコール)の意味ですが、通常の意味とは異なり、代入を意味します。
=の右側の値を、=の左側にある変数に代入する、という意味になります。

役割も数学の「等号」とは異なり、プログラミングでは「代入演算子」というものになります。

数学でいう「等号」は別になっていて、プログラミングでは「==」となり「比較演算子」になります。

比較演算子は種類があります。
  • ==:左辺と右辺が等しい
  • <:小なり 左辺が右辺未満(右辺は含まない)
  • >:大なり 左辺が右辺よりも大きい()右辺を含まない
  • <=:小なりイコール 左辺が右辺以下
  • >=:大なりイコール 左辺が右辺以上
という風になっています。

スクリプトを置き換えてみると
(左辺)型名 変数名 ←(代入) (右辺)計算結果
という感じですかね。

プログラミンでは「=」は代入、と覚えましょう。

3行目はどうなっている?

さて、最低限の説明も終わったので、ようやく中身の説明ができますね。
1~2行目は一旦置いといて、3行目から説明します。

Rigidbody rb =

までは上記で説明できました。

型Rigidbodyの変数rbに代入する

という感じです。

で、何を代入するの?で右辺の演算結果です。

右辺GetComponent<Rigidbody>();

ですが、GetComponentは「コンポーネントを取得しなさい」という命令です。
取ってくるものは「<>」(山かっこ)で括られた中身になります。
「()」(かっこ)は関数の決まりで、必ず必要になります。
「;」(セミコロン)はC#の決まりで、文末に必ず付けます。

あわせると

(左辺)型Rigidbody 変数名rb =(左辺に右辺を代入) (右辺)コンポーネントを取得<リジッドボディ>();

となり、

Rigidbodyコンポーネントを取得して、型Rigidbodyの変数rbに代入する

という命令文になります。
短い文ですが、こんな意味があったんですね。

1~2行目はどんな意味?

置いておいた1~2行目の説明に移ります。

3行目と同様に説明すると

float x =
float z =

ですが

型 小数 変数名 x(z)に右辺を代入する

となります。

右辺ですが「Input.GetAxis」というものになっています。

まずは「.」(ドット)の前後で分けてみます。
分けると「Input」と「GetAxis」ですね。

「Input」はUnityが用意してくれている、キーボードやゲームパッドなどの入力デバイスから入力を受け取る機能です。
Unityがサポートしている入力デバイスであれば使うことができます。

「GetAxis」は入力デバイスの方向キー、今回はキーボードの矢印キーで入力された値を数字にして返してくれます。
例えば→は1に向かっていく値を、←は-1に向かっていく値を小数で返します。
↑は1に向かっていく値を、↓は-1に向かっていく値を小数で返します。

だから変数xとzはfloatなんですね。

「.」は助詞のようなもので「InputのGetAxis」みたいなイメージです。
その時々で変わるので、適宜読み替えてみてください。

ここまで見てきた「Input.GetAxis」は
入力デバイス(キーボード)された矢印キーを数値で返す
という命令になります。

次に「(”Horizontal”)」と「("Vertical")」ですが、
  • Horizontal:水平方向(ホリゾンタル)
  • Vertical:垂直方向(ヴァーティカル)
という意味になります。

あわせると、1行目は

小数型の変数xに入力デバイス(キーボード)で入力された水平方向を数値にして返す

という命令になります。

2行目は

小数型の変数zに入力デバイス(キーボード)で入力された垂直方向を数値にして返す

という命令になります。

何となくイメージが掴めましたか?

1~2行目は
キーボードで入力された値をx、zに代入する
3行目は
Rigidbodyコンポーネントを取得してrbに代入する
となります。

あとは残り1行です。

4行目の意味は?

最後の4行目ですね。
4行目は今まで取得した変数の値を使っての命令になります。

「rb.AddForce(x, 0, z);」で新しく出てきた命令は「AddForce」になります。
「AddForce」はそのまま「力を加える」という命令になります。

今までの変数を組み合わせていきましょう。

変数rb(Rigidbody)に力を加える(変数x(小数), ゼロ, 変数z(小数))

となります。

これで何となくでも、内容が掴めましたか?
(説明が下手ですみません。。。)

それではこのスクリプトを改修します。

スクリプトを改修する

では、早速やっていきましょう。

まずは、分かりやすいようにコメントを記述します。
例としてこんな感じで、分かりやすく処理の概要をスクリプトの上部に書いていきます。
コメントは自由に書いてください。

コメントの記入例

次に、前回の遅いPlayerのスピードを変えたいと思います。

力を加えるAddForceにある、変数xとzを10倍してみましょう。
このように記述します。

rb.AddForce(x * 10, 0, z * 10);

プログラミングでの四則演算は
  • +:加算(足し算)
  • -:減算(引き算)
  • *:アスタリスク 乗算(掛け算)
  • /:スラッシュ 除算(割り算)
となります。

ではスクリプトを上書き保存して、Unityに戻り再生ボタンを押して実行してみましょう。

10倍したPlayer

うん、かなり良くなりましたが、もう少し早くてもいいかな?

変数を使う

先程は直接xとzに10を掛けましたが、何度もスクリプトを開いているVSとUnityを行き来するのは大変ですよね。

そこで、変数の出番になります。
早速変数を使って、Playerのスピードを自分の最適なものにしましょう。

まずは変数speedを用意します。
「public class PlayerController : MonoBehaviour」と書かれた下の「{」の下から、「void Start()」の前までの間に、次のように記述します。

public int speed = 15;

このような形になります。

変数speedを追加

そして、変数speedを使います。

AddForceで入力した10と言う値をspeedに置き換えます。

rb.AddForce(x * speed, 0, z * speed);

このような形になります。

先程入力した10をspeedに置き換える

では保存してUnityに戻りましょう。

Unityに戻ってPlayerを選択すると、アタッチしたPlayerControllerスクリプトにSpeedという入力欄が出来ています。

Speedという入力欄ができた

何故このようになったのかと言うと、アクセス修飾子を付けたのが理由です。

アクセス修飾子というのは、先程変数speedの文頭に付けた「public」になります。

何それ?ですよね。

アクセス修飾子というのは、公開する範囲を決めるものです。
「public」の反対は「private」になります。

公開する範囲?になりますよね。

公開する範囲はスクリプトファイルの中からなのか、スクリプトファイルの外側からなのか、という範囲の違いになります。

「void Start()」や「void Update()」にも、修飾子は付いていないように見えますが、「private」の修飾子が省略されています。見えないだけですね。

この「void Start()」や「void Update()」などは特別扱いで、外側からいじれないと動作しないため、privateが省略されていてもUnityがアクセスできるようになっています。

自分で用意した変数や関数でアクセス修飾子を省略するとprivateになります。
外から(Unityから)コンポーネントをアタッチしたりする場合や、違うスクリプトファイルからアクセスしたい場合などはpublicを使います。

取り敢えず、publicとprivateの2つが使えれば問題ないです。


では、Unityに戻って再生ボタンを押して実行しましょう。

実行中にSpeedの値を変えてみて、変更したまま再生ボタンを押して終了します。

Speedの値が元に戻っていますね。

実行中変更した値は破棄されるので、実行していない時に値を変更することで、変更した値が保持されます。
ここは結構忘れがちな部分なので、注意しておきましょう。

これで自由にPlayerのスピードを変えられるようになりました!

今回はここまで。


まとめ

本記事では
  • スクリプトを書く際の、最低限の注意点を覚えた
  • 変数、関数の命名規則を覚えた
  • アクセス修飾子の概要を覚えた
  • PlayerControllerスクリプトを改修し、自由なスピードに変えられるようになった
という事を行いました。

説明が下手で長くなってしまいました…

次は、カメラの調整とカメラ用のスクリプトを作成したいと思います。

本記事もご覧頂き、誠に有難うございます。
ではまた。


コメント