これまで、プログラミングについてはPythonとAndroid StudioでJavaについて少し勉強しました。
今回はその2つのどちらかについて勉強しようと思っていたのですが、
私がゲーム好きということもあって、どうしてもゲーム制作に向けた勉強もしたいなーというのがありました。
そこで今回はまた、全く別のプラットフォームになりますが、Unityと呼ばれるゲームを制作できるエンジンの勉強を少しかじってみました。
Unityとは
Unityはアメリカのサンフランシスコに本拠地ユニティ・テクノロジーズが開発したゲームエンジンです。
2005年にMACに対応したゲーム開発ツールとしてリリースされ、現在は2018年にリリースされたUnity2019が最新verみたいです。
Unityは有償verと無料verがあり無料の方はクラウドストレージが使いないなど適用範囲が狭まりますが、それでも僕みたいな個人的に楽しむ初心者には無料verで十分ですね。
Unityで開発された代表的なゲームとしてはスマホ版のドラゴンクエストⅧなんかがあるみたいです。
Unity内ではスクリプト言語としてC#が使われています。そこで今回は少しC#を使った物理演算を行ってみました。
球と床の作成と衝突処理
Unityのダウンロードやインストール、諸々の設定を終えていざ新規作成!
物理演算って聞くとなんか難しそうですけど、今回やりたいのは物体と物体の衝突です。
よくゲームで当たり判定とかあるとおもいますが、あれです。こちらのサイトを参考にしました。
とりあえず、HierarchyのCreateから3D ObjectのSphereを選択します。すると白い球体ができました。
右上の方のInspectorのタブのTransformの欄で球体の位置(座標)やサイズを変えることができます。
ためしにサイズをX=1,Y=1,Z=1だったのをX=2,Y=2,Z=2にしたのが下図です。球体が全体的に大きくなっています。
物理演算を適用するには球体にコンポーネントを加える必要があります。そこで右下のAdd ComponentからPhysicsのなかのRigidbodyを選択します。Rigidbodyはいわゆる剛体ですね。すると、右のInspectorのタブの一番下にRigidbodyの欄が追加されます。今回は球体に重力を与えて自由落下させたいのでRigidbodyの中のUse Gravityにチェックを入れておきます。
続きまして、球体がぶつかる床を作ります。床はHierarchyのCreateから3D ObjectのPlaneで作りました。作ってからInspectorのTransformの欄でちょうどいい位置とサイズにします。
なんかもうこれだけでそれっぽいですよね。一回これでゲームを起動してみます。ゲームの起動は画面真ん中上の再生ボタン▶から行います。
「ピタッ」
ちょっと思っていた挙動と違いますね。「ばいーん」って跳ねてほしかったんですけど。
どうやらPhysic Materialというやつを追加しないと行けないみたいです。
ProjectのタブのAssetsで右クリックした後にCreateからPhysic Materialというものを選択します。すると以下の画面がInspectorのタブに出てきます。
Dynamic Frictionが動摩擦係数、Static Frectionが静止摩擦係数、Bouncinessが跳ね返り係数で0が跳ね返らない1がエネルギー損失0で跳ね返ることを示しています。今回はとりあえず上手の通りにしてみました。
作成したAssets内のPhysic Materialをドラッグして先程作成したHierarchyのSphereにドロップします。
するとSphereのInspectorの中に作成したMaterialが追加されています。
そしてもう一度起動してみます。今度はどうでしょうか。
キタ━━━━(゚∀゚)━━━━!!
球を増やしてみる
球一個じゃなんかつまらないですよね。もっと増やしたい!
はじめはHierarchyの中でコピー&ペーストでSphereを増やしてみたのですが、位置が同じ位置にコピーされるのでいちいちPositionを設定し直さないと置けなかったのでめんどくさかったです。
そこで、Prefabsというものを作って増やしてみました。AssetsのCreateからPrefabで作成するみたいなのですが、もともとあったHierarchyのSphereからドラッグ&ドロップでもできました。
できたSphereをSceneの中に同じくドラッグ&ドロップすることで量産できました!
ゲーム起動中にも以下のように増やすことができます。
でもこれだとPlaneから外にでた球は外に落ちていってしまいます。そこで、Planeのサイドに壁をGame ObjectのCreateからCubeで作成しました。以下のような感じです。
物体を揺らしてみる
皆さん気が付きましたか?僕まだなにもプログラミングしてないんです。
プログラミングなしでも、衝突させたり増やしたり、それっぽいものを作ることができちゃうんですね。驚きました。
ただこのままでは少し面白くないので、C#スクリプトを作って床を揺らしてみたいと思います。
スクリプトを使えば細かい設定などを行うことができるので、ちゃんとしたゲームを作るとなると必須だと思います。
今回は参考サイトにあるスクリプトを真似して以下のようなスクリプトを作りました。スクリプト自体はAssetsで右クリックしてCreateからC# Scriptで作成できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using UnityEngine; using System.Collections; public class MoveFloor : MonoBehaviour { private Vector3 initialPosition; void Start() { initialPosition = transform.position; } void Update() { if(Time.time > 5.0) { transform.position = new Vector3(Mathf.Sin(10f * Time.time) * 0.5f + initialPosition.x, initialPosition.y, initialPosition.z); } } } |
transform.positionでx座標だけ位置をSin波で変えるようにしています。その前にTime.timeでゲーム起動からある時間が経ってから揺れが始まるようにしました。
このスクリプトをPlaneにドラッグ&ドロップします。注意するのはスクリプト内のClassの名前と作成したスクリプトの名前を同じにすることです。でないとエラーがでました。
これでゲームを起動してみます。
「コスコスコスコス」揺れてますね~
あいかわらずスクリプト内の細かい文法は理解していませんが、物体にスクリプトを反映させることができました。
ブラジルナッツ現象
ここまでの諸々の技術を駆使して以下のような動画を作ってみました。
300個程度の球を落下させて堆積させた後に左右と上下に揺らしています。球は赤、黄色、緑、青の順に半径を小さくしており、はじめは大きいものが下層に、小さいものが上層に堆積するようにしています。
堆積させた後に揺らすと小さい球が下層に移動していき、逆に大きい球は上層に移動していく様子がわかると思います。
この現象は「ブラジルナッツ現象」と呼ぶみたいです。詳しくは物理の先生に任せますが、ゆすられることで小さい球が隙間に落ちていき、一方で大きい球は表面積が大きく下に落ちた小さい球から多くの衝突力を受けて上昇、一度上昇した大きい球は隙間に落ちることができず動画のような状態になる。みたいな感じ?だと思います。
直感的には大きな物ほど下に落ちそうですが、自然現象で言うと土石流なんかもこのように大きな石が上に上がってくる様子が見られるそうです。
なんかUnityの勉強が物理の勉強みたいになっちゃいましたが、実現象と同様の現象を再現することができたと言うことは当初の目的である物理演算がうまくできていると言えるのではないでしょうか。
まとめ
今回はプログラミングの勉強の一環としてUnityの勉強をしました。
結果的にプログラミングがでてきたのはわずかでしたが、まだまだ序盤なので、これから先ゲームを作成するときには勉強してC#を駆使してみたい思います。
また、物理演算の楽しさにも気づくことができました。
これからはゲームの作成とともに物理演算の検証もやってみたいと思いました。
こんかいのUnityのgif動画の録画はこちらのものを使いました。
コメント