AoS/SoA
Array of structures(AOS)
Structure of Arrays(SOA)
先日、Android Developer blog にデータ指向プログラミングという記事が掲載され、その翻訳記事もポストされていた。
少し検索してみると、こういう記事も出てきており、
折衷案についても触れられている。
最初のブログもサンプルに書かれているのは物理のコンポーネントであるので、
内部では配列で保持しているケースだけど、
おそらく更にそれを使用しているオブジェクト側は、
そのコンポーネントの参照を保持するなど、
AoSな作りになるってことを想定しているのではないかな。
おはじきゲーム
子供が親の職業を把握していて、 なんかゲーム作ってよ、みたいなことを気軽に言ってくれることもあり、 日曜の午後は一緒に作ろう的な感じでUnityいじってた。
インゲームの遊びとしては、オハジキゲームというか、 スリングショットというとちょっと違うのかな? まあ、モンストみたいな感じ。 コインみたいのを、引っ張って離すと、 飛んで行って、他のオブジェクトを弾いたりするっていう。
公開する予定もないものなので、デザインは躊躇なく拝借。 ここらへん気軽なところ。 子供のために作るゲームって色々気軽で良いっていう気づき。 公開しないでいいので、マネタイズなんて考えないでいいし、 ゲームデザインを拝借してもいいし、 粗があってもいいし、 子供なので喜びのハードルが高くない。 子供駆動開発。
以下、ざっくりやったことのメモ。
プロジェクト生成
2Dで作成。
自キャラのコイン
- 円形の画像を作りSpriteに。今回は子供の写真を使ってやった。
- Circle Coolider2D設定
- Rigidbody2Dを設定。gravityは必要ないのでgravity Scaleを0
- Collision DetectionはContinuous。コリジョン抜け防止。
BG
- 背景画像をSpriteで配置
壁
- Cubeを作成
- BoxCollider2Dを追加
- Physics2DMaterialを作成し、Bouncinessを0.8に。Colliderに設定。
- 複製し、transformを調整して四方に配置。
入力操作
public class Coin : MonoBehaviour { [SerializeField] float m_speedScale = 800.0f; Vector3 m_dragBeginPos; Vector3 m_dragEndPos; void Update () { if( Input.GetMouseButtonDown(0) ) { m_dragBeginPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); } if( Input.GetMouseButtonUp(0) ) { m_dragEndPos = Camera.main.ScreenToWorldPoint(Input.mousePosition); var d = m_dragBeginPos - m_dragEndPos; GetComponent<Rigidbody2D>().AddForce(d * m_speedScale); }
結局、自キャラの操作までだけど、 結構受けがいい感じ。 もうちょっとオブジェクトとか足してみるかも。
Behavior Designerでユニティちゃんを動かしてみる
先日Behavior Designerを試してみた続き。
Behavior Designerを試してみる - kurihara-nの日記
SDユニティちゃんをインポートして、
シーンに配置、そのオブジェクトに対してBehavior treeを作っていく。
基本的には前回と同じく、Can see object になったらそのターゲットオブジェクトを追跡するというもの。
ただ、追跡中にアニメーションが走りモーションになるように
Play(Animator)タスクをSeekとparalelに配置しています。
見る場合はChrome以外のブラウザで見てください。
https://dl.dropboxusercontent.com/u/91649958/Unity/BehaviorDesignerUnityChan/WebPlayer.html
ユニティちゃんのアセットについていたOnGUIの処理をコメントアウトする以外は
コーディングを全くしないでここまで作れています。
Behavior Designerを試してみる
Unityにおけるビヘイビアツリー作成アセット、Behaviour Designer.
Opsive.com :: Behavior Designer
https://www.assetstore.unity3d.com/jp/#!/content/15277
$75ドルで購入可能。
Overviewで説明しているActionはMovement packに含まれています。
https://www.assetstore.unity3d.com/jp/#!/content/16853
これは別途$10のアセットなのですが、
The Movement Pack is free for new Behavior Designer purchases - just send us your Behavior Designer invoice number.
とあり、Behavior Desinerを購入してすぐにコンタクトとると無料で手に入るみたいです。(2015/07/23現在)
僕はぼんやりしていて間があいたので別途購入しました。
こちらのOverviewを見たり、
ドキュメントを読んだりしつつ簡単なツリーを作ってみました。
Videoだと省略されている前準備として、使っているSeek actionはNavMeshを使うので、
NavMeshがBakeされた地形と、
seekerとなるオブジェクトにNavigation agentがアタッチされている必要があります。
こんな感じでシーンを用意しました。
赤いキューブがターゲットとなるオブジェクトで、
アニメーションをつけて左右に反復移動をしています。
緑のキューブが追跡する側のオブジェクトとなり、
このオブジェクトにbehavior treeを持たせます。
緑のオブジェクトを選択した状態で、
[Tools] > [Behavior Designer] > [Editor] でエディタが開きます。
これは完成した状態のツリーです。
完全なエディタで編集が出来るので素晴らしいです。
基本的にはOverviewで作っているものと同じものです。
このツリーでは末端のアクション以外の制御ノードとしての
Compositesが2つあり、
それがSelectorとSequenceです。
SelectorはORとして動作するもので、子のノードいずれかがtrueの場合そちらを実行します。
Sequence はANDとして動作するもので、
子のノードをTrueのうちは順番に実行します。
優先度は左側が高くなります。
このツリーは、ターゲットが一度視界に入ったら、そのあとはそのターゲットを追跡(seek)し、
ターゲットが視界に入るまえは右側のseek(指定のポジションまでの移動)を行う、という動作をします。
CompositesはAbort typeがあり、none, low priority, self, bothがあります。
ここが少し分かりにくかったのですが、
http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=89
こちらに詳しく書いてあります。
通常は最適化のために他のノードが実行中であれば、なにもしないようになっているので、
この例のツリーでSequenceのabort typeをnoneのままにしていると、
初期状態でターゲットが視界に入っていないと
Falseを返し、そのまま右側のSeekのみ、その後は実行されることになります。
なのでSequenceのabort typeはlow priorityを指定します。
これは、そのノードが一度FalseになってもTrueになる条件が成立すれば、よりlow priorityのものを中止し、
自分の実行を行うようになります。
Selfは自分の子を実行中でもFalseとなる条件では自身の実行を中止するようになります。
Both は low priorityとselfの両方となります。
実行すると、最初は緑のキューブが奥方向に進み、
赤のキューブが視界に入った時点で、そのキューブの追跡をするようになります。
Sequenceのabort typeをbothにすると、
ターゲットの追跡をしているときに、再度視界の範囲からターゲットが抜けると、
追跡をやめて、
指定位置への移動へ戻るという挙動をするようになります。
Behavior designerはかなり優れたアセットなので、
もっと使ってみたいと思います。
Import Sketchup format in Unity 5.1
先日のGTMFのライブ中継を見ていて、
Unity5.1からSketchupというツールからの読み込みができるようになったということを知りました。
ちょうどUnityのNavMeshを試すときに、
少しだけ地形に凹凸をつける必要があり、
そのためのメッシュを出力するのに使ってみたところ便利でした。
SketchUpはこちら
SketchUpでこんなモデルを作って
ファイルを保存する(.skpファイル)
で、そのskpファイルをUnityのProjectツリーにドロップするとMeshができて、シーンに配置することができます。
このオブジェクトをstaticにして、
[Window]>[Navigation]からnavigation用のウィンドウを開いて、
そこからNavMeshのBakeをするとこんな感じです。
便利っ。
2015年第二十九週 7/12〜7/18 退職エントリー
例によって定期ブログ書き忘れている。
今年の最初に週一で書こうと思っていたのになー。
Unity StateMachineBehaviour
Unity5で追加されたStateMachineBehaviourを使うと、
アニメーションの状態によってなにかする、ということがスッキリ書けるようになったみたい。
具体的には
にあるように、
animator.GetCurrentAnimatorStateInfo(0).isName("Idle")
はもう書かずにすむようになりました。
実際、これを書くときモヤモヤしてました。モヤモヤ。
ちょっと試してみたのですが、
例えばジャンプ中に入力による移動をさせないようにするためのbool パラメータをアニメータに持たせてOnStateEnter,OnStateExitでon/offするようなもの。
このForbidWalkを追加したステートではフラグが立ち、オブジェクト側のMonoBehaviourで移動処理のさいにチェックをすると、
移動可能なステートでのみ、移動を行うというようになります。
自分が試した際は、transformの移動処理はMonoBehaviourに書いたのですが、
更にWalkステートに移動のStateMachineBehaviourを足すことで、
そちらで移動処理を行うこともできます。
アニメータに任せて大丈夫な限りは、そういう風にしちゃって良さそう。