かずおの開発ブログ(主にRuby)

日々の開発のことを色々書きます。

Unity5の新しいAssetBundle機能を使ってサーバーからAssetBundleをダウンロードする

※こちらの記事の内容についてOSごとのビルド分けを行っていないためPC上では動作しますが、実機に移したときに動作しません。 実機に移して使えるものについてはこちらを参照ください。

kazuooooo.hatenablog.com

AssetBundleをビルド

  1. まずAssetBundleビルドに含めたいアセットを選択して、含めたい階層を選択します (このときスラッシュで区切ることでフォルダ配下にフォルダの作成が可能)

f:id:kazuooooo:20150614131758p:plain

2.Editorフォルダ配下にCreateAssetBundlesスクリプトを作成

gist.github.com

  • エクスポートされる各々のAssetBundleはAssetBundleメニューで作成した名前を持つ
  • 各々のAssetBundleは.manifest拡張子に関連付けられているファイルを持つ(Assetの依存関係の情報を持っている)
  • さらにAssetBundleとAssetBundles.manifestファイルが作成される

3.プロジェクトフォルダ内に出力フォルダと同名のフォルダを作成(この場合はAssetBundles)

f:id:kazuooooo:20150614133337p:plain

4.Buildを押すとAssetBundleが生成される。

f:id:kazuooooo:20150614133614p:plain

AssetBundleを任意のサーバーにアップロード

(こちらはUnityと直接関係ないので割愛します)

AssetBundleをダウンロード

ダウンロードするスクリプトを作成 gist.github.com スクリプトを作成したら適当なオブジェクトにアタッチしてBundleURLとAssetNameを設定

f:id:kazuooooo:20150614144935p:plain

再生ボタンを押すとオブジェクトがシーン上にオブジェクトが生成されます。 Assetsフォルダ配下にデータが入っていなくても作成されること(WebServerからデータをとれてきている)ことを確認してみてください。

f:id:kazuooooo:20150614145218p:plain

参考 docs.unity3d.com

https://github.com/kiyoaki/AssetBundleSample

Generics

動画

Unity - Generics

Genericsメソッドやクラスの型を呼び出しもとで決めれるようにしたもの

Genericメソッド

Tの部分は呼びだし元が定義する。(複数型を使いたい場合はT,U,Vで3つまで定義が可能)

gist.github.com

gist.github.com

Genericクラス

そもそもnewしないのであまり使わない??

gist.github.com

gist.github.com

Statics

Staticな変数

これは既知の通り。ゲーム内で共通に用いられる値(例えば敵の数)についてはstaticそうでないクラス単位で持つ変数についてはstaticにしないというルール

Staticなメソッド

これも既知の通りで、staticなクラスで作ったメソッドは他のクラスからもバンバン使えて下記のようにUtilitiesとして用いると便利。ただstaticなメソッドからstaticな変数しか使えないというが、普通にstaticをつけてない変数でも使えてしまうのでそのあたりが謎。。

gist.github.com

gist.github.com

動画

unity3d.com

Properties

Unity - Properties

プロパティとはメンバ変数をカプセル化して、外部から変数へのアクセスをより柔軟に変更できる仕組みです。 まずは基本的な使い方から。 このように変数はprivateにしてプロパティを変数名の大文字にして書くのが一般的な書き方です。get, setの部分をアクセサと呼び、それぞれ変数の読み取り、書き込みを定義します。これにより外部からはプロパティ経由でしか変数にアクセスできなくなります。 gist.github.com アクセスするサンプルのスクリプトはこちら。 動画ではPlayerクラスをnewしていますが、あまりやらない方法(というか上記スクリプトではmonobehaviourを継承させているのでNew出来ないの)なのでgetComponentしています。 gist.github.com

さて上記だと結局public変数と同じじゃないかと思うかもしれませんが、プロパティを定義することで便利になることが2つあります。 * 読み取り専用、書き込み専用の変数が作れる このようにgetやset部分を消去することで読み取り専用、書き込み専用の関数を簡単に作ることが出来ます。 gist.github.com

  • アクセサは関数と同じように扱うことが出来る。 get,setの中で関数を呼ぶことが可能です。例えば下記のように書くことで、値を代入するだけでsetアクセサ内で関数が呼ばれて、3乗した値がセットされるといった具合です。set関数内でCoroutineを呼んで値が変わる度にメソッドを走らせるといったことに用いると便利です。 gist.github.com

とはいったもののいちいちpropertyを書くのは面倒だといった人も多いかと思いますが そんなときは省略形が便利です。 このように書くことで省略して記述が可能です。 gist.github.com

簡易ダメージスライダーの作成

今回はゲーム制作によく使われるダメージスライダーを作成してみます。

完成図

youtu.be

準備(iTweenをインポート)

今回はiTweenというUnityAssetを使用しますので、予めimportしておきます。

itween - A simple, powerful and easy to use animation system for Unity. - Google Project Hosting

シーンを作成

まず下のようなシーンを作成します。 f:id:kazuooooo:20150520185811p:plain 1.Canvas配下にSliderComponentを作成(GameObject→UI→Slider)。

2.Handlerは今回不要なので削除。

3.SliderのTargetGraphicにFillを設定します。FillのImageのColorもなんか好きな色に変更します。

f:id:kazuooooo:20150520190123p:plain

4.あとは写真のようにボタンやテキスト、背景の白いイメージなどを配置して完了です。

5.最後にSliderCoponentのValueを変更してScene上のSliderに反映されることを確認してください。

スクリプトを作成

DamageSlider.csという名前でSliderに以下のスクリプトをアタッチします。 ポイントはiTweenのValueToメソッドを使ってTween発生中に繰り返しコールバックを呼んでいるところです。 これによって、ライフがだんだん減っていくように見えたり、数字が動きをもって減っていったりするのを実現しています。 細かい処理の説明はコメントを御覧ください。 gist.github.com

確認

では最後にうまく動くか確認してみましょう。ダメージのボタンにOnClickメソッドでdamageLife(引数は100にデモしてみてください)を設定して、クリックしてみましょう。 f:id:kazuooooo:20150520194709p:plain

ダメージスライダーは結構既成のものもたくさんありますが、一度自分で実装しておくと、理解がすすんでいいのではないでしょうか!