OpenBookのUnity入門「第3章 【第4回】ブロック崩しを作ろう」をやってみました。

unity05

「第3章 【第4回】ブロック崩しを作ろう」では、Unity公式チュートリアルにもあるブロック崩しを作成しました。OpenBookはJavaScriptで書いているのでC#で書き直しました。またUnity5.3.5f1で実装したのでいくつかコードが異なっています。

Unity5.3用のプロジェクト配布

http://hajimete-program.com/games/OpenBook4Breakout.zip

ブロック崩しのような基本的なゲームでプログラミングをしてみたい人も多いはずなので、Unity5.3.5のプロジェクトをzipで置いておきます。zip展開して、Main.unityをクリックすれば、Unityにブロック崩しの画面が表示されるはずです。もしされない場合は、Unity上で、Assets/Scenes/Mainをダブルクリックするとシーンが読み込まれるはずです。

001

変更点

  • C#で実装
  • UIは、Unity5.3.5f1のCanvasUIで実装
  • ゲームマネージャー
  • 残ブロック数の数え方
  • 得点の表示方法

大きな変更点してはC#で実装していることです。またOpenBookと違ってUnity5.3のUIで実装しています。とはいえUIは難しくなくCanvasを用意してそこにラベルオブジェクトを配置しているだけです。

ゲームマネージャー

SceneScript.jsをGameManager.csという名前に変更して実装しています。Mainシーンに、空のGameObjectで名前が「GameManager」を作成して、そこにこのスクリプトGameManager.csを貼り付けています。

残ブロック数の数え方

OpenBookのソースコードは、残りブロック数をvar blockCt :int = 35;のようにハードコーディングしていますが、単純にゲームマネージャーで、シーンに存在するブロックを数えればよいので以下のように実装にしています。

すべてのブロックにBlockというタグをつけています。Unityのタグはブログやニコニコ動画などであるタグとまったく同じです。ゲームオブジェクトにタグ付けができます。(http://docs.unity3d.com/ja/current/Manual/class-TagManager.html

タグが付いているゲームオブジェクトを検索するには、GameObject.FindGameObjectsWithTag(タグ名)を使います。これで現在シーンに存在するタグ名のタグ一覧を配列で取得できます。なのでその数をUpdateメソッド内で毎回取得して0になったら、ゲームクリアのシーンに遷移させています。

ブロック崩しは軽いゲームなのでこれでよいでしょう。あとは画面遷移のApplication.LoadLevel("GameClear"); はUnity5.3では非推奨なので、SceneManager.LoadScene(“Gameclear”)を使っています。ソースコードの先頭部分にusing UnityEngine.SceneManagement;が必須なので注意してください。

得点の表示方法

ブロックを壊した時に得点が加算されますが、この時に先ほどの仕組みと同様に、GameObject.Find(ゲームオブジェクト名)で、GameManagerを取得しています。

GameObject.Find(“GameManager”)の意味は、これでUnityのHieralcyViewで名前がGameManagerのゲームオブジェクトを取得するという意味です。ちょうど以下の画像で、”GameManager”をクリックしたのと同じです。当然MainシーンにGameManagerゲームオブジェクトが存在するので取得できます。

002

.GetComponent<GameMaker>();の意味は、ゲームオブジェクトの中の”GameManager(Script)”コンポーネント(=部品)を取得するという意味です。例えば、.GetComponent<Transform>();とすると、座標オブジェクトであるTransformコンポーネントが取得できます。

003

この方法で、GameManagerオブジェクトを取得しています。また上記画像のように、GameManager(Script)コンポーネントにはUnityのエディターで、TextScore,TextLifeというテキストUIを割り当てているので、スクリプト上で、スコアの更新とともにTextブジェクトであるTextScoreを更新しています。

このソースコードは、BlockBehaviour.cs、HardBlockScript.cs、PenetrateBlockScript.csに書かれています。プログラミング経験がある方には冗長と感じるかもしれません。実際にGameManagerにまとめることが可能です。ですが、Unityは学ぶことが多いのであえて冗長なままにしています。

まとめ

このブロック崩しで、ブロックにヒットポイントをつけたり、画面遷移なども学びました。一定周期でブロックを移動して、プレイヤーが弾を打てば、シューティングゲームの先駆けであるインベーダーゲームになります。OpenBookを進めた後に応用としてインベーダーゲームを作ってみようと思います。

 

OpenBookのUnityチュートリアルを試してみる2

unity04

Transform#Translateを使ってプレイヤーの箱を移動しながら、ジャンプしたときにボールをInstantiateで生成するサンプルを作りました。またボールが10個以上になると、Gameoverシーンに遷移するようにしました。

 

Unity5.3では画面遷移の方法が新しくなり、SceneManager.LoadScene(“シーン名”)を使います。

物理エンジン的な移動はできていませんが、今後改善すればよいことなので問題ないです。それよりもこれを少し応用すればスーパーミートトボーイのような動きが作れることです。プレイヤーが遅いままだと退屈なUnityの学習になってしまいますが、プレイヤーの速度を変更して、色を赤にするだけで学習もはかどるように感じます。。

 

OpenBookのUnityチュートリアルを試してみる

unity03

「第2章 【第3回】Unityの基本操作」を途中までやってみました。今までブロック崩しなどで使ってきたことの再学習のため特に問題なく途中までできました。またこのチュートリアルをやってみることで、TranslateとAddForceの違いがなんとなく分かってきました。Unityの場合物理エンジンの対象オブジェクトに対して処理をさせる方法と、単純なオブジェクトに対して処理をさせる方法の二種類があり、おそらく通常のプレイヤーは物理エンジン配下になるので、AddForceなどを使い、オブジェクトの配置などはTranslateなどを使っていくのだと思われます。

 

Unityを学ぶ時のポイント

Unityではチュートリアルを見ながらひとまずゲームを作成することができるので、まずは簡単なゲームを作ってみてから、そのあとにOpenBookのUnity入門などで用語などを再確認したり、作業フローを反復して整理すると学習効率が良いのかもしれません。

プログラミング初心者にとって、Unityは学ぶことが膨大すぎるので、書籍やWebサイトで文字を読むだけで理解しようとすると、新しいことを理解するたびに過去のことを忘れて行ってしまいます。

UnityでNodeGarden その1

unity01

UnityでProcessingで作ったのNode Gardenのようなものを作って見ようとしているのですが、いくつか分からないことがあります。

エッジはどうやって作ればよいのでしょう。

ノードをつなげるエッジは、Spring Jointを使って実現できそうですが、プリミティブオブジェクトをコードで伸縮させるのは面倒そうです。それともパーティクルのようなものでエッジを実現すればよいのかわかりません。

レイキャストができるので、それで照射して一定区間なら、その光線に対してパーティクルを設定するなどができそうな気もします。

上記からできる出来ないは別にして、課題ができました。とりあえずパーティクルが面白そうなのでパーティクルを調べてみます。

  • パーティクルを調査
  • レイキャストを調査
  • ジョイントを調査

ひとまず線を引くということでよければ以下が参考になりそうです。

C#/WPFで作るデスクトップマスコット入門

デスクトップマスコットを作成するチュートリアルを見つけました。プレゼン資料ですが結構ボリュームがあるので、まったくわからない場合はここから用語や基礎を調べていけばデスクトップマスコットが作れそうです。