夜更かし工房

稼げるクリエーターになりたい方へ有益な情報をお届け!

【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 5. Creating Collectable Objects】

今回のチュートリアルでは、Player ゲームオブジェクトが集めるゲームオブジェクトを作成します。

Cube ゲームオブジェクトを作成して PickUp に名前を変更します。Transform コンポーネントを RESET して原点に合わせます。

f:id:nightowlgames0314:20180911215215p:plain

Scene ビューカメラのフォーカスを PickUp ゲームオブジェクトに合わせます。

f:id:nightowlgames0314:20180911215256p:plain

Player ゲームオブジェクトと PickUp オブジェクトが同じ場所にあり見辛いです。

f:id:nightowlgames0314:20180911215455p:plain

Hierarchy ビューから Player を選択し現れる Inspector ビューの最上部に表示されている Player という名前の横にあるチェックボックスをオフにします。

f:id:nightowlgames0314:20180911215739p:plain

これはゲームオブジェクトのアクティブチェックボックスです。チェックを解除すると Scene 内のゲームオブジェクトが無効になります。これにより、新しい Pickup ゲームオブジェクトのための明確な作業スペースが得られます。

f:id:nightowlgames0314:20180911215752p:plain

Cube は、私たちがこのプロジェクトを開始したときに作成した Player と同じように、地面に埋もれています。Cube もまた、1×1x1 の規則的な形なので、半分持ち上げると Ground に綺麗に乗っている状態になることを我々は知っています。

f:id:nightowlgames0314:20180911220623p:plain

f:id:nightowlgames0314:20180911220654p:plain

この Cube は私たちが拾い集めるオブジェクトになります。効果的であるためには、プレーヤーの注目を集める必要があります。だから、キューブをより魅力的にしましょう。

まず Cube を小さくします。これにより、プレイエリアの上に浮かぶ効果も与えられます。両方とも、このオブジェクトを特別なものとして識別するのに役立ちます。

f:id:nightowlgames0314:20180911221202p:plain

f:id:nightowlgames0314:20180911221219p:plain

まだ充分ではありません。

今度は傾けてみましょう。Cube を45°、45°、45°の角度で回転します。

f:id:nightowlgames0314:20180911221522p:plain

f:id:nightowlgames0314:20180911221612p:plain

良くなってきましたが、まだセクシーではありません。

プレーヤーの注意を引き付けるために必要なもの、それは動きです。Cube を回転させましょう。これを行うには、スクリプトが必要です。PickUp オブジェクトを選択した状態で、Inspector の Add Component ボタンをクリックします。

f:id:nightowlgames0314:20180911222239p:plain

Rotator という名前の新しいスクリプトを作成し、Project ビューで Scripts フォルダに移動して整理します。

f:id:nightowlgames0314:20180911222312p:plain

編集のためにスクリプトを開きます。このスクリプトで Cube を回転させます。まずは必要のないサンプルコードを削除しましょう。ここでは物理法則を使用しないので、FixedUpdate ではなく Update を使うことができます。

f:id:nightowlgames0314:20180911222814p:plain

現在 PickUp オブジェクトの Transform コンポーネントの Rotation の X軸、Y軸、Z軸 を(45, 45, 45)に設定しています。しかしこれらの値は PickUp オブジェクト自身で自動で変わりはしません。私たちはこれらの値をフレームごとに更新したいです。私たちが直接 Transform の Rotation を入力する必要なく回転させたいです。

下記リンクの Transform についてのマニュアルを確認します。

Unity - Scripting API: Transform

Transform には主要な2つの効果があります。

Transrate と Rotate です。

f:id:nightowlgames0314:20180911224227p:plain

Translate 関数は Transform を使ってゲームオブジェクトを移動します。

Rotate 関数は Transform を使ってゲームオブジェクトを回転します。

今回は Rotate 関数を使用します。Rotate 関数にリンクをクリックして詳細を確認します。

Rotate 関数には2通りの記述方法があります。

f:id:nightowlgames0314:20180911225317p:plain

一方は Vector3 を使用し、もう一方は X, Y, Z の値を使用し、どちらの記述方法でもオプション引数として Space を持っています。このレッスンでは方向のためにデフォルトである Vector3 を使用する最も簡単な記述を採用します。

私たちのコードに戻りましょう。

予測変換後、transform が小文字の t で始まるように書かれていることを確認したら、Rotate(new Vector3(15、30、45))と書いてください。

この動きは滑らかでフレームレートに依存しないことも必要です。したがって、vector3 の値に Time.deltaTime を掛ける必要があります。Time.deltaTime で取得できる値は、最後のフレームを完了するのに要した秒数です。

このスクリプトを保存してUnityに戻ります。

プレイモードを再生して PickUp が回転していることを確認して、プレイモードを終了します。

さて、Pickup オブジェクトが動作し始めました。次に、これらをゲームエリアの周りに配置します。しかし、これを行う前に、重要な一歩を踏み出す必要があります。Pickup オブジェクトをプレハブにする必要があります。

プレハブとは、テンプレートまたは、ゲームオブジェクト、親子関係を持つゲームオブジェクトファミリの青写真を含むアセットです。

既存のゲームオブジェクトまたはゲームオブジェクトファミリからプレハブを作成したら、このプレハブを現在のプロジェクトのどのシーンでも使用できます。

Pickup オブジェクトのプレハブを使用すると、シーン内の単一のインスタンスまたはプレハブアセット自体に変更を加えることができ、ゲーム内のすべての Pickup オブジェクトがこれらの変更で更新されます。

最初にプレハブを保持するフォルダを作成しましょう。

私たちはこのフォルダを Scripts フォルダなどと同格に Assets 直下に配置したいと考えています。Project ビューを選択します。もし他の項目やフォルダが選択中になっていて強調表示されている場合は、Project ビューの枠内の何もないスペースをクリックして解除します。Create > Folder を選択し、フォルダの名前は Prefabs に変更します。

f:id:nightowlgames0314:20180911233512p:plain

PickUp ゲームオブジェクトを Hierarchy ビューか Project ビューにドラッグして Prefabs フォルダに置きます。

f:id:nightowlgames0314:20180911233528p:plain

アイテムを Hierarchy から Project ビューにドラッグすると、テンプレート、またはゲームオブジェクトまたはゲームオブジェクトファミリの青写真を含む新しいプレハブアセットが作成されます。

ゲームエリアの周りに拾い集めるためのオブジェクトを散らす前に、PickUp をまとめて保持し、Hierarchy を整理するのに役立つ新しいゲームオブジェクトを作成する必要があります。新しいゲームオブジェクトを作成し、Pickups と名付けます。

f:id:nightowlgames0314:20180911234353p:plain

この親ゲームオブジェクトの位置が原点であることを確認し、Pickup ゲームオブジェクトをドラッグして子にします。

f:id:nightowlgames0314:20180911234533p:plain

ここで、プレイエリアの周りにいくつかの PickUp オブジェクトを広げたいと考えています。まず、親ではなく PickUp ゲームオブジェクトが選択されていることを確認します。

f:id:nightowlgames0314:20180911234747p:plain

次に、シーンビューの右上にある Gizmo のY軸をクリックして、真上から見下ろすトップダウンビューに移動しましょう。

f:id:nightowlgames0314:20180911235005p:plain

f:id:nightowlgames0314:20180911235036p:plain

ゲームエリア全体を見ることができるように少しバックしてみましょう。マウスでスクロールすることでバックが可能です。

PickUp ゲームオブジェクトをつかんで動かすと、望むようにはシーン内を移動しません。Cube が傾いているギズモに対してどのように動いているのか注意してください。私たちが見ているのは、Local モードで移動するゲームオブジェクトです。実際にPickUp ゲームオブジェクトを地面に合わせて移動したいと考えています。

Unity エディタのモードを Global に変更します。

f:id:nightowlgames0314:20180912000315p:plain

Gizmo の方向が Global と Local のときどのように変化するかを見てみましょう。 Global にすると、私たちのゲームオブジェクトを世界のグローバル軸を基準にしてドラッグすることができます。

f:id:nightowlgames0314:20180912000724p:plain

それではゲームのエリアに PickUp ゲームオブジェクトをいくつか置いてみましょう。

私たちの最初に作成した PickUp オブジェクトを掴んで、ゲームエリア内の都合のいい位置に置いてください。私は一番上に私の PickUp オブジェクトを置くつもりです。

PickUp オブジェクトを選択した状態で、Duplicate(複製)します。これは上部メニューバーから Edit > Duplicate を選択するか、ショートカットキー(Mac なら command-D. PC ならcontrol-D)を使用して複製します。複製した2つめの PickUp オブジェクトも適当な場所に移動します。

f:id:nightowlgames0314:20180912001943p:plain

ショートカットキーでさらにいくつか作成しプレイエリアに配置します。

ギズモの中央でX / Z平面を選択することによって、地面またはX / Z平面に平行に移動していることに注意してください。

全部で12個になったらもう充分でしょう。ゲームを再生してみてください。全ての PickUp ゲームオブジェクトがちゃんと回転していますね。

私が PickUp オブジェクトたちに望むことは、背景の壁や Player ゲームオブジェクトよりもはるかに目立つことです。色を変えましょう。これを行うには別の素材が必要です。

簡単にするために、既存の素材を選択して複製するだけです。複製された新しいマテリアルには PickUp と名付けます。

f:id:nightowlgames0314:20180912003041p:plain

Project ビューでマテリアルを選択して、Albedo カラープロパティを黄色に変更します。プレハブの素材を変更することで、プレハブの色を変えることができます。これを行うには2通りの方法があります。

インスタント化されたプレハブの1つだけを変更してから Apply ボタンをクリックすると、変更が同じプレハブから作成された全てに適用されます。Apply ボタンをクリックしなければこの単一のインスタンスの素材だけを変更することになります。
もう1つの方法は、おそらくよりシンプルですが、プレファブアセットの素材を直接変更するだけです。

再生してテストしましょう。良くなりましたね。
次の課題では、PickUp オブジェクトたちを拾い上げて数える方法を学びます。

【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 4. Setting up the Play Area】

それでは、プレイエリアを設定しましょう。

今回作成するプレイエリアは非常に簡単なものです。Player ゲームオブジェクトが端から落ちないようにするために地面の周りに壁を配置して、Player ゲームオブジェクトを動かして集める物体も作成し配置します。

まず画面上部メニューバーから GameObject > Create Empty を選択し Walls と名付けます。Walls は Wall オブジェクトたちの親となるオブジェクトです。Create Empty は Project ビューでの Create > Folder のようなもので、Hierarchy ビューでフォルダを作成するための方法です。作成された GameObject はフォルダとして使用することができます。

f:id:nightowlgames0314:20180910231729p:plain

Walls の位置を原点に合わせます。

f:id:nightowlgames0314:20180910232059p:plain

それでは壁を作っていきます。

まず壁にするためのキューブを作成して West Wall と名付けます。

f:id:nightowlgames0314:20180910234042p:plain

位置を原点に合わしてから Walls の子にします。

f:id:nightowlgames0314:20180910234300p:plain

Scene ビューの焦点を West Wall に合わせてみましょう。West Wall を選択しマウスのカーソルを Scene ビュー上に乗せた状態で F キーを押下します。

f:id:nightowlgames0314:20180910234534p:plain

キューブのサイズをプレイエリアの一片にフィットするように変更する必要があります。West Wall の Transform の Scale を(0.5, 2, 20.5)に変更します。

Move Tool を使って West Wall を動かすだけで Transform の Position を変更することができます。今回は X の値に -10 を入力するとプレイエリアの端に綺麗に配置できます。

f:id:nightowlgames0314:20180910235314p:plain

f:id:nightowlgames0314:20180910235330p:plain

次の壁を作成するために新しいキューブを作成しようとした場合、サイズの再調整が必要になってしまいます。West Wall はすでに最適なサイズになっているので West Wall を複製しましょう。West Wall を選択した状態で上部メニューバーから Edit > Duplicate を選択して複製して East Wall と名付けます。

f:id:nightowlgames0314:20180910235949p:plain

f:id:nightowlgames0314:20180911000117p:plain

East Wall を適切な配置にするために Transform の Position X に 10 を入力します。

f:id:nightowlgames0314:20180911000332p:plain

今度は East Wall を複製し North Wall と名付けます。Xの値を0に設定してプレイエリアの中央に配置します。

f:id:nightowlgames0314:20180911000603p:plain

適切な配置にするために、ここから2通りの方法が考えられます。

Transform の Rotation Y の値で回転させるか、これは単純な直方体なので Scale を(20.5, 2, 0.5)に設定することで North Wall として正しい向きになります。

f:id:nightowlgames0314:20180911000926p:plain

Move Tool でドラッグするか、単純に Transform の Position Z に 10 に設定して正しい配置にします。

f:id:nightowlgames0314:20180911001116p:plain

North Wall を複製し South Wall と名付けて Position Z に -10 を設定して正しく配置します。

f:id:nightowlgames0314:20180911001306p:plain

プレイモードに入りテストします。壁は正常に動作して Player ゲームオブジェクトが端から落ちないようになりました。テストは細かく頻繁に行ってください。

プレイモードを終了します。

f:id:nightowlgames0314:20180911001804p:plain

Unity エディタの左上部にある Global ボタンをクリックすると Global とLocal で切り替わることが分かります。違いを確認するために Hierarchy ビューで Player ゲームオブジェクトを選択してゲームを再生してみましょう。Grobal のときと Local のときで Scene ビューの表示される挙動が異なりますね。Local モードでは Transform の回転も見ることができます。

再生モードを終了します。

次の課題では、Player が拾い集めるゲームオブジェクトを作成します。

【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 3. Moving the Camera】

Main Camera は移動せず固定されていて、現在の位置からでは Player ゲームオブジェクトが良く見えません。

f:id:nightowlgames0314:20180910204924p:plain

Main Camera を Player ゲームオブジェクトに結びつける必要があります。

最初に Main Camera の位置を設定しましょう。高さを 10 持ち上げて、45度傾けます。

f:id:nightowlgames0314:20180910205322p:plain

f:id:nightowlgames0314:20180910205339p:plain

次に Main Camera ゲームオブジェクトを Player ゲームオブジェクトの子にします。Project ビューの Main Camera ゲームオブジェクトを Player ゲームオブジェクトにドラッグしてください。

f:id:nightowlgames0314:20180910210807p:plain

Main Camera を Player の子にすることは第三者視点のゲームの典型的な設定です。第三者視点のゲームとはプレイアブルキャラ(操作キャラ)が映るゲームのことであり、プレイアブルキャラの手や銃だけが映るゲームは主観視点のゲームと呼ばれます。私たちが Player の位置を移動すれば、子である Main Camera の位置も一緒に移動します。Player が回転すれば、カメラも回転します。

これを Player と Main Camera のゲームオブジェクトの両方を見ることができる位置から見てみましょう。Scene ビューを下図のような状態にして、Player の Transform コンポーネントの各値を操作して Player を移動したり回転させると Main Camera が追従することを確認します。

f:id:nightowlgames0314:20180910211511p:plain

さて Player の 位置を元に戻してテストしてみましょう。ゲームを再生して、動くための上向きの矢印を押し続けると何が起きるでしょうか。

Main Camera ゲームオブジェクトの Transform の値は全く変化していませんが、Player ゲームオブジェクの Transform の値はめまぐるしく変化し、Player ゲームオブジェクトが狂ったように回転しているので、カメラの視点はそれと共に回転します。

f:id:nightowlgames0314:20180910212903p:plain

f:id:nightowlgames0314:20180910212914p:plain

再生モードを終了します。

通常の第三者視点のゲームとは異なり、私たちの Player ゲームオブジェクトは1つの軸だけでなく3つの軸で回転しています。

三者視点のゲームの典型的な設定では、プレーヤーのゲームオブジェクトの子としてのカメラは、その直近の親に対する相対位置に常にあります。この相対位置というのは、ゲーム内の親の Transform コンポーネントの値を、子の Transform コンポーネント の値で修正または相殺した値です。

狂ったように全方位回転する Player では、子に Main Camera を配置するには好ましくないため Main Camera を切り離しましょう。

f:id:nightowlgames0314:20180910214555p:plain

基準となる被写体からの相対的なカメラの位置は Player と Main Camera の差です。次に試す方法では、Main Camera を Player の子に設定するのではなく、スクリプトで両者を関連付けます。Hierarch ビューで Main Camera を選択した状態で Add Component ボタンをクリックして New Script を選択します。

f:id:nightowlgames0314:20180910215641p:plain

CameraController とスクリプトを名付けて、Create and Addをクリックするか Return キーか Enter キーを押下して選択を確定します。この方法でスクリプトを作成した場合には、Project ビューの Assets フォルダ直下に生成されてしまっていることに注意します。ドラッグして Scripts フォルダ直下に移動しましょう。

CameraController スクリプトを選択した状態で Insupector ビューから Open ボタンをクリックしてスクリプトをエディタで開きます。

2つの変数を用意しましょう。player ゲームオブジェクトを参照するための変数と、相対位置を保存するための変数です。

f:id:nightowlgames0314:20180910220714p:plain

相対位置を保持する offset 変数の値の設定はこのスクリプト内で完結できるので private で宣言します。offset 値には現在の Transform コンポーネントに設定されている位置情報を代入します。

f:id:nightowlgames0314:20180910221253p:plain

そして Player ゲームオブジェクトの Transform コンポーネントで設定されている位置情報で減算して、Main Camera と Player の間の差分を見つけます。

Start 関数内で offset 変数に Main Camera の Transform コンポーネントの Position の値から Player の Transform コンポーネントの Postion の値を引いたものを代入します。

f:id:nightowlgames0314:20180910222036p:plain

Update 関数内で毎フレーム、Main Camera の Transform Position に Player の Transform Position に offset を加えた値を代入します。

f:id:nightowlgames0314:20180910222657p:plain

これは、キーボード上のコントローラーを使用してプレイヤーを移動すると、各フレームがカメラに描画される前に、Main Camera が Player に揃えられた新しい位置に移動されて描画することを意味します。

ちょうど Player がゲームボードの周りを転がっていない場合に、そのオブジェクトの子に設定した時と同じような挙動になります。

ただしこのコードは Update 関数内が適切な場所ではありません。

Update 関数はすべてのフレームで実行され、各フレームが更新されるたびに、Player ゲームオブジェクトの位置を追跡し、Main Camera の位置を設定します。

しかしながら、追従するカメラや、連続するアニメーションなど、フレームの最後の状態を収集するためには、LateUpdate 関数を使用することがベストです。

LateUpdate 関数は Update 関数と同様に毎フレーム呼ばれますが、すべてのアイテムが更新された後に実行されることが保証されています。offset への代入は必ず Player の移動処理の後に実行して欲しいですよね。

スクリプトを保存して Unity に戻ります。

まず、Player ゲームオブジェクトを CameraController コンポーネントの Player スロットにドラッグすることによって、Player ゲームオブジェクトへの参照を作成する必要があります。

f:id:nightowlgames0314:20180910224918p:plain

ゲームを再生して私たちが望む通りの挙動になっていることを確認しましょう。カメラは回転することなく回転するボールに追従します。 ボールが端を越えて落ちていっても追従します。

次の課題では、基本的なプレイエリアを設定し、拾うことができる特別なオブジェクトを作成して配置します。

 

【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 2. Moving the Player】

このチュートリアルではプレイヤーとなるゲームオブジェクトを動かしてみます。最初に私たちがこのプレイヤーゲームオブジェクトにどのような挙動を望むのかについて考えてみましょう。

私たちはこの Sphere がゲームエリアを転がり回り、ゲームエリアの端まで行ったときには、落ちないように壁にぶつかって地面の上で停止し、また宙に飛んでいったりもしないことを望んでいます。そして、収集可能なゲームオブジェクトにぶつかったときにはそれを拾うことも必要です。これには Physics (物理法則)が必要です。

Physics を使うためには、ゲームオブジェクトに Rigidbody コンポーネントを追加する必要があります。新しいコンポーネントを追加するためにはまず最初にコンポーネントを追加したい対象であるゲームオブジェクトを選択する必要があります。今回の場合では Hierarchy ウィンドウから Player ゲームオブジェクトを選択します。

f:id:nightowlgames0314:20180909194632p:plain

ゲームオブジェクトにコンポーネントを追加する方法は2通りあります。

1つめは、上部メニューバーから Component > Physics > Rigidbody を選択する方法です。

f:id:nightowlgames0314:20180909194805p:plain

2つめは、Inspector ウィンドウの最下部にある「Add Component」ボタンをクリックして Physics > Rigidbody を選択する方法です。どちらの方法でも選択した Rigidbody コンポーネントが選択した Player ゲームオブジェクトに追加されます。

f:id:nightowlgames0314:20180909195241p:plain

もし Inspector ウィンドウに表示されるコンポーネントの並び順を組み替えたい場合は、各コンポーネントの右上にある歯車マークをクリックして、「Move Up」「Move Down」のいずれかをクリックしてください。

f:id:nightowlgames0314:20180909200004p:plain

コンポーネントの並び順を組み替えることは、私たちのゲームのパフォーマンスには影響しません。しかしながら、ゲームオブジェクト上のコンポーネントに一貫した順序を持たせることは、Project ウィンドウと Hierarchy ウィンドウが整理された状態を維持する、あるいはより良い状態にし続けることで、私たちの開発速度を向上させるために役立ちます。

コンポーネントの名前の位置のバーをクリックすることでコンポーネントビューを折りたたんだり展開したりすることができます。

f:id:nightowlgames0314:20180909202059p:plain

コンポーネントビューの折りたたみと展開を行うたびに、 Scene ビューでそのコンポーネントに関連する Gizmos(位置や向きを示すアイコン)も切り替わることに注意してください。下図のように、Sphere Colider を折り畳むと、Scene ビュー上で Sphere Colider に関連する Gizmos が消失していることが確認できますね。

f:id:nightowlgames0314:20180909202515p:plain

f:id:nightowlgames0314:20180909202528p:plain

今、私たちは Player ゲームオブジェクトが私たちの操作によって動くことを望んでいます。これを行うには、プレイヤーからキーボードを介して入力を得る必要があり、その入力を Player ゲームオブジェクトに適用して、シーン内の球を移動させる必要があります。

これは、Player ゲームオブジェクトに追加するスクリプトを使用して実現します。

まず最初に Projcet ビューに、私たちのスクリプトを保存しておくためのフォルダを作成します。Project ビューの左上部にある Create ボタンをクリックして Folder を選択し作成したのちフォルダ名を Scripts に書き換えます。

f:id:nightowlgames0314:20180909203627p:plain

次は C# で記述された新しいスクリプトを作成します。

新しいスクリプトを作成する方法は下図の通り2通りあります。

f:id:nightowlgames0314:20180909204101p:plain

f:id:nightowlgames0314:20180909204223p:plain

しかし今回の場合、もっと効率的な方法があります。

まず Hierarchy ビューから Player ゲームオブジェクトを選択し、Inspector ビューから Add Component ボタンをクリックして表示されるメニューから New Script を選択します。これはスクリプトの作成と、ゲームオブジェクトへの追加の両方を1回の操作のみで実行してくれます。

f:id:nightowlgames0314:20180909204702p:plain

まずスクリプト名を入力し「Create and Add」ボタンをクリックするか Enter キーもしくは Return キーを押下します。今回はスクリプトを PlayerController と名付けます。チュートリアル動画では C#JavaScript かをここで選択しているのですが、Unity 2017.1b10 で JavaScript が廃止されたため現在の最新バージョンの Unity では言語の選択肢はありません。

f:id:nightowlgames0314:20180909205016p:plain

Unity は PlayerController スクリプトを作成し、コンパイル(人間が書いたコードを機会が理解できる言葉に変換すること)し、選択されていた Player ゲームオブジェクトに追加しました。ただしこの方法で作成したスクリプトは Project ビューの Assets フォルダの直下に配置されることに注意する必要があります。そのため Projcet ビューを整理するために PlayerController スクリプトをドラッグで Scripts フォルダの直下に移動する必要があります。

f:id:nightowlgames0314:20180909210535p:plain

Project ビューでスクリプトを選択している時 Inspector ビューにはスクリプトのプレビューが表示されています。しかしこのテキストをここで編集することはできません。

f:id:nightowlgames0314:20180909210924p:plain

スクリプトを開いてみましょう。これにはいくつかの方法があります。

スクリプトを使ってゲームオブジェクトを検査するときには、Inspector ビューに表示されるコンポーネント(自分で作成した PlayerController スクリプトコンポーネントの一種です)ビューの右上にある歯車マークをクリックして Edit Script を選択します。

f:id:nightowlgames0314:20180909211659p:plain

他の方法としては Project ビューでスクリプトを選択した状態で、ダブルクリックもしくは Inspector ビューに表示されている Open ボタンをクリックする方法です。

f:id:nightowlgames0314:20180909212246p:plain

これにより好きなエディタでスクリプトを開くことが可能です。

f:id:nightowlgames0314:20180909212329p:plain

まず提供されているサンプルコードを削除しましょう。

f:id:nightowlgames0314:20180909215213p:plain

そして考えます。私たちはこのスクリプトに何をさせたいのか。私たちはプレイヤーからの入力を毎フレーム確認して、入力が検知されとき Player ゲームオブジェクトの移動として毎フレーム適用させたい。

私たちはどこで入力を検知して、適用させれば良いのか。2つの選択肢があります。 Update 関数と FixedUpdate 関数です。

Update 関数は毎フレームが描画される前に呼び出されます。そしてゲームのコードのほとんどはこの Update 関数内で実行されることになります。

FixedUpdate 関数は、物理計算を実行する直前に呼び出されます。そしてゲームの物理学に関するコードはこの FixedUpdate 関数内で実行されることになります。

私たちは力を Rigidbody に適用することでボールを動かします。これは物理学です。だから私たちはコードを FixedUpdate 関数内に記述します。

f:id:nightowlgames0314:20180909225906p:plain

私たちが書くべきコードは何でしょうか。私たちはプレイヤーからの入力が必要ですが、それはどうすれば実現するのでしょうか。

MonoDevelop には Unity の API を探すためのショートカットがあります…のようにチュートリアル動画では MonoDevelop エディタから Unity の API を参照するためのショートカットキーについての解説がされているのですが、 現在 Unity で使用されるエディタは MonoDevelop ではなく Visual Studio に移行しているためここの解説は割愛します。ここで表示されるはずだった API については下記リンクにて確認することができます。API とは、ある機能を共有するための仕組みのことです。よく使う機能が API として用意されていればわざわざ一からプログラムを組む必要が無くなります。

Unity スクリプトリファレンス

今回使用する API は下記リンクで紹介されている Input クラスになります。

Input - Unity スクリプトリファレンス

f:id:nightowlgames0314:20180909231331p:plain

Description を読むことで、Input クラスの使い方が理解できます。

Input クラスを使用することで、Input Manager で設定された軸を読み込み、モバイルデバイスのマルチタッチおよび加速度に関するデータにアクセスすることが可能です。今回はモバイルデバイスを含む全てのプラットフォームで、プレイヤーからの入力を取得します。

Description の下の方までスクロールしてみましょう。Input クラスが保持する変数と関数のリストがあります。

f:id:nightowlgames0314:20180909231859p:plain

f:id:nightowlgames0314:20180909231918p:plain

Input クラスの変数は情報を保持します。例えば touchCount 変数は、そのフレーム内で同時にタップしている指の本数を保持しています。gyro 変数は、デバイスの傾きの角度を保持しています。

f:id:nightowlgames0314:20180909232206p:plain

f:id:nightowlgames0314:20180909232632p:plain

 Input クラスの関数は何をするのでしょうか。私たちのコードの中で Input.GetAxis 関数を記述したらどうなるのでしょう。GetAxis をクリックしてみましょう。

f:id:nightowlgames0314:20180909232915p:plain

Input.GetAxis について見てみましょう。

f:id:nightowlgames0314:20180909233009p:plain

このページに含まれているものは、関数の記述方法、関数の説明、使用方法を見せるためのコードの断片です。Input Manager と Input.GetAxis の詳細については、下記リンク先のレッスンを参照してください。

GetAxis - Unity

今回私たちは、上図で紹介されているコードの断片と非常によく似た記述で Input.GetAxis を使用します。私たちのコードに戻ってコードを記述しましょう。

f:id:nightowlgames0314:20180909234224p:plain

これは、キーボードからの入力をプレーヤーから取得します。

float 型で宣言された変数である moveHorizontal と moveVertical はキーボード上のキーで制御される水平軸と垂直軸からの入力を記録します。

私たちの Player ゲームオブジェクトは Rigidbody コンポーネントを使用し、物理エンジンとやりとりします。プレイヤーからの入力を使用して、Rigidbody に力を加え Player ゲームオブジェクトをシーン内で移動させます。Rigidbody に力を加える方法の詳細については、ドキュメントをチェックしてみましょう。 

Unity - Scripting API: Rigidbody

Player ゲームオブジェクトに力を加えたい場合、何かする必要があります。それでは Rigidbody クラスで使用可能な関数を見てみましょう。

私たちが望むものを見つけるまで説明を読み、今回はAddForceを選択しましょう。

f:id:nightowlgames0314:20180909235620p:plain

これにより Rigidbody コンポーネントに力が加えられ、移動を開始します。リンクをクリックして AddForce 関数の詳細ページを確認します。

Unity - Scripting API: Rigidbody.AddForce

このページでは関数の記述方法を確認でき、使用時には Vector3 型の変数と、Rigidbody に力を加えるための ForceMode の指定が引数として必要であることがわかります。

f:id:nightowlgames0314:20180910000146p:plain

Vector3 とは何でしょうか。Vector3 についてより詳細を学習したい場合は下記リンク先を参照してください。

ベクトル演算 - Unity

f:id:nightowlgames0314:20180910000804p:plain

しかし簡単に言えば、Vector3 は1つの変数内に3つの小数値を保持しています。これにより、X、Y、Z軸のそれぞれに力の値を必要とする3D空間の力のようなものに値を使用したり移動したりすることが容易になります。または、X、Y、Z軸のそれぞれに値を必要とする回転を記述することもできます。全てのドキュメントページはリンクされています。Vector3 をクリックすると、Vector3 のドキュメントページが表示されます。ForceMode、MonoBehaviour、RigidBodyについても同様です。

f:id:nightowlgames0314:20180910001534p:plain

Description の下にあるコードの断片は実際の関数の使用ケースを紹介しています。

AddForce 関数の最初の記述方法の下にある2番目の記述方法に注意してください。Description の内容は一緒です。しかしこの場合は、Vector3 または3つの浮動小数点値を使用して AddForce 関数を使用することができます。

 

f:id:nightowlgames0314:20180910001904p:plain

次に学習するのは、ゲームオブジェクトが様々なコンポーネントを保持したり、参照したりするための方法です。
私たちは PlayerController というスクリプトを書いています。これは私たちのゲームオブジェクトにスクリプトコンポーネントとして追加されています。このスクリプトから AddForce 関数のために Rigidbody コンポーネントを使う必要があります。私たちは PlayerController コンポーネントから Rigidbody コンポーネントにアクセスする必要があります。これを行うにはいくつかの方法があります。しかし今回は、同じゲームオブジェクト上の別のコンポーネントにアクセスすることができる主な方法のうちの1つだけを紹介します。

f:id:nightowlgames0314:20180910003131p:plain

スクリプトで Rigidbody コンポーネントへの参照を保持する変数を作成し、この参照を Start 関数で設定します。リファレンスに記述されているコードの断片を見てみましょう。rb と名付けられた Rigidbody 型の変数が public で宣言されています。これは私たちがアクセスしたい Rigidbody コンポーネントへの参照を保持するための変数です。

f:id:nightowlgames0314:20180910004155p:plain

Start 関数内で GetComponent<Rigidbody> という記述によって rb と名付けられた変数に参照がセットされています。この記述は、このスプリクトが追加されているゲームオブジェクトに追加されている Rigidbody が1つだけなら、その参照を見つけて返します。Start 関数内のすべてのコードは、スクリプトがアクティブである最初のフレームで呼び出されます。これは多くの場合、ゲームの最初のフレームです。

最後に FixedUpdate 関数内で、ゲームオブジェクトに取り付けられた Rigidbody コンポーネントに、rb という名称の変数を介してアクセスして rb.AddForce 関数を使用します。

f:id:nightowlgames0314:20180910005313p:plain

したがって、私たちのスクリプトでは、参照を保持する変数を作成するために専用の Rigidbody rbを記述する必要があります。Start 関数には、rb = GetComponent <Rigidbody>と書く必要があります。FixedUpdate 関数では、Rigidbody.AddForce の最も単純な書き方を使用しましょう。単に Vector3 を使用するもので、私たちのコードから ForceMode を省略して ForceMode をデフォルトのままにします。

つまり私たちのコードには rb.AddForce(Vector3)だけを書けば良いです。

f:id:nightowlgames0314:20180910010408p:plain

2つの浮動小数点値を Vector3 の値にするにはどうしたらいいでしょうか。Movement という新しい Vector3 変数を作成しましょう。これは、X、Y、およびZで構成される新しいベクトル3に等しくなります。X、Y、Zの値は、ボールに追加する力の方向を決定します。

f:id:nightowlgames0314:20180910010835p:plain

X の値は水平を意味する moveHorizontal を代入します。これにより、左右のキーがボールを左または右に動かす力を加えます。

Y の値は高さを意味します。私たちはボールを上下には動かしたくはないので 0 を入力します。

Z の値には moveVertical を代入します。

f:id:nightowlgames0314:20180910011421p:plain

今度は、rv.AddForce(動き)としてVector3の値であるMovementを使用します。

スクリプトをセーブして Unity に戻ります。Unity のフッタやコンソールにエラーの表示がないかどうかチェックします。 

Play ゲームオブジェクトに Rigidbody コンポーネントを追加しておきます。

私たちが書いたスクリプトを試してみましょう。

ゲームを再生すると、Input Manager のキー設定を使用して、ボールがシーン内を移動します。しかしとても遅いです。これは遊ぶには遅すぎますが、基本的なコンセプトの学習としては100%です。

テストをやめるために Play モードを離れてください。

私たちのコードに戻り、ボールの速度をコントロールするツールを作ってみましょう。私たちは、私たちの動きに何らかの値を掛ける必要があります。

その値をスクリプトに入力するだけでも済みますが、変更や修正が必要な場合はいちいちスクリプトエディタに戻り、スクリプトの値を変更してから再コンパイルする必要があります。これには時間がかかります。

解決策は、スクリプトに public 変数を作成することです。speed と名付けられた public 変数を作成します。スクリプトに public 変数を作成することで、この変数は Inspector ビューに編集可能なプロパティとして表示されます。public 変数を使用すると、エディタですべての変更を行うことができます。

Movement に speed を掛けます。

f:id:nightowlgames0314:20180910013558p:plain

エディタの中から動きの値を制御できるようになりました。これらの変更を保存してUnityに戻りましょう。Unity エディタに戻ると、Player Controller スクリプトに speed プロパティが追加されているのがわかります。

f:id:nightowlgames0314:20180910013741p:plain

Speed の値を100にしてゲームを再生してみましょう。今度は動きが早すぎましたね。しかし、修正を加えるのも速いです。 再生モードを終了し、値を10に変更して再生してみましょう。良くなりましたね。

おめでとう。私たちは自分のキャラクターを動かせるようになりました。次の課題ではカメラの移動方法について学習しましょう。

 

 

 

【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 1. Setting up the Game】

このチュートリアルでは玉転がしゲーム用の Unity プロジェクトの作成をした後、地面となるゲームボードと、プレイヤーが操作する玉の作成を行います。

まずは新しいプロジェクトを作成してみましょう。

f:id:nightowlgames0314:20180909143850p:plain

Unity を起動して画面右上の「New」を選択するとプロジェクトの作成画面が開きます。下記に従って各項目を入力し終えたら「Create project」をクリックしてプロジェクトを作成します。

【Project name】

プロジェクトの名前を入力します。今回は「Roll a Ball」と名付けましょう。

【Location】

プロジェクトの保存場所です。チュートリアル動画では「/Users/ユーザ名/Desktop」に保存していますがデスクトップが散らかるのでデフォルトのまま「/Users/ユーザ名」に保存して良いです。もちろんパソコンに慣れている方で、保存したい場所が決まっているのでしたらどこに保存していただいても問題ありません。

【Organization】

チュートリアル動画ではこの入力項目はありません。デフォルトでは Unity アカウント作成時のアカウント名が表示されているはずなので、そのままで問題ありません。

【Template】

2Dゲームと3Dゲームのどちらを作成するかについて、プロジェクトを作成するこの段階で決めます。今回は3Dゲームを作成するため3Dを選択します。

f:id:nightowlgames0314:20180909145956p:plain

プロジェクトが作成されました。初期状態を確認しましょう。まずは Project ウィンドウを確認してみます。Project ウィンドウとは、ゲーム内で使用される全ての素材のリストが表示される場所です。現在 Assets / Scenes / SampleScene が存在しています。Scene とはゲームにおけるシーンのことです。ケースバイケースではありますが、たとえばゲームを起動した直後のタイトルシーンであったり、敵と戦闘するバトルシーンなど、Unity では各シーンごとに Scene を切り分けて作成します。Hierarchy ウィンドウを確認してください。Hierarchy ウィンドウでは現在選択されている Scene に含まれている内容が一覧として表示されます。初期状態では SampleScene が選択されていて Main Camera と Direction Light だけが存在していますね。

あなたのための新しい Scene を作成してみましょう。上部メニューバーから File > New Scene を選択します。

f:id:nightowlgames0314:20180909151333p:plain

Scene を作成するための各設定項目に入力し終えたら「Save」をクリックします。

【Save As】

Scene の名前を入力します。今回は MiniGame と入力します。

【Where】

作成した Scene の保存場所を設定します。デフォルトのまま Assets を指定します。

f:id:nightowlgames0314:20180909151832p:plain

Project ウィンドウを確認すると、左図のように、先ほど指定した通り Assets の直下に MiniGame と名付けられた Scene が作成されていますね。MiniGame を右図のように、ドラッグ&ドロップで Assets / MiniGame ではなく Assets / Scenes / MiniGame に移動します。Scene は Scenes ディレクトリの配下に保存することが好ましい作法です。チュートリアル動画では「_Scenes」と名付けられたディレクトリを作成しその配下に MiniGame を保存しています。このアンダースコアはソートのためにつけられました。これから色々な名前のディレクトリを作成していくと Scenes ディレクトリがどこにあるか探すことが困難になってきます。しかしディレクトリ名の前にアンダースコアをつけることで常に先頭に持ってくることが可能です。

MiniGame シーンをダブルクリックして開いてみましょう。

f:id:nightowlgames0314:20180909152731p:plain

Hierarchy ウィンドウを確認すると現在 MiniGame シーンの内容が表示されています。このシーン内に私たちのゲームを作成します。まずは床となるゲームボードを作成してみましょう。そのために Unity で最初から用意されている3Dモデルである Plane を使用します。Plane の使用方法は2通りあります。

下図の左のように上部メニューバーから GameObject > 3D Object > Plane を選択する方法と、下図の右のように Hierarchy ウィンドウ上部 Create ボタンから Create > 3DObject > Plane を選択する方法です。

f:id:nightowlgames0314:20180909153654p:plain

下図のように Plane ゲームオブジェクトを作成します。

f:id:nightowlgames0314:20180909154051p:plain

Plane ゲームオブジェクトの名前を Ground ゲームオブジェクトに変更します。名前を変更する方法は2通りあります。Hierarchy ウィンドウで Plane 選択した状態で Enter キーもしくは Return キーを押下する方法と、Hierarchy ウィンドウで Plane をゆっくりとダブルクリックする方法のどちらでも、名前を編集するモードにすることが可能です。新しい名前として半角英字で Ground と入力したら Enter キーもしくは Return キーを押下して決定します。新しい名前に変わっていることを確認してください。

f:id:nightowlgames0314:20180909155206p:plain

Hierarchy ウィンドウで Ground を選択している状態で画面右側上部にある Inspector タブをクリックして Inspector ウィンドウを表示します。Inspector ウィンドウには現在 Hierarchy ウィンドウで選択されているゲームオブジェクトが保持している情報を確認することができます。

f:id:nightowlgames0314:20180909155552p:plain

Transform コンポーネントはゲームオブジェクトがシーン上のどこに配置されるのか、位置を指定するためのコンポーネントです。ゲームオブジェクトを作成した際に変な場所に放り出されていることがよくあります。そのためまずは位置情報をリセットしましょう。Transform コンポーネントの右上にある歯車マークから Reset を選択することでPosition(位置情報)が(0, 0, 0)にリセットされます。この位置は世界の原点として認識され、シーン内の全ての座標はこの原点から計算されます。ついでに Rotation(回転)も(0, 0, 0)になり、Scale(サイズ)は(1, 1, 1)となります。

f:id:nightowlgames0314:20180909155947p:plain

Hierarchy ウィンドウあるいは Scene ビュー上でゲームオブジェクトを選択している状態で、Scene ビュー上にマウスのカーソルを乗せてF キーを押下するか、下図のように Edit > Frame Selected を選択することで、選択中のゲームオブジェクトの全体が映るように視点を移動することができます。

私たちの現在の Scene ビューを見てみると、Ground ゲームオブジェクトが原点に配置されていることを示す grid lines(目盛線)が表示されています。このプロジェクトの目的のために grind lines をオフにします。Scene ビューの上部にある Gizmos ボタンをクリックして Shoe Grid のチェックを外して、実際に grid lines が消失していることを確認しましょう。

f:id:nightowlgames0314:20180909162724p:plain

地面となるゲームボードのサイズを変更する方法を3通り紹介します。

1つめは、Unity エディタの左上部にある Scale Tool を使用する方法です。Scale Tool を選択したら変更したい軸(x軸、y軸、z軸のいずれか)のハンドルをドラッグすることで選択中のゲームオブジェクトのサイズを調整できます。

f:id:nightowlgames0314:20180909163505p:plain

f:id:nightowlgames0314:20180909164024p:plain

2つめは、Transform コンポーネントの X、Y、Z のいずれかの文字の上にマウスのカーソルを移動させると左右の矢印が表示されます。その状態で左右にドラッグすることで選択中のゲームオブジェクトのサイズを調整できます。

3つめは、Transform コンポーネントの入力欄に直接、値を入力する方法です。今回は(2, 1, 2)に設定しましょう。

f:id:nightowlgames0314:20180909164336p:plain

今 Ground ゲームオブジェクトには体積がありません。厚さを加えるために Y 軸のサイズを増やしてみても何も変わりません。Unity に最初から用意されている3Dモデルの Plane (平面)から生成されたゲームオブジェクトの場合、Scale の Y 軸は機能しません。ただし負の数値に変更した場合のみ Plane が向いている方向が逆になる、という変化がおきます。Ground オブジェクトの Transform コンポーネントの Y の値を負の数値にすると Ground ゲームオブジェクトが消えたように見えますが、下から覗いてみると下を向いた Ground ゲームオブジェクトが視認できます。

もしあなたが Plane ゲームオブジェクトを Scene 内に配置したのに視認することができない場合は、Plane ゲームオブジェクトとカメラの向きを確認して、Transform コンポーネントの Scale の Y 座標に正しい数値(基本的には 1 のはずです)を入力してください。

次は、プレイヤーとなるゲームオブジェクトを作成してみましょう。このチュートリアルでは Unity に最初から備わっている3Dモデルである Sphere をプレイヤーとなるゲームオブジェクトとして使用します。

Plane ゲームオブジェクトの作成と同様の手順で Hierarchy ウィンドウから Sphere を作成します。

f:id:nightowlgames0314:20180909170626p:plain

Sphere の名前を Player に変更します。

f:id:nightowlgames0314:20180909170701p:plain

生成時に出鱈目な数値が入ってしまう Transform の値を 原点に合わせます。

f:id:nightowlgames0314:20180909170810p:plain

Fキーもしくは Edit > Frame Selected を選択して、Player ゲームオブジェクトに焦点を合わせます。ボールがどのように平面に埋め込まれているか確認できますか。

f:id:nightowlgames0314:20180909171203p:plain

これは、ボールと平面の両方が Scene 内の同じ位置(0, 0, 0)に配置されているからです。私たちはプレイヤーとなるボールのオブジェクトが平面の上に乗っかるように移動しなければなりません。Unity で最初から用意された3Dモデルである Cube、SphereCapsule などの標準サイズは(1, 1, 1)か(1, 2, 1)のどちらかです。Sphere から生成されたボールの位置を、Y 軸に 0.5 上げるだけで完璧に平面の上に乗ることを我々は知っています。

f:id:nightowlgames0314:20180909172227p:plain

Scene ビューを確認してみると Player ゲームオブジェクトが照らされ Ground ゲームオブジェクトに影を落としています。

f:id:nightowlgames0314:20180909172348p:plain

Unity で新しく作成された全ての Scene にはデフォルトで Skybox と太陽を表現するための Directional Light が一緒に作成されています。なので私たちはデフォルトの照明の設定について心配する必要はありません。しかしながら白い球が白い背景にあることについては改善の余地があります。地面に色をつけて、プレイヤーと背景の間の色に差異をつけましょう。

モデルに色やテクスチャ(質感)を追加するためには、素材を使用する必要があります。今は素材について細かく学習することはしません。テクスチャも使用しません。標準的な素材だけを使用して、シーン内のオブジェクトに色を追加します。

最初に素材を保持しておくためのフォルダを作成します。Project ウィンドウの Create ボタンをクリックして Folder を選択して作成し、名前を「Materials」に変更します。

f:id:nightowlgames0314:20180909174414p:plain

Materials フォルダを選択した状態で、再度 Project ウィンドウの Create ボタンをクリックして今度は Material を選択して作成し、名前を「Background」に変更します。

f:id:nightowlgames0314:20180909174702p:plain

Material が Materials フォルダの直下に配置されていることを確認してください。これは Materials フォルダを選択している状態で Material を作成したからです。

Material を選択した状態で Inspector ウィンドウを見てみましょう。

f:id:nightowlgames0314:20180909174939p:plain

Main Maps を確認します。最初のプロパティ(性質)の設定項目は Albedo です。Albedo の色領域をクリックすると色選択ツールが開きます。色を暗い青色に変えてみましょう。今回は RGB 値を(0, 32, 64)に設定します。

f:id:nightowlgames0314:20180909175612p:plain

Inspector ウィンドウの最下部に表示されている Material のプレビューで色合いを確認しましょう。もしプレビューが左図のように表示されていない場合は最下部の Material の名前(今回は Background)の箇所をクリックすることで右図のようにプレビューが開示されます。

f:id:nightowlgames0314:20180909180137p:plain

Ground ゲームオブジェクトに質感を与えたい場合は、Project ウィンドウで素材を選択して Scene ビューの Ground オブジェクトにドラッグ&ドロップするだけです。今プレイヤーが操作するボールのオブジェクトは濃い青色の上に立っていますね。

f:id:nightowlgames0314:20180909180555p:plain

このチュートリアルの後半で私たちを助けることになるであろう変更をもう1つ加えましょう。プレイヤーにとってより良い照明を与えるために、Directional Light(太陽光)の向きを調整します。Hierarchy ウィンドウから Directional Light を選択し、Inspector ウィンドウの Transform コンポーネントの Rotation(回転)の Y 軸の値を 60 に設定します。

f:id:nightowlgames0314:20180909181421p:plain

今、私たちにはプレイヤーとなるゲームオブジェクトと、地面となるゲームオブジェクトがあります。今回の作業分を保存しておきましょう。上部メニューバーから File > Save Scenes を選択するか、ショートカットキーとして command + S を押下することでセーブをすることができます。Unity のフリーズなどで作業が無駄にならないようにできるだけ小まめにセーブはしておきましょう。

f:id:nightowlgames0314:20180909192706p:plain

【補足解説付き】Unity公式チュートリアル日本語翻訳【Roll-a-ball tutorial - 0. Introduction to Roll-a-Ball】

f:id:nightowlgames0314:20180909141657p:plain

f:id:nightowlgames0314:20180909141708p:plain

この初心者課題では、 非常にシンプルですがプレイ可能なゲームを作り、基本的なコンセプトを学習します。我々は roll-a-ball と名付けられたゲームを作ります。

このゲームの目的は、ゲームボード上に散らばっているキューブの物体を収集することです。新しいゲームオブジェクト(ゲーム画面上に映る全ての物体はゲームオブジェクトです)を作成して、そのゲームオブジェクトにコンポーネント(ゲームオブジェクトに何をすべきか命令を出す存在)を追加し、 プロパティ(ゲームオブジェクトの性質)と位置(ゲームオブジェクトがゲーム内のどこに存在するか)の値を設定する方法について、最初に学習します。

このゲームでは、プレーヤーはゲームボード上を転がるボールを操作します。ボールは物理法則と力によって移動します。プレーヤーはボールに力を加えるためにキーボードで入力し、私たちはその入力を取得して使用し、ボールはゲームボード上を移動します。

プレーヤーが操作するボールとゲームボード上に散らばるキューブのオブジェクトの接触を検出し、そのイベントを使用してキューブのオブジェクトを収集させる方法を学習します。

このチュートリアルで作成する Roll-a-ball ゲームの完成品では、プレイヤーがキーボードでボールをコントロールし、収集可能なキューブのオブジェクトを拾うたびにカウントし、常に現在のカウントが画面上に表示され、すべてのキューブを拾い終えたときに、ゲームを終了します。

このプロジェクトのためにアセット(ゲームの素材や、ゲーム制作に役立つツール)をインポートする必要はありません。この課題には、モデル、テクスチャ、サウンド、またはアニメーションを使用しません。Unity が提供するキューブ、球体、平面のような基本的な形状をそのまま使用します。

まずは課題1に移動して、私たちのゲームをセットアップして、ゲームオブジェクトを作成してみましょう。

【補足解説付き】Unity公式チュートリアル日本語翻訳【Tutorial Projects - 3D Game Kit - Quick Start】

f:id:nightowlgames0314:20161005154001j:plain

3D Game Kit とは

3D Game Kit は Unity 公式のチュートリアルです。Unity 公式チュートリアルはプロジェクトという単位で区切られています。

チュートリアルの始め方

f:id:nightowlgames0314:20180827215208p:plain
上図はUnityを起動した直後の画面です。Projects タブにはあなたが作成したゲームの一覧が並びます。Learn タブには Unity の公式チュートリアルの一覧が並びます。チュートリアルを学ぶためには Learn タブを選択します。

f:id:nightowlgames0314:20180902162612p:plain

Tutorial Projects を始めるためには、サイドメニューバーのチュートリアル一覧から Tutorial Projects を選択します。 

チュートリアル本編

1.Introduction to Quick Start Guide

このチュートリアルでは、すでに準備が整えられているコンポーネントを使用して、あなたがコードを記述することなく独自の3Dプラットフォームゲームを作成します。また、ゲームの完成例とマニュアルも含まれています。

「3D Game Kit」をダウンロードすると現れる「Start」ボタンをクリックしてインポート作業を開始します。インポート作業が完了すると 3D Game Kit が起動します。

f:id:nightowlgames0314:20180902173334p:plain

インポート作業中に上図のポップアップが表示されます。「品質設定は自動的にUltraに設定されました。Edit > Project Settings > Quality menu でその設定を変更することができます」

f:id:nightowlgames0314:20180902174024p:plain

上図は 3D Game Kit 起動直後の画面です。

f:id:nightowlgames0314:20180902180235p:plain

上図のようにエラー文が表示されることがあります。プロジェクトがインポートされたら、Unity エディタを閉じてプロジェクトを再度開いてください。これにより、パッケージマネージャが初期化され、プロジェクトのエラーがクリアされます。

f:id:nightowlgames0314:20180902180739p:plain

再起動したことによりエラーが解消されました。エラーが表示されていたウィンドウのことを Console ウィンドウと呼びます。邪魔なのでドラッグして Game ウィンドウの横にでも移動しておきましょう。

f:id:nightowlgames0314:20180902180940p:plain

チュートリアルを開始しましょう。

Project ウィンドウの中から Readme と名付けられファイルを見つけて選択すると、画面右側の Inspector ウィンドウに案内が表示されます。

f:id:nightowlgames0314:20180902181245p:plain

Game Kitとは

このゲームキットを使用すると、コードを書くことなく独自の3Dプラットフォームゲームを作成することができます。

フィードバックを得られますか?

下記リンク先のフォーラムであなたが考えていることや質問をしてください。

https://forum.unity.com/threads/3d-game-kit-official-thread.530684/

どうやって使うの?

3D Game kit を構成する利用可能なプレハブとコンポーネントを全て調べることができる詳細なマニュアルを作成しました。このマニュアルは下記リンク先の学習サイトで閲覧可能です。さっそく下記のリンクを開いてみましょう。

3D Game Kit - Unity

f:id:nightowlgames0314:20180902182900p:plain

f:id:nightowlgames0314:20180902183205p:plain

以降は、Quick Start で紹介されている手順に沿って解説します。ただし Quick Start の項目内にある「1.Introduction to Quick Start Guide」は 3D Game kit のダウンロード方法についての説明で既に済んでいるため無視します。

2.Making a New Scene

新しいシーンを作成することから始めましょう。本来であればシーンを作成した際には、まだ何も存在していないシーンが生成されます。 ですが今回は Unity 公式が必要なものを予め設定済みのシーンを作成するツールを用意してくれています。そのツールで作成されたシーンには最初から、地面と、その地面の上を走り回って攻撃ができるエレン(Ellen)という名前のヒーローが、存在しています。

メニューバーの Kit Tools > Create New Scene をクリックします。

f:id:nightowlgames0314:20180902193157p:plain

New Scene Name と名付けられた入力欄にシーンの名前を入力して Create をクリックします。名前が思いつかない方は TemplateScene1 とでも入力しておきましょう。

f:id:nightowlgames0314:20180902193700p:plain

地面、エレン、UI、ゲームメニューなどが新しく生成されたシーン上に存在しているはずです。

f:id:nightowlgames0314:20180902193915p:plain

ProBuilder.Edito は今は使わず邪魔なので Console ウィンドウの隣にでもドラッグで移動しておきましょう。

f:id:nightowlgames0314:20180902194026p:plain

Unity エディタ上部にある Play ボタンをクリックするとゲームが再生されます。

f:id:nightowlgames0314:20180902194502p:plain

プレイヤーキャラクターであるエレンを下記のコマンドで動かしてみましょう。

・歩く:キーボードの W, A, S, D あるいは矢印キー

・跳ぶ:スペースキー

・攻撃:左クリック

・カメラ操作:マウス移動

・停止:ESCキー

3.Adding a Moving Platform in 3D Game Kit

シーン内に移動する地面を追加します。 すべての使用可能な機能は Prefabs >  Interactables にあります。

MovingPlatform を追加する手順:プロジェクトウィンドウから Assets > 3DGameKit > Prefabs > Interactables に移動します。

f:id:nightowlgames0314:20180902200221p:plain

MovingPlatform を左クリックしてシーンビューにドラッグします。

f:id:nightowlgames0314:20180902200319p:plain

Transform Tools を使用して、位置、回転、サイズを調整します。

f:id:nightowlgames0314:20180902200739p:plain

再生ボタンをクリックして、私達が行った変更をテストしましょう。

f:id:nightowlgames0314:20180902201617p:plain

MovingPlatform が動いていません。動かしてみましょう。

シーンビューで MovingPlatform をクリックして選択すると Start ポイントツールと End ポイントツールが現れます。これが MovingPlatform の可動領域です。

f:id:nightowlgames0314:20180902202325p:plain

MovingPlatform を選択しているときには、画面右側の Inspector ウィンドウには MovingPlatform の情報が表示されています。MovingPlatform ゲームオブジェクトには Simple Translator ( Script ) コンポーネントが追加されています。Simple Translator ( Script ) コンポーネントPreview Position の値をスライダーで変更してみましょう。MovingPlatform がどのような動きをするのかを事前に確認することができます。

Simple Translator ( Script ) コンポーネントの Activate にチェックを入れると MovingPlatform が動き出します。

再生ボタンをクリックして、私達が行った変更をテストしましょう。

MovingPlatform は確かに移動しましたが End ポイントツールを設定した位置に到達すると停止してしまいます。

シーンビューで MovingPlatform をクリックして選択し、Simple Translator ( Script ) コンポーネントの Loop Type の値を Ping Pong に変更してみましょう。

f:id:nightowlgames0314:20180902204013p:plain

再生ボタンをクリックして、私達が行った変更をテストしましょう。

MovingPlatform が Start ポイントツールを設定した位置から End ポイントツールを設定した位置まで移動したあと、End ポイントツールから Start ポイントツールの位置まで戻ってきて、を繰り返すようになりましたね。

4.Opening a Door with a Command

ゲームコマンドは Unity 内の他のゲームオブジェクトに対してアクションを実行するように指示する信号を送信します。

PressurePad はドアを開けるための装置です。まずはドアを作成しましょう。プロジェクトウィンドウで、Prefabs> Interactables に移動します。DoorSmall を見つけてシーンビューにドラッグします。

f:id:nightowlgames0314:20180902210154p:plain

DoorSmall オブジェクトの Gizmos はとても便利で、DoorSmall オブジェクトの Transform ツールまたは簡単な配置のみを表示するように調整できます。

Hierarchy ウィンドウで DoorSmall ゲームオブジェクトを選択した状態で、Inspector ウィンドウに表示される Simple Transform ( Script ) コンポーネントの名前の左側にある三角形の矢印をクリックすると Simple Transform ( Script ) の Gizmo が閉じて DoorSmall ゲームオブジェクトが見えやすくなります。

f:id:nightowlgames0314:20180902210936p:plain

Gizmo とはゲームオブジェクトの位置や向きを示すアイコンの事です。 Unity の Scene ビューの右上に表示される下図の様な3Dアイコンや、ゲームオブジェクトを選択した時に赤と青と緑の矢印で構成されている3Dアイコンなどが Gizmo です。

f:id:nightowlgames0314:20180902211250p:plain

f:id:nightowlgames0314:20180902211255p:plain

必要に応じて Transform Tools を使用して DoorSmall を配置します。ドアを開けるための装置である PressurePad を追加しましょう。Projcet ウィンドウで Prefabs> Interactables に移動します。PressurePad を見つけてクリックして、シーンビューにドラッグします。Transform Tools を使用して、ドアの近くに置きます。

f:id:nightowlgames0314:20180902212148p:plain

Ellenが PressurePad を踏んだときにドアが開くように、PressurePad と DoorSmall を接続しましょう。Hierarchy ウィンドウで、PressurePad をクリックして選択します。

f:id:nightowlgames0314:20180902212400p:plain

Hierarchy ウィンドウで、DoorSmall をクリックしてドラッグし、PressurePad の Send on Trigger Enter ( Script ) コンポーネントの Interactive Object のスロットにドラッグします。

f:id:nightowlgames0314:20180902212831p:plain

Scene ビューには、PressurePad から DoorSmall への接続を示す白い矢印の線が表示されます。

f:id:nightowlgames0314:20180902213101p:plain

再生ボタンをクリックして、私達が行った変更をテストしましょう。

f:id:nightowlgames0314:20180902213348p:plain

EllenがPressurePad を踏み込んだときにドアが開きます。

5.Enemies in the 3D Game Kit

3D Game Kit には3種類の敵がいます。 それらは Prefabs > Characters > Enemies > [ ..... ] にあります。敵は Chomper、Spitter、Grenadier です。 Chomper は近接攻撃の敵であり、Spitterは遠距離射撃の敵であり、Grenadierは特定の攻撃パターンを持つボス型の敵であり、射撃、近接攻撃、シールドバースト防御が混在している。

f:id:nightowlgames0314:20180902221951p:plain

Ellen が戦うためのシーンに Chomper を置きます。プロジェクトウィンドウで Prefabs > Characters > Enemies > Chomper に移動します。Scene ビューに Chomper をドラッグします。Transform Tools を使用して、好きな場所に Chomper を配置します。

f:id:nightowlgames0314:20180902222349p:plain

Chomper の前に大きなダークブルーの半円が現れます。これは Chomper の検出半径です。 エレンがこのエリアに入ると、彼は追いかけて攻撃します。Hierarchy ウィンドウで Chomper を選択して、彼が見ることができる領域を縮小しましょう。Inspector ウィンドウで、Chomper Behavior コンポーネントに移動します。Player Scanner を開くためには、その横の矢印をクリックします。

f:id:nightowlgames0314:20180902222730p:plain

Detection Radius の値を 3 に設定してChomper の検出範囲を縮小します。Detection Angle を 180° にスライドさせて、Chomperが正面しか見ることができないようにしましょう。今 Chomperは、彼の前方の近くにあるものだけを見ることができます。

f:id:nightowlgames0314:20180902223343p:plain

このGizmoをシーンビューから隠すためには、Chomper Behavior の名前の左側にある矢印をクリックしてコンポーネントを折りたたんでください。

プレイを押して、Chomper の近くを走ります。

f:id:nightowlgames0314:20180902223647p:plain

Chomper は Ellen を検出しますが、その場でのみ動作します。 私たちは Chomper に地上を移動できる場所を伝える必要があります。NavMeshSurface コンポーネントを追加することでこれを行います。

Hierarchy ウィンドウで Plane をクリック。

f:id:nightowlgames0314:20180902223842p:plain

Inspector ウィンドウで Add Component をクリックして NavMeshSurface を検索します。

f:id:nightowlgames0314:20180902223953p:plain

キーボードで Enter キーを押すか、スクリプトをクリックしてコンポーネントを Plane に追加します。NavMeshSurface コンポーネントの設定をしましょう。Agent Type をChomper に設定します(これはすべての敵タイプに使用されます)。Include Layers を Nothing に設定します。Include Layers で Enviroment と Vegetation を選択し直します。

f:id:nightowlgames0314:20180902224821p:plain

NavMeshSurface コンポーネントの下部にある「Bake」をクリックします。明るい青色の表面が地面の上に現れます。 これは敵が移動可能な場所を告げるものです。Play を押して、Chomper の前で走ってみましょう。Chomper があなたの後ろを走り、攻撃します!マウスの左クリックを使用してあなたの杖で攻撃してください!

f:id:nightowlgames0314:20180902225257p:plain

Chomper は1打で死にます。 これを増やすには、Hierarchy ウィンドウで、Chomper を選択します。Inspector ウィンドウ Damageable ( Script ) コンポーネントの設定をします。Max Hit Points の値を増やすことで、Chomper 死ぬために必要な殴打数を増やすことができます。 エレンの杖で殴るたびに Hit Points を 1 減らします。

f:id:nightowlgames0314:20180902230029p:plain

6.Damaging with Objects in 3D Game Kit

接触ダメージを使って Damageable コンポーネントを持つゲームオブジェクトにダメージを与えることができます。box と Chomper を使用して、Damageable コンポーネントがどのように機能するかを説明します。Project ウィンドウで Prefabs > Interactablesに移動します。DestructibleBox プレハブを見つけてクリックし、Scene ビューにドラッグします。Transform Tools を使用して DestructibleBox を Chomper の上に配置します。

f:id:nightowlgames0314:20180902231023p:plain

再生ボタンをクリックして、私達が行った変更をテストしましょう。
DestructibleBox は落ちて Chomper に着陸し、そこにとどまり、何も起こりません。

Chomper にあまり近づかないでください、彼はEllenを追いかけるでしょう。 必要に応じて、検出半径を常に0に減らすこともできます。

f:id:nightowlgames0314:20180902231434p:plain

私たちは Chomper に当たったときにボックスにダメージを与える必要があります。
Hierarchy ウィンドウで DestructibleBox の横の矢印をクリックして子を公開します。DestructibleBox の子を選択します。

f:id:nightowlgames0314:20180902231642p:plain

Inspector に移動します。Inspector の一番下までスクロールし、Add Component をクリックします。Box Collider を検索します。キーボードでEnterキーを押すか、Box Collider コンポーネントをクリックして DestructibleBox に追加します。Box Colliderコンポーネントの Trigger box のチェックボックスをオンにします。

f:id:nightowlgames0314:20180902232055p:plain

Add Component をクリックします。Contact Damager を検索します。キーボードでEnterキーを押すか、Contact Damager をクリックしてコンポーネントとして追加します。Contact Damager コンポーネントの Amount を 3 に設定します。ダメージ量は、Chomper の Max Hit Points と同じでなければならないことに注意してください。 さっき 3 に変更しましたよね。Chomper の Damageable コンポーネントの Max Hit Points を確認してください。Damaged Layers を Enemy に設定します。

再生ボタンをクリックして、私達が行った変更をテストしましょう。

f:id:nightowlgames0314:20180902233105p:plain

DestructibleBox は Chomper にぶつかり、くるくると回転しながら跳ね返りましたね。Chomper を殺すのに十分なダメージをうまく与えることはできましたが、この演出は良くありません。 私たちは Chomper に当たったときに DestructibleBox を壊すことができます。DestructibleBox はすでに Contact Damager を持っているので、DestructibleBox に影響を与えるように適応させましょう。

Hierarchy で、Chomperを見つけて選択して Inspector に移動する。Inspector の一番下にスクロールして、Add Component をクリックして Contact Damager を探す。キーボードでEnterキーを押すか、Contact Damager をクリックして Chomper に追加します。
Contact Damager コンポーネントの Amount の値を 1 に設定します。Damaged Layer の値は、ドロップダウンで Enemy を選択します。

再生ボタンをクリックして、私達が行った変更をテストしましょう。

f:id:nightowlgames0314:20180902234148p:plain

DestructibleBox は Chomper に落ち、壊れ、消滅し、Chomper はすべてのヒットポイントを失います。

7.Decorating in 3D Game Kit

3D Game Kit では、サンプルゲームの作成に使用したすべての環境オブジェクトを提供します。これらは Prefabs > Environment > [...] で見つけることができます。それらはさまざまなタイプのアセットのフォルダに分割されます。 フォルダを移動してシーンを構築してください。あなたはどのような世界を創造しますか?

f:id:nightowlgames0314:20180902234749p:plain

これから草や岩を地面に追加していきますが、敵があなたが追加した新しい表面を歩くことができるか、オブジェクト(大きな植物のような)を避ける必要があるか、を知るためには、NavMeshを下記の手順で再構築する必要があります。

Hierarchy で Plane を選択して Inspector に移動する。NavMeshSurface で Bake をクリックします。

f:id:nightowlgames0314:20180902234937p:plain

あなたのシーンをさらに飾るために、Rock Painter と Vegetation Painter を作成しました。 これらのツールを使用すると、さまざまなサイズと回転で植生や岩石を配置することができます。これらのツールを使用するには、Hierarchy 内で VegetationPainter を見つけて矢印をクリックして子を展開します。

f:id:nightowlgames0314:20180902235720p:plain

GroundCover をクリック。Scene ビューで地面にマウスを乗せてください。左クリックで芝生かリリーを置いてください。

f:id:nightowlgames0314:20180903000625p:plain

きっとあなたの Scene ビューには上図のようなリリーではなく芝生が配置されたはずです。配置するオブジェクトのタイプを変更してみましょう。Inspector に移動します。
Instance Painte コンポーネントには、各プレハブの画像があります。

f:id:nightowlgames0314:20180903000732p:plain

白い強調表示されたボックスをクリックして、ペイントするプレハブを選択します。
選択したプレハブはグレーになります。ペインタの操作マニュアルは Instance Painter コンポーネントの上部にあります。いくつかの操作があります。

左クリック = ペイント

Ctrl(Cmd)+ 左クリック = 削除

Alt +スクロール = ブラシサイズを大きくする

スペース = 位置と回転をランダム化する

ペイントしたオブジェクトは、親の子として保存されます。 例えば Hierarchy に移動して GroundCover を展開する。

f:id:nightowlgames0314:20180903001036p:plain

ペイントからのそのタイプのすべてのオブジェクトは、子としてここに格納されます。 これらをクリックすると、個別に編集して配置することもできます。このプロセスは、VegetationSmall、VegetationMedium & VegetationLarge でも同じです。

f:id:nightowlgames0314:20180903001158p:plain

岩石のペインティングも同じ方法で行われます。Hierarchy 内で RockPainter を見つけます。矢印をクリックして子を展開し、RocksSmall をクリック。マウスを目的の領域に置いて岩石を置き、クリックして配置します。

f:id:nightowlgames0314:20180903001303p:plain

8.Teleporting the Player in 3D Game Kit

3D Game Kit にはテレポートシステムがあります。 Ellenを他のレベルまたはシーン内の別の場所にテレポートできます。シーン内に Teleporter を作成しましょう。Project ウィンドウで、Prefabs > Environmen > Structures に移動して GateWayHugeTeleporter を探します。名前が示すように、このゲートウェイは巨大です。Scale Tool と Translate Tools を使用してそれを配置し、エレンのサイズにスケールします。Hierarchy で GatewayHugeTeleporter を選択して子供を展開します。TeleportPlane を選択し Inspector に移動し Add Component をクリックします。BoxCollider を検索して
キーボードでEnterキーを押すか、BoxCollider をクリックしてコンポーネントをTeleportPlane に追加します。BoxCollider の Is Trigger にチェックをいれます。

f:id:nightowlgames0314:20180903002420p:plain

Add Component をクリックし Teleporter を検索します。キーボードでEnterキーを押すか、Teleporter をクリックして TeleportPlane に追加してください。

f:id:nightowlgames0314:20180903002552p:plain

Teleporter コンポーネントで Layers を Player に変更します。Hierarchy で Checkpoints を見つけます。Checkpoints の横にある矢印をクリックして子を展開します。

f:id:nightowlgames0314:20180903002738p:plain

Hierarchy 内で TeleporterPlane が選択されている状態で Checkpoint(子)を Teleporter コンポーネントDestination Transform フィールドにドラッグします。Hierarchy で、エレンを見つけて子を展開して RespawnParticles を探します。

f:id:nightowlgames0314:20180903003704p:plain

Hierarchy で GateWayHugeTeleporter の子である TeleportPlane が選択されている状態で RespawnParticles を Teleporter の Enter Effect にドラッグします。RespawnParticles を Teleporter の Exit Effecy にもドラッグします。プレイを押して、テレポーターに走ってテストします。

f:id:nightowlgames0314:20180903004227p:plain

テレポーターを歩いているとき、Ellenは最初に生まれた場所に移動し、青い粒子が彼女を取り囲みます。

9.Having Fun with 3D Game Kit

3D Game Kit 内のほとんどのオブジェクトは、PressurePad の設定で表示されるイベントシステムで再生されます。 Scene > GamePlay > [ Level1 / Level2 ]の既存のシーンを調べて、Level1 と Level2 がコマンドシステムを使用して他のオブジェクトをどのように設定されているかを確認します。 すべてのコンポーネントとそのパラメータの詳細については、「コンポーネントのドキュメント」を参照してください。