公式チュートリアル Roll A Ball
公式チュートリアル Roll A Ball を実践してみましょう。
なお、チュートリアルのムービーは英語ですが、Unityでは英語の情報が圧倒的に多いので、良い機会と捉えてUnityを通じて英語に慣れておきましょう。また、C#言語については完成のスクリプトも各ページに掲出されます。
Introduction
>>01. Introduction to Roll-a-Ball
Roll-a-Ballの概要についての説明をまず見てみましょう。
Roll-a-Ballは、矢印キーでボールを動かして、回転する立方体のオブジェクトを取っていくゲームです。
1. Environment and Player
>>01. Setting up the Game
ゲーム作成の最初の環境を整えます。
まずシーンを保存しましょう!
メニューの File > Save As を選択します。
Save Sceneのウィンドウが開いたら、Scenesフォルダを開きます。
Scenesフォルダが開いたら、ファイル名にMiniGameと名前を付けて保存しましょう。
Unityの画面の中で、作成したMiniGameのファイルを確認しましょう!
画面下のSceneフォルダを開くと、MiniGameのファイルがあります。また、画面上のHierarchyウィンドウをみるとMiniGameの名前が表示されていて、現在MiniGameの画面ということがわかります。
ゲームのフィールドとなるPlaneを作成しましょう。
メニューの GameObject >3D object > Plane を選びます。
あるいは、HierarchyウィンドウのCreateから GameObject >3D object > Plane を選んでもよいでしょう。
Planeの名前をGroundに変更しましょう。
HierarchyウィンドウのPlaneをゆっくり2回クリックして入力画面にし、Groundと入力します。
ここで変えた名前は Inspectorウィンドウにも反映されています。
Groundオブジェクトの位置を原点にリセットしましょう。
シーンのグリッドを非表示にしてみましょう。
Sceneウィンドウの右上にある Gizmosをクリックし、Show gridのチェックをはずします。
GizmoではSceneウィンドウの色々な情報の表示非表示を切り替えることができます。
PlayerとなるSphere(球)を作成しましょう。
TransformのPostionは原点にリセットします。Fキーを押して、Playerに寄っておきましょう。
PositionのYを0.5として、Groundに設置しているようにします。
色を作成しましょう!
まず色のファイルを保存するフォルダを作成しMaterialsと名前を付けます。
次にMaterialsフォルダを選択し、ProjectウィンドウのcreateからMaterialを選びます。
出来たNew Materialの名前をBackgroundと変更します。
BackgroundのInspectorウィンドウのAlbedoの白い小さな四角をクリックし、表示されたカラーウィンドウから好きな色を設定します。
ProjectウィンドウのBackgroundをドラッグ&ドロップでSceneウィンドウのgroundオブジェクトにアタッチします。
Playerが落ちないように周りに壁を作りましょう(3)
WestWallをDuplicate(複製)して、別の壁を作成しましょう。
4つ壁が出来上がったら、Playモードで動作確認をします。
うまくいったらSceneファイルを保存しましょう。
ここまでのファイルは、>>こちらからダウンロードできます。
>>01. Creating Collectable Objects
自律的に回転するPick Up Objectを作成しましょう。
HierarchyのCreateあるいはメニューのGameObjectから3DObjectのCubeを選びます。
Cubeが作成できたら、PickUpに名前を変更します。
なお、チュートリアルのムービーは英語ですが、Unityでは英語の情報が圧倒的に多いので、良い機会と捉えてUnityを通じて英語に慣れておきましょう。また、C#言語については完成のスクリプトも各ページに掲出されます。
Introduction
>>01. Introduction to Roll-a-Ball
Roll-a-Ballの概要についての説明をまず見てみましょう。
Roll-a-Ballは、矢印キーでボールを動かして、回転する立方体のオブジェクトを取っていくゲームです。
1. Environment and Player
>>01. Setting up the Game
ゲーム作成の最初の環境を整えます。
まずシーンを保存しましょう!
メニューの File > Save As を選択します。
Save Sceneのウィンドウが開いたら、Scenesフォルダを開きます。
Scenesフォルダが開いたら、ファイル名にMiniGameと名前を付けて保存しましょう。
Unityの画面の中で、作成したMiniGameのファイルを確認しましょう!
画面下のSceneフォルダを開くと、MiniGameのファイルがあります。また、画面上のHierarchyウィンドウをみるとMiniGameの名前が表示されていて、現在MiniGameの画面ということがわかります。
ゲームのフィールドとなるPlaneを作成しましょう。
メニューの GameObject >3D object > Plane を選びます。
あるいは、HierarchyウィンドウのCreateから GameObject >3D object > Plane を選んでもよいでしょう。
Planeの名前をGroundに変更しましょう。
HierarchyウィンドウのPlaneをゆっくり2回クリックして入力画面にし、Groundと入力します。
ここで変えた名前は Inspectorウィンドウにも反映されています。
Groundオブジェクトの位置を原点にリセットしましょう。
シーンのグリッドを非表示にしてみましょう。
Sceneウィンドウの右上にある Gizmosをクリックし、Show gridのチェックをはずします。
GizmoではSceneウィンドウの色々な情報の表示非表示を切り替えることができます。
PlayerとなるSphere(球)を作成しましょう。
TransformのPostionは原点にリセットします。Fキーを押して、Playerに寄っておきましょう。
PositionのYを0.5として、Groundに設置しているようにします。
色を作成しましょう!
まず色のファイルを保存するフォルダを作成しMaterialsと名前を付けます。
次にMaterialsフォルダを選択し、ProjectウィンドウのcreateからMaterialを選びます。
出来たNew Materialの名前をBackgroundと変更します。
BackgroundのInspectorウィンドウのAlbedoの白い小さな四角をクリックし、表示されたカラーウィンドウから好きな色を設定します。
ProjectウィンドウのBackgroundをドラッグ&ドロップでSceneウィンドウのgroundオブジェクトにアタッチします。
02. Moving the Player「C#スクリプトでPlayerが動くようにしましょう。」を進めましょう。
PlayerにPhysicsのRigidbodyの性質を与えましょう!
HierarchyウィンドウからPlayerを選択し、PlayerについてのIspectorウィンドウから下のAdd Componentをクリックし、Physicsを選びます。次に開いたウィンドウから、Rigidbodyを選択してください。
PlayerのInspecterウィンドウにRigidbodyの性質が追加されました。
Inspectorウィンドウをよく使う項目が上にくるようにレイアウトを変えましょう。
この操作は使いやすくするためのものなので、特にしなくてもゲームへの影響はありません。
Playerを選択し、InspectorウィンドウのSphere Coliderの左の三角形をクリックして、開いたり閉じたりしてみましょう。
SceneウィンドウのPlayerの周りに緑色の線が見えたり隠れたりします。この緑の線は当たり判定領域を表しています。
当たり判定はゲームではとても重要な要素です。
C#を使う準備をしましょう!
Windowsでは、C#での開発はVisual Studioを使います。
スタートからVisual Studioを起動しましょう。
アカウントがあるかどうか確認してみましょう。ない方はここで作成します。アカウントがうまく作成されなかったり、ログインできない方はひとまず30日の試用期間でログインしないまま使いましょう。
スクリプトを入れるフォルダを作成しましょう!
Projectウィンドウの上にあるcreateからFolderを選びます。
新しいFolderがProjectウィンドウに作成されます。名前をScriptsに変更しましょう。
Playerにスクリプトを書く準備をしましょう!
Playerを選択し、Inspectorウィンドウの下のAdd Componentから、New Scriptを選びます。
NameのところにPlayerControllerと入力し、 Create & Add ボタンをクリックしましょう。
Projectウィンドウで、PlayerControllerファイルをドラッグして、Scriptsフォルダに入れましょう。
Scriptsフォルダの左側の三角のボタンをクリックして、ファイルが入っているかどうか確認してください。
ProjectウィンドウにあるPlayerControllerファイルをダブルクリックして開きましょう。ここでは、先ほどのVisual Studioが起動します。
最初から書かれているスクリプトの一部をいったん削除します。
選択されているところを削除しましょう。
削除する行を選択してDeleteキーを押します。
もし赤い波線が出ていたら、それはエラーがあるところでです。削除し忘れたり、削除しすぎていないかどうかを確認してください。
新しいスクリプトを書いていきましょう。
voidの前にprivateが自動的についてきたら、そのままでも大丈夫ですが、チュートリアルの内容に合わせて削除しておいてもよいでしょう。
次にInputと記述しましょう。画像を参照ください。
今は赤い波線が出ていても気にしないで大丈夫です。
☆Unityのスクリプトについてより詳しく調べてみましょう。
Inputは外部デバイス(たとえばマウスやキーボードなど)からの入力を受け付けるコードです。
ここではPlayerをキーボードの矢印キーを使って、3次元で動かすので GetAxisを使います。
InputのStatic Methodsの項目にあるGetAxisをクリックしてより詳しくみてみましょう。
GetAxisを使って、キーボードの矢印キーからの入力を受け付けるスクリプトを書いてみましょう。
このスクリプトは公式チュートリアルの下にも出ています。
floatは、浮動小数点の数字を扱う変数を設定するものです。
入力し終わったら、Visual StudioとUnityの両方を保存して終了しましょう。
ここで、Rigidbodyを記述しますが、詳しい説明をみていきましょう。
Unityの公式ぺーじから>>Rigidbodyについての内容を調べます。
さらにPublic MethodsからAddForceをクリックして、詳細ページを開きましょう。
Playercontroller.csをVisualStudioで開き、画像の赤い囲みを参考にして、以下を入力します。
private Rigidbody rb;
privateは、このファイルの中だけで実行されるという意味です。
Rigidbodyの性質をもつrbという変数を設定しています。
入力した後に、赤い波線が出ていなければエラーはありません。
次に、以下を画像の赤い囲みを参考にして、画像のように記述します。
void Start()
{
rb = GetComponent<Rigidbody>();
}
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce (movement);
入力した後に、赤い波線が出ていなければエラーはありません。
記述できたら、保存をしましょう。
メニューのファイルから画像を参考にして保存を選びます。
Unityの画面に戻り、上にある再生ボタンを押し、カーソルキーでPlayerが動くかどうかテストしましょう。
うまく動かない方は、こちらのコードをコピー&ペーストして使ってみてください。
ここではまだspeedの変数は使っていません。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
rb.AddForce(movement);
}
}
コピー&ペーストしても動かない方は、Playercontrollerのファイル名とclass名を同じにしてみてください。
ここまでのファイルは >>こちらからダウンロードしてください。
Playerの速度を自由に変えられるようにspeedという変数をpublicで設定しましょう。
赤い囲みを参考にして追記し保存します。
Unityの画面でHierachyウィンドウからPlayerを選択します。
InspectorウィンドウのPlayerControllerのところを見ると、speedという項目が追加されています。
このようにpublicを使うとUnityの画面で変数を入力することができるようになります。
speedのところに半角で好きな数字を入れて、再生ボタンを押し、カーソルキーで速度を確かめましょう。
自分でよいと思う速度にしてみましょう。
VisualStudioを起動しなくても、Unityの画面から変数を調整することができるようになりました。
ここまでのファイルは >>こちらからダウンロードしてください。
CameraがPlayerに追従するようにしましょう(1)
まずCameraの位置を調整します。
次にCameraをPlayerのところにドラッグして、チャイルド(下の階層にぶらさげる)にします。
回転しないPlayerにCameraが追従する場合(Third Parson)はこの方法が良いですが、今回はPlayerが回転するので、いったんチャイルドから外します。
CameraとPlayerのTransformの値を元にもどします。
CameraがPlayerに追従するようにしましょう(2)
MainCameraにスクリプトをアタッチ(設定)しましょう。
HierarchyからMainCameraを選択し、InspectorウィンドウのAdd ComponentからNew Scriptを選びます。
ScriptにCameraControllerと名前をつけてCreate and Addをクリックしましょう。
ProjectウィンドウでCameraController.csファイルをScriptsフォルダに入れます。
CameraController.csをVisual Studioで開いて、チュートリアルを参考にしながら、スクリプトを書きましょう。
スクリプトを保存したら、Main Cameraを選択し、InspectorのCameraControllerに表示されたPlayerの項目にHierarchyウィンドウのPlayerをドラッグ&ドロップします。
Unityの画面で再生ボタンを押し、カーソルキーでPlayerを動かしてみましょう。
うまくカメラが追従したら成功です!
メニューのFile>SaveでSceneを保存しておきましょう。
Playerにカメラが追従するところまで進みました。
ここまでのファイルは、>>こちらからダウンロードできます。
Playerが無事カーソルでコントロールできるようになったと思います。
Setting up the Play Area を進めていきましょう。
Playerが落ちないように周りに壁を作りましょう(1)
メニューのGameObject > Create Emptyを選びます。Emptyは座標のみもつ空のオブジェクトです。
このオブジェクトにWallsと名前を付けます。Inspectorのtransformでリセットして原点にしておきます。
Playerが落ちないように周りに壁を作りましょう(2)
メニューのGameObject > 3DObject > Cubeを選択し、HierarchyウィンドウでWestWallと名前を付けます。
先ほど作成したWallsにWestWallをドラッグ&ドロップして、Wallsのチャイルドにします。
InspectorウィンドウのTransformからPosionとScaleを変更します。
Playerが落ちないように周りに壁を作りましょう(3)
WestWallをDuplicate(複製)して、別の壁を作成しましょう。
4つ壁が出来上がったら、Playモードで動作確認をします。
うまくいったらSceneファイルを保存しましょう。
ここまでのファイルは、>>こちらからダウンロードできます。
>>01. Creating Collectable Objects
自律的に回転するPick Up Objectを作成しましょう。
HierarchyのCreateあるいはメニューのGameObjectから3DObjectのCubeを選びます。
Cubeが作成できたら、PickUpに名前を変更します。
ここではPlayerは使わないので、みえなくしておきましょう。PlayerのInspectorウィンドウからPlayerのチェックを外すとObjectは存在しますがみえなくなります。
PickUpを少し魅力あるアイテムにしましょう。浮かせて傾きを付けます。
PickUpに新しくスクリプトを書きましょう。まずPickUpを選択して、Add Comprnent から Newscriptを選びます。
Rotatorと名前を付けましょう。
Project ウィンドウでRotatorをScriptsフォルダにドラッグして入れます。
PickUpオブジェクトが回転するC#スクリプトをVisualStudioなどのエディタで書いていきましょう。
サンプルコードは>>01. Creating Collectable Objectsのページの下にありますので、参考にしてください。
ここで使う大事なスクリプトtransformについて、>>公式サイトのドキュメントをみてみましょう。
アイテムとなるPickupオブジェクトが回転するC#スクリプトを記述しました。
ここまでのファイルは、>>こちらからダウンロードできます。
これからPickupオブジェクトを複製していきます。
ゲームのファイルサイズが重くならないように、インスタンスという考え方で複製をしましょう。
チュートリアルのムービーを引き続きみていきましょう。
インスタンスは、忍者の分身の術のようなイメージです。元の忍者は一人なのに、複製されて大勢にみえる…という感じでしょうか。
Unityでインスタンスを作成するには、まずPrefabsというフォルダをProjectウィンドウに作成し、そこにPickupを入れます。
PickupオブジェクトがPrefabになり、インスタンスの性質を持つと、HierarchyウィンドウのPickupの文字が青い色になります。
Pickupオブジェクトを増やしていきましょう。
今度はHieratchyウィンドウのCreateからCreateEmptyを選択し、GameObjectを作成します。
GameObjectは座標のみもつ空のオブジェクトです。リセットして、座標が原点になるようにしましょう。
ここにPicupをチャイルドにします。ドラッグ&ドロップでGameObjectに重ねると、チャイルドになります。
GameObjectの名前をPickUpsに変更しましょう。
画面をトップビューに変更しましょう。右上のビューアイコンからYをクリックします。
Pickupオブジェクトを選択し、Globalモードに切り替えましょう。
こうするとトップビューで移動したときに高さが揃います。
Pickupオブジェクトを複製しましょう。選択し、メニューのEdit > Duplicateを選びます。
または、ショートカットキーのCtrl + Dでもよいでしょう。複製したら、青い矢印(Z軸)と赤い矢印(X軸)移動しておきましょう。
全部で12個のPickupオブジェクトを配置します。
Pickupオブジェクトを12個レイアウトしたところまでのファイルは、>>こちらからダウンロードください。
Pickupオブジェクトに色を付けましょう。
まず色を先に作成します。ProjectウィンドウのMaterialのBackgroundをDuplicateして使いましょう。
名前をPickupに変えて、Albedoの項目から好きな色を選びます。
PrefabsのPickupをダブルクリックしてウィンドウを開きます。
Pickup単体にドラッグ&ドロップで色を付けましょう。
Prefabsはインスタンスの性質がありますので、元のオブジェクトに色を付けるとすべてに変更が反映されます。
Pickupオブジェクトをアイテムとして集めましょう。
Playerを表示しましょう。
HierarchyからPlayerを選択し、InspecterウィンドウからPlayerの左のボックスにチェックを入れると表示されるようになります。
PlayerにはSphere Colliderという当たり判定がすでに付いています。
このSphereColliderについて、調べてみましょう。
Unityの公式ページから上部のLearnをクリックして、下のDocumentationを選びます。
画像を参考にサーチしましょう。
Sphere Colliderのページが開いたら、スクロールして下のMessageの項目の OnTriggerEnter を調べてみましょう。
PlayerController.csを開きましょう。
Pickupオブジェクトを集めるのに、当たり判定で触れると壊れるという以下スクリプトを追加します。
void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
}
ここでGameObjectについて、先ほどのSphere Colliderと同じようにして調べてみましょう。
methodを使って、色々な性質を与えることができます。
ここでは、CompareTagを使って、タグが付いているオブジェクトについて壊すようにしてみましょう。
先ほどのPlayerContoroller.csを画像のようにEditerを使って修正します。
最初に入れたDestroyの行は削除し、SetActiveを使うことにしましょう。
Pick Upというタグ(印)が付いていれば、SetActiveをfalseにします。falseにするとInspecteウィンドウのPickUpオブジェクトのチェックが外れて、非表示になります。
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Pick Up"))
{ }
other.gameObject.SetActive(false);
}
Unityの画面でテストしましょう。
PrefabsのPickupオブジェクトをダブルクリックしてウィンドウを開きます。
画面のように新しいタグを付けていきましょう。
Unityの再生ボタンを押して、動作確認しましょう。PlayerがPickupオブジェクトに触れても、当たり判定でバウンドするだけで、まだ消えません。Pickupオブジェクトのどれかを選び、InspecterウィンドウのMesh Rendererのチェックを外します。当たり判定領域のみ表示されました。
Pickupオブジェクトは常に回転しているダイナミック(動的な)オブジェクトと呼ばれます。これは壁や床などのスタティック(静的な)と異なり、当たり判定領域が常に変化しているため、別の方法で対処する必要があります。
そこでPrefabsのPickupオブジェクトをダブルクリックしてください。InspecterウィンドウでBox ColliderのIs Triggerにチェックを入れると、動的オブジェクトもうまく動作するようになります。
再生ボタンを押して動作チェックをしてみましょう。
このままでも良いのですが、PickupオブジェクトがRigidbodyの性質を持っていると様々な動きに対応することができます。
ProjectウィンドウのPrefabsのPickupオブジェクトをダブルクリックしてInspectorを開きましょう。Add compornent からPhysics からRigidbodyの性質を与えて、画像のようにUse Gravityとis kinematicにチェックをいれておくとうまく動作します。
ここまで、PickUpオブジェクトにTagで名前を付けて、Playerが触れると消える…アイテムを取得するというところまで進みました。
ここまでのファイルは、>>こちらからダウンロードできます。
取得したPickupオブジェクトをカウントしてディスプレイに表示させましょう。
PlayerController.csのファイルをVisual Studioで開きましょう。
private Rigidbody rb; の下に、
private int count; と入力します。
int は、整数を扱うという意味です。count はその名前の変数です。変数は入れ物のようなもので、色々な数字や文字列を入れることができますが、ここでは intを使っているので、整数のみ入れられるということになります。
最初は count は0なので、添付画像のように記述します。
count = 0;
次に、Pickupオブジェクトをひとつ取得したら、countに1が足されるスクリプトを加えましょう。
count + 1;
ここで PlayerControllerをいったん保存し、Unityに戻りましょう。
count に代入された数字がディスプレイに表示されるようにしましょう。
UIツールが用意されているのでそれを利用しましょう。
HierarchyのcreateからUI > Textを選びます。
名前をTextからCount Textと変えておきましょう。
count text を Inspector の Rect Transform でリセットしておきましょう。
リセットすると、count text の文字がゲーム再生画面に表示されるようになります。
文字色をホワイトにし、フォントもやや大きくしておきましょう。
Inspector の Text(Script)に Count Text と入力しておきます。
Count Textを画面の左上にレイアウトしましょう。ここでは、Rect Transform の Anchor Presetをクリックしましょう。
Shift + Altを押しながら、でPresetの左上をクリックし、Count Textを左上にレイアウトします。
Count Textを画面よりやや内側にくるようにRect Transformで調整しましょう。
PlayerController.cs に UnityのUIシステムを使うことを宣言しておきます。
using UnityEngine.UI; と書き加えましょう。
文字をディスプレイに表示するために、文字列を入れる変数を用意しましょう。
Textでは、変数のcountTextを文字列を入れるものと定義しています。
取得したPickUpオブジェクトの数を文字列に変えるスクリプトを書きましょう。
ここではひとまず同じスクリプトを2か所で使っています。
count.ToString() は、countに代入された数字を文字列に変換するというスクリプトです。
同じスクリプトを2か所で使っても間違いではないのですが、こうした時にファンクション(関数)としてひとまとめにしておくとより良いです。ここではSetCountText()という関数を定義してみましょう。
void SetCountText()
{
countText.text = "Count:" + count.ToString();
}
ディスプレイ表示のCount TextとスクリプトのCount Textを関係付け(紐付け)ましょう。
Playerを選択して、Inspectorに表示されているCount Textの項目にCanvasのCount Textをドラッグ&ドロップします。
テストしてみましょう!PickUpオブジェクトを取得すると左上のCountが増えていきましたか?
ここまでのファイルは、>>こちらからダウンロードできます。
クリアした時に文字が表示されるようにしましょう。
まず表示される文字の仕組みを作成します。
先ほどのCount Textと同じようにディスプレイの表示(UI)を準備します。
PlayerController.csにスクリプトを加えましょう。
そして、PlayerControllerのInspectorに表示されたwinTextの項目に、CANVASのUIのWin Textをドラッグ&ドロップして関係づけます。
テストして確認しましょう。(テスティングと呼びます。)
チュートリアルはこれで完成です!
ここまでのファイルは、>>こちらからダウンロードできます。