unity使ってこれから何か作っていこうと思うのでめも。

最初にやったこと

【Unity】素人が7日間クソゲーを作り続けてわかったこと – uinyan. comに載っていたUNITY - Developer - はじめての Unity - 第1回 世界の「骨格」をつくろうに沿ってブロックとボールを作ってみた。
実際にどう操作するかはドットインストールのUnity講座を参考にした。

物をバウンドさせる

physicalMaterialでBouncinessに数値を入れる。1とか。1でバウンド時の力のロスが無い。

効果音を鳴らす

  • フリー効果音素材HPなどから音源をダウンロード
  • Assetに音源をドラッグアンドドロップして追加
  • 追加したいオブジェクトでAddComponentボタンからComponent>Audio>Audio Sourceを選択
  • Audio ClipにAssetに入れた音源を入れる。
  • Audio Sourceコンポーネント内で3D Sound Setting>Min Distanceを10くらいに設定

オブジェクトに設定したコードでは次のように書く。例としてスペースを押したら効果音が出るようにしてみた。
コードの設定部分でこの例の場合clipに音源を入れる(でないと聞こえなかったような)

public AudioClip clip;
public function Update() {
    if (Input.GetButton("Jump")) {
        audio.PlayOneShot(clip); 
    }
}

BGMをかける

Assetに追加したBGMをHiearchyに追加して、InspectorのLoopをチェックしたらOK

位置移動

transform.positionにVectorオブジェクトを代入すればOK
transform.position.xに直接値を入れるとC#では怒られた。

トリガで衝突判定

Collider2Dでis Triggerにチェックを入れるとTriggerを用いて衝突判定できる。衝突しないケースと衝突するケースを使い分けられるので便利。 イベントとして2Dの場合は、

  • OnTriggerEnter2D
  • OnTriggerStay2D
  • OntriggerExit2D

が使える。2Dで物理エンジン使わない時とか使える。なんか使える条件があるような情報があった。

時間待ちの作法

コルーチンを使うらしい。

public function Update(){
...
  StartCoroutine("GameOver");
}
private IENumerator GameOver(){
  yield return new WaitForSeconds(2);
  Application.LoadLevel("GameOver");
}

こんな感じ。時間待ちとは言え、動きが止まったりするわけじゃない。

座標変換

タップやクリックの座標とUnity内での座標の場合は座標変換が必要。カメラのScreenToWorldPointメソッドを使うが2Dの場合直感的に行かなく、次のようにする

Vector3 screenPosition = Camera.main.ScreenToWorldPoint(transform.position);
Vector2 clickPosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,screenPosition.z));

と2DなのにVector3(3次元座標)で指定する。

デバッグ

Unity Remoteを使う。Free Aspectだと上手く表示できないとか上手く行かないケースがあるので注意。かならずアスペクト比?を設定。

Androidへの実装

実機に実装する場合はBuild and Runをすれば良い。ただしXperia SO-01Bに実装すると初期の設定ではエラーがポコポコ出たので対処をメモしておく

iPhoneへの実装

iPhoneへの実装はios Developer Programへの登録など色々面倒で複数サイトを参考にした。 ios Developer Programへの登録などUnity関係なくやらないといけない作業は、iOSデバイス(iPhone・iPad)実機テスト | Yasushi Noguchi Classが参考になった
unity側での作業はiPhone実機でUnityを動かしてみた - unity部 | GMOメディア エンジニアブログを参考にすれば上手くいった。 バージョンが変わったりすると、また画面構成とか変わるんだろうけど。

あとiPhone初心者だったせいで、マナーモードになっているのに気づかず、音が出ないと1時間くらい悩んでた。(これでハマる人は少ないと思うけど一応メモ)

iPhoneへのadhocビルドと配布

やること色々あるので、参考にしたサイトの一覧を紹介する程度。

adhocで端末を追加したい場合に、またもハマった

EGL_BAD_MATCH

まずはEGL_BAD_MATCHというエラーが出た。ググっでも答えが出ないので、ddmsを使ってログを取ってみると、どうも32bit Display Bufferとか24bit Display Bufferの処理をした後にエラーが出てたので、Player Setting > Android > Resolution and Presentationにある32bit Dispay Bufferと24bit Display Bufferのチェックをはずした。するとEGL_BAD_MATCHは消えた。

Profiler is only supported in Unity Pro

次にProfilerも使ってないのに
Profiler is only supported in Unity Pro
というメッセージが出た。結局分からなかった。私が実装した時の問題点は画像が表示されないことだったのでこれは関係ないだろうと考えて無視。

結局画面が表示されない

Build Setting画面のTexture CompressionをDon't overrideからETC1 or RGB16に変更すると動いた! なんかどっかにこの話があったんだけど、どこか忘れたのでまた思い出したらリンクする。

その他

  • 位置のScaleを-1にして反転するとアニメーションもそのまま反転した。すごい。
  • StartよりAwakeが先に呼び出される。初期化に使える。
  • MonoDevelop-UnityをMacにインストールしてて、C#の通常アプリが作れると思ったら大間違い。C#のアプリ作ろうと思ったらXamarin Studio入れた方がよさげ。NUnitが無いって怒られて散々だった。