OpenBook「第5章 【第6回】立体迷路を作ろう」をやってみました。

unity07

本来は正確にコライダーを用意して上記gif動画のようにチートができないようにしなければいけませんが、トリガーの使い方はブロック崩しで分かっているので、コライダーは中央に1つあるだけで手抜きしました。またプレイヤーの重力の設定などが甘いため、空中を何とか移動できるようになっています。

立体迷路は、プレイヤーの移動と、ゴール時にゴールオブジェクトの色を変えるだけなので、実際には迷路をUnityエディターで作るのに時間がかかりました。OpenBookでは、プレイヤーに2つのスクリプトを割り当てる方法ですが、ゴールオブジェクトにスクリプトを用意して、ゴールの色を変更するようにしました。また、Unity5.3の場合は、renderer変数が廃止になっているのでGetComponent<Renderer>()で取得するようにしました。

 

プロジェクトの配布

Unity5.3.5f1 のC#でのプロジェクトです。Zip展開してAssets/Scenes/Main.unityをUnityで開くと、Unity上でシーンが何も指定されていない状態で表示されるので、さらにUnity上でMain.unityシーンを選択すると動かせます。

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

002

Main.unityをダブルクリックすると上記のようなメッセージが表示されます。意味は「5.0より前のプロジェクトなので、5.3.5f1とは一致してないよ」と言われています。おそらく、zipファイルを作成するときに、容量を少なくするためLibraryフォルダーとtmpフォルダーを私が削除しているためと思われます。

Unity公式フォーラムでもスレッドが上がっていました。“Your project was last opened with a different setup of Unity” after delete Library 次回何等かのUnityプロジェクトをzip化するときに、Libraryフォルダーとtmpフォルダーを削除せずにzip化してみようとおもいます。

 

まとめ

とくに難しいことはなくブロック崩しの知識のみで実装できました。プログラミングのみでこれを作るのは大変ですが、Unityの場合は、Unityエディターでほとんどを作り上げることができるので驚くばかりです。

あと、OpenBookをやっていて感じたのですが、やはりUnityはバージョンでの互換性があまりないので、チュートリアルがメンテナンスされていないと結構面倒でした。おそらく本当の初心者だとこのOpenBookチュートリアルは途中で躓いてしまうと思われます。

 

OpenBook Unity入門「【第5回】ブロック崩しの振り返り」をやってみました。

unity06

第4回でブロック崩しを作りましたが、また新規プロジェクトでブロック崩しを作り直して、OpenBook Unity入門「第5回 ブロック崩しの振り返り」をやってみました。

さすがにブロック崩しを何回も作っているので、この章は問題なく進めました。C#の場合、Vector3型の計算の記述方法がJavaScriptと異なるだけです。

C#のlocaleScaleはlocalScale.xのようにして値を変更できないので、Vector3を新たに生成して変更しています。もっと効率の良い方法があると思われますが、今はゲームを完成させることのほうが優先順位が高いため、今後の課題としておきます。

ボールの速度変更に関しては、C#のVector3型は演算子のオーバーロードがされているので、普通に掛け算ができました。これらはJava言語ではできないので便利です。

この章では、実際にプレイヤーのバーの大きさを変更したり、ボールの速度を変更する方法を実装して、機能追加の方法を学びました。本当のプログラミング初心者向けにどうやって機能を追加していけばよいかが丁寧に説明がされていました。

あとは、やってみたい機能を追加して、レベル(=面)の追加、サウンド、パーティクルぐらいでしょうか。細かいところは調べていく必要がありますが、磨き上げれば立派なゲームになりそうです!

 

 

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」をやってみる

unity02

quiitaに昔のUnity公式ブロック崩しを補完するチュートリアル([超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置)があったので試してみました。

前回ブロック崩しを作成した記事「Unity公式サイトのチュートリアルブロック崩しをやってみました。」では、パドルとボールに物理マテリアル(Physic Material)をつけて、”Friction Combine”、”Bounce Combine”は変更せずに”Average”にしていたため、パドルの物理マテリアルを外すとボールの速度が落ちてしまいました。今回のチュートリアルではCombine(衝突時)のBounce(跳ね返り)を”Maximum”にすることで、パドルのみに物理マテリアルをつけるだけで済む方法を学ぶことができました。

Unity初心者用の学習サイトや気になったことのリンク集

 

テラシュールブログ

Unity日本語公式サイトのチュートリアルで玉ころがしがありますが、一度玉ころがし(RollABall)を実装すると基本的な仕組みがわかります。改造する方法はいろいろありますが、以下の「【Unity】ユニティちゃんを転がすゲーム、UnityChanBallRollはどのように作られていたのか」は、キャラクターを使ったり背景を強力にパワーアップしているので、応用する際の参考になりそうです。またソースコードを公開しているので、実際にUnityでプロジェクトの中身を見れるのはありがたいです。

Unity公式チュートリアルの問題点

Unity公式チュートリアルの問題点

初心者が何言っているのだ!と思われそうですがとてもストレスがたまるので感じた事を書きます。

Unity公式チュートリアルをやってみて思ったのですが、頻繁に機能が変わるものには動画チュートリアルは全く向いていないようです。みなさんご存知だと思いますが、Unityはマイナーバージョンが変わると結構エラーが発生して動きません。

Unityは公式チュートリアルを動画配信していますが、Unityのバージョン毎に差分をアップロードして管理しているわけではないため、Unity最新版とチュートリアル動画で学ぶ場合は、差分情報をどこからから入手する必要があります。Youtubeのコメントや、公式フォーラムや、時には公式のサポートが差分のPDFを配布していたりします。ですがひどく面倒です。

Unity5.3で、過去のチュートリアルをやると、UIが違ったり動作が違ったりして、それが自分のソースコードの書き方や設定の仕方が正しくないのか、Unityのバージョンの差で発生しているのかなどを調べるのが結構面倒です。またYoutubeコメントは人によって、チュートリアルをやってみた時間も違うし、Unityのバージョンも違うので、スレッド管理されていないコメントはソフトウェア開発と合っていなくストレスになります。

また、テキストファイルのように調べたい文言やソースコードをテキスト検索できないため、Youtubeのスライダーを活用するのですが、1時間ある動画で、どこだったかを特定するのは非常に困難で、しっかり時系列でメモを取らないと、数日前にやったチュートリアルですら調べたいところを特定するのが困難です。

書籍やテキストファイルの場合は、ざっと見て検索、索引、目次からすぐに調べたい対象を特定できるため、当たり前のことができないため余計ストレスになります。

さらに頭にくるのは、チュートリアルで扱っているゲームはとても品質が良く、日本語翻訳もされていたりするところです。品質の悪いチュートリアルならそれで見なければいいだけなのですが、公式の開発者による作業フローが学べるのはとてもおおきいです。ボールころがし、3Dベースのシューティング、ガンアクションなどで、実例で、パーティクルや、Unityの物理や、レイキャストなど様々なことが学べるため、バージョン違いにより動画で学習するのが困難になるのはとても残念です。

Unityではなく、コミュニティーに協力してもらってGithubなどでドキュメントを作ってくれるとすごくうれしいのですがそれはそれで難しいのかもしれません。。。

Unity公式サイトのチュートリアルブロック崩しをやってみました。

001

チュートリアルで学んだこと

このチュートリアルでは、以下のようなことを学びました。

  • 当たり判定や剛体は使うけれど、重力を無視する方法
  • ブロックを壊した時の簡単なパーティクル
  • スコアやゲームオーバーのUI作成

応用として弾を打って敵を倒せるようにするとインベーダーゲームのようにできそうす。

チュートリアルのリンク

http://unity3d.com/jp/learn/tutorials/modules/beginner/live-training-archive/creating-a-breakout-game?playlist=17219

日本語でもブロック崩しのチュートリアルがある!

Unityの日本語公式にブロック崩しのチュートリアルがありました。ただし古いので、[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置 を参考にするとよさそうです。わざわざ英語でやる必要ありませんね。

一度やったことをもう一度やることは復讐になるので、次はこのチュートリアルをやってみます。

Unityで玉転がしを作ったけど面白くないと感じるなら以下を参考にするとよいです。

Unityの公式チュートリアルである「玉転がし」を作った方はたくさんいると思います。完成したらUnityの基本操作が分かりちょっとした達成感はありますが、出来たゲームは面白くありません。とりあえず作りたいゲームがあるけれど、勉強も必要なのでこのチュートリアルをやったのだと思います。

でも何が理由で、この球転がしは面白くないのでしょうか?

どうすれば面白くなるのでしょうか?以下は退屈なブロック崩しですが、エフェクトやサウンドなど小さな変化をたくさん組み合わせることで、単調なブロック崩しがジューシーに変わっていく動画です。

ゲーム制作で、自分がどう感じるかも重要ですが、動画を見ると、聴衆の引き込まれていて、楽し気な反応がとても分かりやすいです。

面白さは意外なところにあるかもしれない

Unityはアセットが豊富ですが、バラバラなアセットを使うとワールドとキャラクターが合ってなくて、いびつなプロトタイプが出来上がったりします。そして複雑なアセットや仕組みを無理に使おうとして、うまく使いこなせず、結局挫折してしまいます。

以前2Dシューティングを作ったのですが、スコアを用意して敵をいくつか用意して完成したのですが、まったく面白くありませんでした。ですがデバッグ中の設定ミスで、敵の弾のスピードを30倍ぐらいにしてしまった事があります。単純なミスなのですが、頑張って数回に1回避けれるぐらいだったので、修正せずに意地になってずっとプレイしたことがありました。デバッグのはずが夢中にプレイしていたので、この経験から面白さは、グラフィックを綺麗にだけでなく、小さな変化をどうつけれるかも考えるようになりました。

Unityを始めた方は「玉転がし」を作り捨てて、すぐ次のゲームを作り始める場合が多いと思いますが、最初に作った単調なゲームを「どうすれば面白くなるか」と磨くことも大切なのかもしれません。玉の速度をすごく速くしてみたりするだけでも、面白さのヒントは見つけられるかもしれません。

評判の悪い例も見てみる

Unity公式でも上記動画を参考に、インベーダーゲームを使って説明していました。ただ、こちらのプレゼンは画面の揺れのエフェクトがとても強かったり、調整が必要で評判が良くありません。でも評判の良い例と悪い例をくらべることで何かのヒントになるかもしれません。