読者です 読者をやめる 読者になる 読者になる

プログラミングで世界を変える

ゲームプログラミングと技術のこと

Unityで子オブジェクトをソフマップ上に配置するスクリプト

f:id:splas_boomerang:20160415043612p:plain こんな感じのスクリプト書きました。

使い方

ゲームオブジェクトにスクリプトをアタッチし、子に並べたいオブジェクトを追加してください。 次に、子オブジェクトのサイズを指定するとエディタ上で並べ替えが適用されます。

子オブジェクトを追加・削除した際には、Deployボタンを押してもらうと再度適用されます。(再生時にも適用されるので、エディタ上での確認が不要な場合はしなくても結構です。)
f:id:splas_boomerang:20160415043826p:plain

使用例

f:id:splas_boomerang:20160415044453p:plain

冒頭のシーンはこんな感じで実現しています。 1個飛ばしでチェック状に配置するスクリプトなので、2枚の画像を交互に表示したい場合は子のサイズ幅分ずらして配置するとそれっぽくなります。はみ出すのは勘弁です。

ソースコード

こちらのブログを参考にしています。 kan-kikuchi.hatenablog.com

流れとしては、

  1. 子をリストに追加
  2. 列の長さを求める
  3. 各オブジェクトの配置

となっています。

配置する部分の式が非常に複雑な感じになってしまいました。シンプルにかける方法があれば教えてください。

追記(4/15)

友達に相談したらisOdd消せました。

// 変更前
bool isOdd = colLen % 2 == 1;
Vector3 offset = new Vector3(size.x * (colLen - (isOdd ? 1 : 0)), 0, size.y * colLen - 1f) / 2;
// 変更後
Vector3 offset = new Vector3(size.x * (colLen & -2), 0, size.y * colLen - 1f) / 2;

// 中略

// 変更前
childPostion.z += size.y * (((i * 2) % colLen) - (isOdd ? ((i * 2) / colLen) % 2 : 0) + (colIndex % 2));
// 変更後
childPostion.z += size.y * ((((i * 2) % colLen) & -2) + (colIndex & 1));

-2(2進数表記で11...110)でAND演算をすると必ず最下位bitが0になるので、偶数に丸め込めるらしいです。また、1(2進数表記で00...001)でAND演算をするとmod 2と同様の動作をします。bit演算って可読性は下がるんですけど、処理も高速になってめちゃめちゃスマートですね。最適化楽しくなっちゃってAND演算3箇所も使っちゃったんですけど、そのままスクリプト使う人多いと思うので、今回は「可読性<軽量化」としました。

お礼に友達のブログ貼っておきます。 nitcoder000.hatenablog.com