Unity3Dでブロック崩しを作成してWebブラウザ、iOS、Androidに対応する(ブロック破壊、プレハブ、ボール削除、当たると音、ブロックに色)

前回は単なるボールの壁当てゲーム、今回はそこにブロックを並べてブロック崩しゲームにします。
ゲーム作成後、Webブラウザ、iOS、Androidでもできるようにしてみます。

※この記事は今日から始めるUnity3Dでゲーム作りの続きになります。

ブロックを置く

はじめてのUnity:ゲームルールを構築しようを見ながら作っています。

破壊可能なブロックを1つ置く

GameObject → Create other → Cube
Position X:0 Y:0 Z:20
Scale X:5 Y:1 Z:1
名前をBlock1に変更する

ボールが当たったときにブロックを削除するスクリプトを書く
プロジェクトパネルで右クリック → Create → Javascript
ファイルの名前をBlockControllerに変更して編集する。
#pragma strict

function Start () {

}

function Update () {

}

function OnCollisionEnter(collision: Collision) {
	Destroy(gameObject);
}

BlockControllerファイルをBlock1までドラックしてドロップ。

実行すると、ボールがブロックが当たってボールが跳ね返るとともにブロックが消えました。

ブロックを複数置く

ブロックを1つだけ置いてもブロック崩しにはなりません! 10個以上置いてみましょう。といっても、上記のように設定していると面倒なので雛形を作って量産します。

まずはBlock1をクリックしてプロジェクトビューにドラッグドロップします。するとプロジェクトビューにBlock1が作成されます。

GameObjectでCreate Empty、新しくできたGameObjectの名前をBlocksに変更して、Hierarchyの中にあるBlock1をBlocksまでドラッグドロップします。

Hierarchyの中にあるBlock1をクリックしてコピーしてBlock1をたくさん複製します。

Block1のPositionを変更していって、適当に並べていきます。
面倒なので9個だけ並べることにしました。

注意です!
BlocksにもPositionの設定があって、これが設定されていると、子供Blockにも影響を与えます。BlocksのPositionは全部ゼロにしましょう。

ボールが下の壁に当たったらボールを消す

ブロック崩しのルールはボールがラケットの下にいったらゲームオーバーです。簡単にボールが下の壁に当たったらボールを消してしまうスクリプトを設定します。

Javascriptを作成してファイル名をBottomWallControllerにします。
BottomWallControllerを編集します。
function OnCollisionEnter(collision: Collision) {
	Destroy(collision.gameObject);
}
collision.gameObjectでぶつかった側が消えます。つまりボールが消えてなくなると。ちなみにgameObjectだけだと下の壁が消えます。

BottomWallControllerをドラッグしてシーンビューの下の壁にドロップします。

とりあえずこれで基本的なブロック崩しのゲームの作成完了です!



音を鳴らしたりブロックに色を付けてみよう

はじめてのUnity:演出を強化しようを見ながら作っています。

いろいろ音を鳴らしてみよう

ボールが壁やブロック、ラケットに当たったときに音を鳴らしてみます。

sound.unitypackageをダウンロードしてクリックしてImportします。するとAssetsの中に各種Soundが追加されます。

まず最初にボールが壁に当たったときの音を設定します。
HitPlaySoundというファイル名でJavascriptを作成します。
HitPlaySoundを編集します。
public var sound : AudioClip;
function OnCollisionEnter(collision: Collision) {
	AudioSource.PlayClipAtPoint(sound, transform.position);
}
まぁなんというか、そうなんだ、、でOKです。

この音スクリプトを4つの壁に設定します。
4つの壁をShiftで全部選択して、HitPlaySoundをInspectorにドラッグドロップします。すると4つの壁全てにスクリプトが設定されます。

そのままの状態でプロジェクトビューのSoundの中にあるTouchをドラッグしてInspectorのHit Play SoundスクリプトのSoundの場所にドロップします。

これで実行するとボールが壁に当たるときに音がちゃんと鳴ってくれます。

ブロックを全部選択してHitPlaySoundを登録してDamageを設定します。
ラケットにもHitPlaySoundを登録してTouchを設定します。
下の壁はTouchではなくDeathを設定し直します。

最後にMain Cameraを選択して、プロジェクトビューのSoundのBGMをInspectorにドラッグドロップします。
BGMはこのままだとうるさすぎるのでVolumeは0.02くらいにしてしまいましょう。

以上で、ボールが壁やラケットに当たると跳ね返る音がでて、ブロックを壊すと壊れる音が出て、下の壁に当たるとゲームオーバーの音が出て、あとついでにゲームの間にBGMが流れます。

ブロックに色を付けてみよう

ブロックが白のままだと味気ない?
ということでブロックに色を付けてみます。

プロジェクトビューで右クリック → Create → Material
ファイル名をBlockMaterial 1に変更します。

一番上の段のブロックを3つ全て選択して、BlockMaterial 1をInspectorにドロップします。
Main Colorの右側にある白い小さなボックスをクリックしてブロックの色を変更します。

同じようにBlockMaterial 2を作って中段のブロックの色を変えて、BlockMaterial 3でも下段のブロックの色を変更します。

そして、できあげるのがこれです。



以上でUnity3Dを使ったブロック崩しゲームの作成完了です!

Webブラウザ、iOS、Androidに対応しよう!

今までUnity3Dのツール内で実行してブロック崩しゲームをしていました。
ここでWebブラウザ、iOS、Androidでできるようしてみます。

Unity3DのゲームをWebブラウザでできるようにする

まず最初に一番簡単そうなWebブラウザから対応してみます。

Unity
File → Build Settings

PlatformにWeb Playerを選択
Add CurrentでTheGame.unityをチェック
Buildでフォルダを指定してOK

Webブラウザ用のファイルを作成してくれます。ここで作成されたBuild.htmlをクリックすればWebブラウザで先ほど作ったブロック崩しゲームをすることができます。

で、今この場所でゲームをしたい場合どうすればいいのかというと、、、
UnityDogというWordpressのプラグインがあるそうです。

これを使えば埋め込めるんだとか?
UnityDogをインストール。

Build.unity3dをメディアの新規追加でアップロード
あれ? アップロード先でBuild.unity3dの後ろにzipがくっついた。。

<unitydog width="640" height="480" src="http://denshikousaku.net/wp-content/uploads/2014/10/Build.unity3d.zip"></unitydog>


とりあえず動いたので良しとしましょう!

Unity3DのゲームをiOSアプリとして動かす

前提条件:既にXcodeがインストールされている

Unity
File → Build Settings

PlatformにiOSを選択
Scenes In BuildでTheGame.unityをチェック
Player Settingsをクリック
表示されたInspectorの中のOther Settingsをクリック
SDK VersionをSimulator SDKに変更(これを変更しないとXCodeでSimulatorが使えません)
Buildをクリック
Save AsをBuild for iOSにしてOK

これでブロック崩しゲームのiOSバージョンを作成してくれます。

作成されたファイルの中にUnity-iPhone.xcodeprojがあるのでそれをダブルクリックします。

Xcodeが起動してブロック崩しゲームのiOS版のプロジェクトを読み込みます。
読み込み終わったら、とりあえず実行しています。

下記のエラーが出て実行できません。
Undefined symbols for architecture i386:
  "_clock$UNIX2003", referenced from:
      _substanceHandleSwitchHard in libiPhone-lib.a(apihandle.o)
      _mainRenderProcess in libiPhone-lib.a(mainrenderprocess.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

エラー原因は分かりませんがmain.mmの一番最後に下記のコードを追加することでエラーがでなくなる。
#include <time.h>

extern "C"
{
    clock_t
    clock$UNIX2003(void)
    {
        return clock();
    }
}
このコードはやめたほうがいいらしいですが、でも現時点でこれ以外にエラーの直しようがわかりません。。

再び実行してみます。
Simulatorが真っ黒なままです。

しばらくして真っ暗なシミュレーターの画面に下記のロゴが出てきます。

POWERED BY
unity

メモリをバカ食いします。
非力なMacbook whiteでは力不足な模様です。。
新しいMacbookがほしいです。

Unityのロゴが出たままかなり待ちます。
ようやくiPhoneシミュレータでブロック崩しゲームが起動しました。

起動したけど、ブロック崩しの外枠がシミュレータの画面からはみ出してます。
あと、ラケットが動きません。。。ラケットをキーボードの矢印で動かしていたので、タッチには反応しないようです。

とりあえずiOSアプリとして動いたのでOKとしましょう!



あ、なんかXcodeが壊れた・・・。
Xcodeで実行するとSimulatorが起動した後にXcodeがクラッシュするようになった。

“Xcodeを削除して、App Storeからダウンロードし直してください。”

めんどくさい。。
Xcodeを削除して再インストールし直した。

が、同じくクラッシュしてしまった。
よくよく見るとこんなメッセージが入っていた。
Crashed Thread: 17 lldb.process.internal-state
Code Signature Invalid

Code Signing Identityを変更しても効果なし。

iPhone5(iOS7.1)のシミュレーションに変更すると下記のエラーが出てクラッシュする。
Dispatch queue: DBGLLDBLauncher Serial Queue

よくわからなくなってきたので、もう一度UnityからBuildし直す。
同じくダメでした。

何度も何度も色んなパターンで試した所、
iPhone6のシミュレーションでクラッシュすることがわかりました。

とりあえずiPhone6のシミュレーションは当分使わないということで対応してしまいましょう。

Unity3Dのゲームをアンドロイドアプリとして動かす

前提条件: Android Studioがインストールされている

端的に言うと、Unityで作ったゲームをアンドロイドアプリとして動かすのはかなり苦戦しました。でも、何とかできました。

まず最初に、Android Studioを起動する。
適当なプロジェクトを作る。
プロジェクトを作る際のAndroid APIのバージョンは19にしておく。

プロジェクトを作成すると出てくる画面
Tools → Android → SDK Manager
Android 4.4.2(API19)のSDK PlatformとARM EABI v7a System Imageをチェックしてインストールする。
インストールし終わったらAndroid SDK Managerを閉じる。

次にシミュレータをアンドロイドデバイスを登録する
Tools → Android → AVD Manager
既に登録されているデバイス(AVD Nameなんちゃら)を削除する。
次にCreateをクリックして新しいデバイスを登録する。

新しいデバイスに設定する各項目
AVD Name: Nexus
Device: Nexus 4
Target: Android 4.4.2 – API Level 19
CPU/ABI: ARM(armebi-v7a)
Skin: WVGA800
Memory Options RAM 768
Use Host GPUをチェックする
最後にOKを押す

UnityのゲームはARMしか動きません。(近いうちにIntelに対応するらしいです)
Use Host GPUにチェックしないとOpenGLがこける。
デバイスのAndroidのバージョンがある程度高くないとOpenGLがこける。
CPUがIntelだとこける。

UnityのゲームをAndroidのエミュレータで動かそうとすると罠が沢山用意されてました。

新しいデバイス選択したままでStartボタンを押します。
かなり時間がかかると思いますがAndroidのエミュレータが起動します。
非力なパソコンだとエラーが出てくるので、上等なパソコンでエミュレータを動かしましょう。

4年前のMacbookはへばってダメでした。

エミュレータが起動し終わったらロックを解除してそのままの状態にしておきます。
エミュレータが動いている状態で、UnityをAndroid用にBuildしてRunします。

Unity
File → Build Settings
PlatformにAndroidを選択してPlayer Settingsをクリック

Inspectorの中の項目を少し変更する
Minimum API Levelを2.3.1にする。
Install LocationをAutomaticにする。

Build And Runをクリック
適当なファイル名を入力する。
Android SDKのインストール先を聞かれたらその場所を教えてあげる。

これで自動的に動いているエミュレータを探してくれて、
作成したUnityゲームをAndroidにインストールしてくれます。



初めてのUnityゲームの作成、これにて完了です。

Webブラウザへの対応は非常に簡単でした。iOSアプリへの対応にはわりと苦労しましたが、しばらくすればUnityがiOS8.0に完全に対応すると思うので、みんなはこの苦労をしなくて良くなると思います。アンドロイドアプリへの対応はかなり苦労しました。たぶん、みんなも同じく苦労にぶつかると思うので上記のやり方を少し参考にしてみてくださいな。Androidは実機を持っていればそんなに苦労しないかな?(ちなみに私はAndroidの実機はまだ持ってません・・)

コメントを残す

メールアドレスが公開されることはありません。