2D画面に線を引く Line Renderer

Unity2D で 線を引きたかったので、Line Renderer を使ってみることにした。
「Add Component」 → 「Effects」→ 「Line Renderer」で追加できる。

Positions で 始点と終点の座標を指定し、Parameters で 色や太さを指定できる。
Unity4.5を使っているが、2DでEffectsを使うには Sorting Layer と Order In Layer をスクリプトから指定しないといけない。
例えば、以下のように指定する。

1
2
3
LineRenderer line = GetComponent<LineRenderer>();
line.renderer.sortingLayerName = "Effect";
line.renderer.sortingOrder = 1;

そして、Line Renderer の Materials を指定しなければいけない。
例えば、インスペクタビューからLine Rendererの Materials に Sprites-Defaultを指定する。
これで色もちゃんと反映されるし、描画もちゃんとされる。

背景をスクロールさせる

背景のスクロール

2Dゲームの背景の画像をスクロールさせて動いている感を出したい。スクロールはループして、常にぐるぐると動かしたい。

Turtorial - 2D Shooting Game 第06回 背景を作る

このチュートリアルが参考になる。しかし、「MaterialsフォルダにあるBackground-FrontをQuadにドラッグ&ドロップします」とあるのだが、
Background-Frontというマテリアルの作り方に関しては記載がない。というわけで、そのMaterialを自分で作る。

テクスチャの用意

まず、スクロールする画像をUnityのProjectにドラッグアンドドロップして読み込む。このとき、Texture Type が Sprite になっているので、これをTextureにする。そして、Wrap Mode を Repeat にすればOK。下記画像を参照。

Texture設定

ただし、このときプラットフォームをAndroidやiOSにしていると、「Graphics device doesn’t support Repeat wrap mode on NPOT textures.」と表示される。画像がNPOT(2の累乗のサイズ)じゃないので、Repeatにできないらしい。
仕方ないので、画像を 512 x 32 とか 256 x 128 とか、2の累乗のサイズにする。

マテリアルの作成

次に、Project の Create から Material を選択し、Material を作る。このMaterialに上記で作成したTextureを貼る。
そして、Material の Shader を 「Unlit / Transparent」 にすればOK。
あとは、例のチュートリアル通りでできた。

Custom Field Template で 動的にselect box を生成する

Custom Field Template の セレクトボックス と DBの連携

Custom Field Template を使っていて、DBの情報でセレクトボックスを生成したいことがあった。
そのため、動的にセレクトボックスを生成する必要がある。
JavaScriptからやるのは、面倒なのでやりたくない。どうにか Custom Field Template の機能でできないものかと検索したら出てきた。

http://wordpress.org/support/topic/plugin-custom-field-template-dynamic-select-list

PHP CODE オプション

つまり、Custom Field Template の PHP CODE の機能を使うことで実現できる。

1
2
3
4
[something]
type = select
code = 0
selectLabel = 選択してください

こういうふうに指定して、Custom Field Template の設定画面にある PHP CODE の 0 番目に以下のように記述すればOK。
$values に optionタグのvalue を、 $valueLabel に optionタグの中身を記述する。

1
2
3
4
5
$data = something() // dbから取得したと仮定
for($i = 0; $i < count($data); $i++){
$values[$i] = $data['id'];
$valueLabel[$i] = $data['name'];
}

cheerioを使ってクローラを作る

Node.js でクローラ

ちょっとクローラが必要になった。相当前にpythonで書いた覚えがあるけれど、今回はちょうどnode.jsの環境が手元にあるのでそれでやる。

jsdom を使うと、jQueryでいろいろできて便利そうなので、jsdomをnpm install しようと試してみた。
が、node-gypというのに依存しているらしく、こいつの動作には「Microsoft Visual Studio C++ 2012 for Windows Desktop (Express version works well)」が必要みたいで、ちょっと面倒そうなのでやめた。

cheerio を採用

調べてみると、cheerioというのでも、同じことが実現できるそうで、これを使うことにした。
あと、同期的に書きたいので、前の記事 で使ったfibrous も使う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var request = require('request');
var cheerio = require('cheerio');
var fibrous = require('fibrous');
var fs = require('fs');
function sleep(ms, cb){
setTimeout(function(){
cb(null);
}, ms);
}
var requestUrl = 'http://hogehoge';
fibrous.run(function(){
var res = request.sync({url: requestUrl});
$ = cheerio.load(res.body);
$('img').each(function(i){ // 例えば、画像を全部DLする
var src = $(this).attr('src');
request(requestUrl + src).pipe(fs.createWriteStream('download/' + i + '.png')); //適当なファイル名に書き出し
sleep.sync(5000 + Math.random() * 5000); //大量にアクセスいくのもあれなので、適当に時間間隔を設けてみる。
});
});

fibrous で 同期処理

fibrous を使うと コールバックを使わないと書けない非同期処理を同期処理的に書けて、コールバック地獄がきれいに書けて良い。

インストールは npm install fibrous でOK。

これを使うと例えば、 request で url の情報を取得するときは、以下のように書ける。

1
2
3
4
5
6
var request = require('request');
var fibrous = require('fibrous');
fibrous.run(function(){ // fibrous でラップしないといけない
var res = request.sync({url: requestUrl});
console.log(res.body);
});

スリープ的なのも書きやすい

1
2
3
4
5
6
7
8
9
10
function sleep(ms, cb){
setTimeout(function(){
cb(null);
}, ms);
}
fibrous.run(function(){
console.log('sleep');
sleep.sync(1000);
console.log('wake up');
});