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

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

投稿主の無能です。

今回は、スクリプトを書いてPlayerであるSphereを動かしたいと思います。


スクリプトを書いてみる

それでは、早速スクリプトを書いてみたいと思います。

その前に、スクリプトって何?って話になると思います。
スクリプトは、Unityで使用するゲームオブジェクトにカスタムしたコンポーネントを作成できるようになります。
そのコンポーネントをゲームオブジェクトに実装することで、ゲーム内で独自の動きができたりします。

例えば
  • 制限時間を付けて、制限時間を超えたらゲームオーバーになる
  • キーボードやコントローラからユーザーからの入力を受け付ける
など、書き切れない様々な動作が実現できます。

ゲームオブジェクトに元々実装されたコンポーネント、また追加したコンポーネントでは、ゲーム内では理想や要求には足りない、と言う時に必要になってきます。
と言うよりかは、ゲーム作りにはどうしても独自の動きや反応が必要になるので、必須と言えるかもしれません。

難しそう…と思われる方もいると思いますが「必要(と思われる)な機能をスクリプトで書く」と言うことなので、必要な事が明確にハッキリしていれば大丈夫です。
必要な事がハッキリしているのに、上手くカスタマイズできない…と言う時は、必要な事を細分化してみてください。

手で物を掴む動作を例に挙げると、手を掴みたい物の場所へ動かして、指を曲げて、物の重さに合わせた力を入れる、みたいな感じになります。

人間だと意識せず出来る事ですが、ゲームオブジェクトに動作や機能を持たせる場合は、初めから教えてあげる必要が出てきます。
その面倒くさいものをある程度体系化されてあるのがスクリプト(プログラム)になります。

今回はPlayerであるSphereを動かす、という明確な目的があるので、実際にC#スクリプトを書いてみましょう。


スクリプトの作り方

スクリプトを作るには、Projectビューで右クリック Create > C# Scrpit で作れます。

その前に、色々なスクリプトを入れておくためのフォルダを作成しておきましょう。

前回やったので操作は割愛しますが、Assetフォルダ内に「Scripts」フォルダを作成します。

Assetフォルダ内に「Scripts」フォルダを作成する

この作成したScriptsフォルダ内にスクリプトを作っていきます。

ではScriptsフォルダ内で右クリック > Create  > C# Script で作成し、そのまま名前を初期に入力できる状態で「PlayerController」と名前を付けます

Scriptsフォルダ内で右クリック > Create  > C# Script で作成

作成直後に「PlayerController」と名前を付ける

スクリプトが作成された

何故名前をスクリプトファイルを作成直後に決めなければならないのか、ですが、これはスクリプトファイルのファイル名と、スクリプトファイル内のクラス名完全一致することが、スクリプトの動作する条件になるからです。

先程作成したスクリプトファイルを選択すると、Inspectorビューにコードのプレビューが見られます。


この先程名前をつけた「PlayerController」が、初回だけ自動的にクラス名になります。
ここが完全一致しないと動かないので、スクリプトを作成した時は、初回だけ注意が必要です。

試しに、一度初回のスクリプト作成時にそのままEnterキーを押下し、その後にファイル名を「aaa」に変更します。

スクリプトのファイル名とスクリプト内のクラス名が異なっている

スクリプトのファイル名がaaaとなっているのに、スクリプト内のクラス名はデフォルトの「NewBehaviourScript」になっています。

このままだと正常に動作しないので、これをゲームオブジェクトにくっつけようとするとエラーになります。

スクリプトのファイル名とクラス名が違うとエラーになる

このような状況になった場合は、ファイル名とクラス名が完全一致するよう手入力で修正するか、作成直後であれば(スクリプトを書いていない場合であれば)削除して再度スクリプトファイルを作成しましょう。

では、スクリプトファイルを開いて、スクリプトを書いていきましょう。


PlayerControllerを書いてみる

ではPlayerControllerをダブルクリックして、スクリプトを開いてみましょう。

ダブルクリックすると、自動的にVisual Studioが起動して目的のスクリプトファイルを開きます。

Visual Studioが起動しPlayerControllerが開いた

これからこのスクリプトファイルに、実際にコードを記述していきます。

コメントを記述する

まずはやりたい事を書いてみましょう。

1行目の文頭部分をEnterで改行して、記述スペースを2行空けます。

1行目の文頭を改行し、記述スペースを空ける

1行目に「//」(スラッシュ2個)を続けて入力すると、緑色に変わりました。

「//」(スラッシュ2個)を続けて入力すると、緑色に変わった

この「//」(スラッシュ2個)は「コメント」と言って、「//」の後はコードではないと判断され、自由に記述ができます。

先程Visual Studioが開いた時に、緑色で英文が書かれていましたね。

早速目標となる「Playerを動かすスクリプト」と書いてみましょう。
勿論、上記以外でも自由にコメントを書いても結構です。

コメントを記述する

それでは上書き保存します。
今回はショートカットキーのCtrl+Sで上書き保存します。

保存すると、自動的にUnityへ変更が反映されます。

因みに保存されたかどうかは、Visual Studioのファイル名の後ろに「*」(アスタリスク)がついているかどうかで判別できます。

「*」が付いていると変更箇所があり未保存であるという意味になります。
Ctrl+S直後は「*」が消えて、変更箇所が無く保存済みであることになります。

変更箇所があり未保存である

変更箇所が無く保存済み

スクリプトはこまめにCtrl+Sで保存しましょう。

Unityに戻って、PlayerControllerスクリプトを選択してInspectorビューを見てみましょう。


日本語の部分が文字化けしてますが、コメントが記述された変更が反映されています。

このように、少しずつコードを書いていきましょう。

Playerを動かす

つぎに、いよいよPlayerを動かしてみたいと思います。

一度Unityに戻って、Playerを選択します。

Playerをを選択

このPlayerのPositionのYを2にして、地面と離れた状態にします。

PlayerのPositionのYを2にする

地面から浮いた状態になる

この状態で、Unityの上部中央にある再生ボタンを押して、Unityでゲームを実行してみます。

再生ボタンを押してUnityでゲームを実行

ゲームを実行した画面

あれ、Playerが落っこちてこない…?

そうなんです、物理法則の概念が無いんですね。

えっ、そこから!?となりそうなんですが、Unityにきちんと用意されてあります。
それがRigidbody(リジッドボディ)というコンポーネントです。

初期状態ではRigidbodyコンポーネントは付いていませんので、追加する必要があります。

追加する方法は簡単です。
Playerを選択し、メニュー Component > Physics(フィジックス) > Rigidbody で追加できます。

Playerを選択しメニュー Component > Physics > Rigidbody で追加

Rigidbodyが追加された

このRigidbodyは物理演算をシミュレートしたコンポーネントで、このRigidbodyをスクリプトで操作させてPlayerを動かす、という流れになります。

それでは実際に物理演算が働いているのか、Unityの再生ボタンを押して確認しましょう。

跳ねはしないけど、きちんと落ちていきましたね!

それではスクリプトに戻って、実際にPlayerを動かしてみましょう。

PlayerControllerに記述する

ではPlayerを動かすスクリプトを記述していきます。

何も考えず、次のコードをスクリプトのvoid Update()と書いてある「{}」内に記述します。

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

コピペでも良いんですが、無能は覚える為に写経という手入力をしています。
何故写経するのかと言うと、やはり誰かが書いたコードとは言え、コードの書かれた意味や動きを少しでも理解しながら写す、という意味で写経します。
そうすると、無能の感覚ですがコピペに比べて実際に理解度や身に付く度合が段違いになる、と思います。

すると、Update内はこのような形になります。

スクリプトのUpdate内

それでは、このスクリプトを保存して、Unityに戻ります。

Unityに戻ったら、Playerを選択します。
InspectorビューにPlayerの詳細が出てきますね。
その状態で、PlayerControllerスクリプトをドラッグして、Inspectorビューにドロップします。

PlayerControllerスクリプトをドラッグして、Inspectorビューにドロップ

すると、PlayerControllerスクリプトがPlayerのInspectorビューに入りました。

PlayerのInspectorビューに入った

この作業を「アタッチ(attach)」と呼びます。
アタッチはスクリプトに限らず、コンポーネントでも使われます。
ゲームオブジェクトに、スクリプトやコンポーネントなどを紐付ける作業、と言った感じです。

ですので、今回は「PlayerにPlayerControllerスクリプトをアタッチした」という事になります。
頻繁に使われる言葉なので、覚えておきましょう。
(Unityに触っているといつの間にか自然と使ってます)

逆に怖いのが「アタッチ忘れ」です。

折角スクリプトを書いて機能を実装したのに動かない…なんて時は、真っ先にアタッチ忘れを疑いましょう。

新規ゲームオブジェクトや、ゲームオブジェクトの変更によってアタッチが剥がれる場合があったりするので、あれ?と思ったらアタッチ忘れ、を思い出してください。

それでは、Unityの再生ボタンを押してみましょう。
再生ボタンを押したら、キーボードの方向キーを押してみてください。

おおー!動かせる!
…けどおっそいなw

動く…けど遅い。。。

これは、先程書いたスクリプトに修正が必要ですね。。。

と言うことで、今回はここまで。


まとめ

本記事では
  • PlayerControllerスクリプトを作成して、Playerを動かせるコードを記述した
  • PlayerControllerスクリプトをPlayerにアタッチして、実際に動かしてみた
という事を行いました。

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

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

コメント