AoS/SoA

Array of structures(AOS)

Structure of Arrays(SOA)

先日、Android Developer blog にデータ指向プログラミングという記事が掲載され、その翻訳記事もポストされていた。 

googledevjp.blogspot.jp

 
データ構造により演算時間の計測結果の差とアーキテクチャの説明に触れてて分かりやすい記事だと思う。
思う、のだけど、ちょっと片手落ちというか、
これだけ読んで、SOAが正義と思われるとそれは困るものであり、
オブジェクト指向プログラミングとの折衷について触れてくれないと片手落ちという気がします。
効果的なケースにおいて、適切に用いるべきで、
更にはオブジェクトとして使うような場合にも混乱が無いようにしておくのも大事。
もし、この記事を受けて、全ての個別要素を配列で持つように設計してしまい、
議論の際に、盲目的に「こっちのほうが高速なので」という主張をされることがあっては辛い。
 

IntelとCell/B.E.のベクトル演算 − @IT

少し検索してみると、こういう記事も出てきており、

折衷案についても触れられている。

 

最初のブログもサンプルに書かれているのは物理のコンポーネントであるので、

内部では配列で保持しているケースだけど、

おそらく更にそれを使用しているオブジェクト側は、

そのコンポーネントの参照を保持するなど、

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を作っていく。

f:id:kurihara-n:20150727004449p:plain

 

基本的には前回と同じく、Can see object になったらそのターゲットオブジェクトを追跡するというもの。

ただ、追跡中にアニメーションが走りモーションになるように

Play(Animator)タスクをSeekとparalelに配置しています。

 

f:id:kurihara-n:20150727004352p:plain

 

見る場合は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現在)

僕はぼんやりしていて間があいたので別途購入しました。

 

www.youtube.com

こちらのOverviewを見たり、

ドキュメントを読んだりしつつ簡単なツリーを作ってみました。

 

Videoだと省略されている前準備として、使っているSeek actionはNavMeshを使うので、

NavMeshがBakeされた地形と、

seekerとなるオブジェクトにNavigation agentがアタッチされている必要があります。

 

f:id:kurihara-n:20150723163022p:plain

こんな感じでシーンを用意しました。

赤いキューブがターゲットとなるオブジェクトで、

アニメーションをつけて左右に反復移動をしています。

緑のキューブが追跡する側のオブジェクトとなり、

このオブジェクトにbehavior treeを持たせます。

 

緑のオブジェクトを選択した状態で、

[Tools] > [Behavior Designer] > [Editor] でエディタが開きます。

f:id:kurihara-n:20150723163859p:plain

これは完成した状態のツリーです。

完全なエディタで編集が出来るので素晴らしいです。

基本的には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の両方となります。

f:id:kurihara-n:20150723165620p:plain

実行すると、最初は緑のキューブが奥方向に進み、

赤のキューブが視界に入った時点で、そのキューブの追跡をするようになります。

 

Sequenceのabort typeをbothにすると、

ターゲットの追跡をしているときに、再度視界の範囲からターゲットが抜けると、

追跡をやめて、

指定位置への移動へ戻るという挙動をするようになります。

 

Behavior designerはかなり優れたアセットなので、

もっと使ってみたいと思います。

 

Import Sketchup format in Unity 5.1

先日のGTMFのライブ中継を見ていて、

Unity5.1からSketchupというツールからの読み込みができるようになったということを知りました。

www.youtube.com

 

ちょうどUnityのNavMeshを試すときに、

少しだけ地形に凹凸をつける必要があり、

そのためのメッシュを出力するのに使ってみたところ便利でした。

 

SketchUpはこちら

www.sketchup.com

 

SketchUpでこんなモデルを作って

f:id:kurihara-n:20150722230250p:plain

ファイルを保存する(.skpファイル)

で、そのskpファイルをUnityのProjectツリーにドロップするとMeshができて、シーンに配置することができます。

f:id:kurihara-n:20150722230528p:plain

このオブジェクトをstaticにして、

[Window]>[Navigation]からnavigation用のウィンドウを開いて、

そこからNavMeshのBakeをするとこんな感じです。

f:id:kurihara-n:20150722230938p:plain

便利っ。

2015年第二十九週 7/12〜7/18 退職エントリー

例によって定期ブログ書き忘れている。

今年の最初に週一で書こうと思っていたのになー。

 
■最近遊んでるゲーム
 
零 濡れ鴉の巫女
ヨッシーウールワールド
 
■転職
gemeloftは7/15付けで退職して、
来月から新しい場所でゲーム作り。
ちょっとした退職エントリー。
あんまりアレコレ書かないけど。
 
今回、ちょっと予期していないタイミングで転職する必要が発生してしまい、
プロジェクトでの疲労もまだ残るなか、
職探しをしていたのがここ一月くらい。
半月くらい休もうと思って少しだけ仕事はじめまでまだ間があるけど、
この判断は正解だったと思う。
色々溜まっていたものが消化される期間、次への準備期間を満喫しています。
 
任天堂の岩田さん
月曜に任天堂の岩田社長が亡くなったというニュースが流れ、
ゲーム業界には衝撃が走った。
一度、病気で休まれていた時期があったけど、
それから回復もしたし、つい先日も株主総会に出ておられたようなので、
まさかそんな病状とは思っていなかった人が多いのではなかっただろうか。
 
僕は任天堂に対しての気持ちというのは、ちょっぴり複雑で、
ソフトやハードの大ファンっていうことはないんだけど、
ぶれない方向性は好きというか。
特に最近のゲーム産業においては、
任天堂という会社が担っている部分というのは意味が大きくて、
ある方面に関しては任天堂が守ってくれてる、というような、
だから他の会社は違う方向でチャレンジできる、という側面もあったように感じている。
その会社のありように岩田さんという社長のキャラクターが大きく影響していたのは、
結構大きいものがあったのだろうと思う。
あと、DeNAと協業して進めるはずのプロジェクトには、
僕はかなり期待していて、未知の新しい体験を提供してくれるのではと思っていて、
(もちろんそうでは無かったり、失敗もするかもしれないけど)
任天堂のゲームでありながら、スマホで展開するサービスという、
難しい舵取りが必要なプロジェクトだと予想するのだけど、
そこには岩田さんの存在が重要だったのではないかと思う。
内情は全く知らないけど、どうか上手くいって欲しいものだと思うのです。
 
あと、えらい人はなるべく長生きしてほしいなって思った。

Unity StateMachineBehaviour

Unity5で追加されたStateMachineBehaviourを使うと、

アニメーションの状態によってなにかする、ということがスッキリ書けるようになったみたい。

具体的には

japan.unity3d.com

にあるように、

animator.GetCurrentAnimatorStateInfo(0).isName("Idle")

はもう書かずにすむようになりました。

実際、これを書くときモヤモヤしてました。モヤモヤ。

 

ちょっと試してみたのですが、

例えばジャンプ中に入力による移動をさせないようにするためのbool パラメータをアニメータに持たせてOnStateEnter,OnStateExitでon/offするようなもの。

 

gist.github.com

 

このForbidWalkを追加したステートではフラグが立ち、オブジェクト側のMonoBehaviourで移動処理のさいにチェックをすると、

移動可能なステートでのみ、移動を行うというようになります。

 

自分が試した際は、transformの移動処理はMonoBehaviourに書いたのですが、

更にWalkステートに移動のStateMachineBehaviourを足すことで、

そちらで移動処理を行うこともできます。

アニメータに任せて大丈夫な限りは、そういう風にしちゃって良さそう。