Yoshidayo diary

日記です。

01: Unityチュートリアル「玉転がし」から得られた知識をまとめてみた

Unity始めました

アルバイト先の社長に、Unityがこの先熱いからやってみるといいよ、と教えていただきました。そこで、とりあえずやってみることにしました。

 

プログラミング学習は、自分だけだと挫折しちゃう気がするので、読者のみなさんにプラスαの価値ある情報を届けつつ、いろいろなゲームを作る過程などを学んでいきます。昔から長続きしない性格なので、続くようにがんばりたいとおもいます!w

 

ということでさっそく。

 

Unityの玉転がしチュートリアルやってみた

今回は「玉転がし」から得られた知識をまとめてみます。単純なゲームではありますが、色々とUnityを知る要素が詰まっていました。
公式が用意してくれているチュートリアルなので、かなりわかりやすく解説されていると思います。

 

「玉転がし」まだやったことがないという方は、これを機にやってみるのもいいかもしれません。所要時間は大体1時間くらいで一通り実装できます。

↓が玉転がしチュートリアルのリンクになっています。

unity3d.com

 

得られた知識をまとめてみる

プロジェクトの作成

まずUnityはプロジェクトを作る所から始まります。
基本的に1つのゲームは1つのプロジェクトで管理されていると考えて良さそうですね。

f:id:zyoryzyory:20180217004058p:plain

 

Sceneの作成

プロジェクトを作成したあとは、Sceneを作成していきます。
このSceneというのはゲームの1シーンという意味ですね。
よくあるゲームの

 

タイトル画面 → 本編 → エンディング

 

というような画面の移り変わりは、それぞれSceneで作られているという解釈でよさそうですね。

 

ゲームのステージレベルなんかをこのSceneで管理することができます。

f:id:zyoryzyory:20180217010908p:plain

イメージはこんな感じですね。

 

余談ですが、UnityではSceneでも、Unreal Engine4だとアクトと呼ばれていたりするようです。ほえー。

 

ドットインストールを参照

Sceneを作ったらいよいよゲームを作成していきます。が・・・、数値をいじれば何か変わるかと思いきや、何が変わっているのかわからない・・・、こりゃまいった\(^o^)/状態だったので、知る人ぞ知る有名プログラミング学習サービス「ドットインストール」のUnity入門でひと通り基礎学習をしました。

 

https://dotinstall.com/lessons/basic_unity

↑ドットインストールのUnityの入門講座です。
バージョンはちょっとだけ古いですが、使い方に大きな違いはなく、基礎を理解するのにオススメです。このレッスンの寿命すごい長いです!w

 

Unityにおけるゲームオブジェクト

Sceneを構成する要素すべて、と言い換えることができます。

たとえば、タイトル画面に出てくる文字や音声なんかもすべてgameObjectということですね。

f:id:zyoryzyory:20180217011058p:plain

このヒエラルキーウィンドウにあるものすべては、gameObjectなのです。ひえー。

 

とりあえず現実世界における空気、くらいの感覚で認識します。

 

Transformについて

gameObjectにフォーカスしてInspectorウィンドウをみてみると、必ずTransformというコンポーネントがあります。

f:id:zyoryzyory:20180217011302p:plain
プロパティは全部で3つあって

- Position(座標)
- Rotation(傾き)
- Scale(尺度)

となっています。
この3つのプロパティを使えば、gameObjectを2D/3D空間で自由自在に配置・回転させることができるんです。(すごい!)

TransformクラスのPositionに、フレームごとに値を足していくことによってgameObjectをアニメーションさせることができそうですね。

 

動かないgameObjectはStaticで固定する

インタラクティブに動かす予定のないものには、Inspectorの右上にあるStaticにチェックを入れます。
こうすることで、僕動きません!だから1フレームごとに動いているかどうかチェックしなくて大丈夫よ!とUnityに教えてあげることができるわけですね。

f:id:zyoryzyory:20180215203438p:plain

↑パフォーマンスを向上させる第一歩です!

たしかにFPSなどのプレイヤーが打ち合うようなゲームなどは、コンマ一秒のずれも大きな問題となりそうです。

動かない物体、つまり壁とか坂などはStaticにすると良いかもですね。


Unityのパフォーマンス・チューニングなどについては、追々やっていきます。

 

スクリプト内の変数をInspectorから参照可能にする

これはすごい仕組みだなと思ったのですが、スクリプト内で

 

public float wow = 1.0f;

 

とすると、Inspectorから値を直接いじることができます。
public と宣言していることで、Unityにグローバル空間から参照していいよ!と教えてるようですね。

逆にスクリプト内だけで使うことを明示的に宣言するには

 

private float secretNum = 9.0f;

 

とすればよいですね。
ふむふむ、なるほど。 

 

Update()とFixedUpdate()の違いについて  

FixedUpdate() Unityのタイムマネージャーが管理していて、通常1秒間に50回呼ばれるのですね。物理演算を常に一定間隔で実行するために、FixedUpdate()が存在します。


Edit -> Project Settings -> Time から実行回数を確認することができます。

f:id:zyoryzyory:20180217005507p:plain

 

Time Managerを開くと、Fixed Timestep がデフォルトでは0.02に設定されているので

1.0 / 0.02 = 50 という計算で50回呼び出されていることがわかります。

この数値を変更することで、より細分化した物理演算ができるようになるのですね。

 

Update() 物理演算以外の更新処理をするメソッドのようです。
Input.GetKeyDown などでキーから入力されたかどうかの処理はこのように書きます。

f:id:zyoryzyory:20180215204347p:plain

 

1分弱の動画に公式がまとめてくれていたので、公式のチュートリアルを参照しました。
実行間隔に違いがあることを強調していますね。
https://unity3d.com/jp/learn/tutorials/topics/scripting/update-and-fixedupdate


チュートリアルまとめ

Unityの多機能さを実感できました。

玉転がしの完成図はこんな感じです!

ボールをWASDなどのキーで操作して、上下左右に動き回れるのが楽しいですね。

f:id:zyoryzyory:20180217005814p:plain


ボールとターゲットがぶつかった時…というような物理計算をイチから構築するのは、なかなか難しそうですが、Unityを使えばやりたいことを簡単に実装できそうです。

最高のゲームを作るために、まずはコツコツとチュートリアルをがんばります!