EditorWindow のサイズを知る方法

position.width

position.height で取得可能

using ディレクティブまたはアセンブリ参照が不足しています。の原因

調べると、拡張定義元と呼び出し元の .NET フレームワークのバージョン違いなどがあるようだが、

自分の場合は、拡張メソッドのクラスに public を付けていなかったのが原因だった。

他にも Unity の Assets > Open C# Project などで一度エディタとの同期をとってやると直る事があるので試してみる価値あり。

[追記]

自分のクラスでエラーが出ている時にビルドすると

NGUI など他のアセットで「using ディレクティブまたはアセンブリ参照が不足しています。」が出る事があるようだ。

自分のクラスのエラーを全て直してクリーン&ビルドすれば直った。

GameObject を他の GameObject の子にする方法

Unity の Hierarchy 内で GameObject を階層構造にしたい時、

例えば、B という GameObject を A の子にしたい時は、

GameObject a = new GameObject("A");
GameObject b = new GameObject("B");

b.transform.parent = a.transform;

のように transform の parent を親にしたい GameObject の

transform にすると階層化される。

A
└B

Unity で Window 上のマウス座標を知りたい時

Event.current.mousePosition でわかる。

EditorWindow 内で毎フレーム移動座標が欲しい場合は、

初期化時に wantsMouseMove を true にする必要あり。

参考:Unity のリファレンス
http://docs.unity3d.com/Documentation/ScriptReference/EditorWindow-wantsMouseMove.html

なお、 SceneView 内のマウス座標は、 Input.mousePosition を使う。

Flash CS6のスプライトシート書き出し後 C/C++用UVテーブルを作成する

Flash CS6 でスプライトシートを書き出すという便利な機能があるが、

各スプライトのUVがXMLで吐き出されるため

スプライトシートを作ったはいいけど、iOSのOpenGLで使う時など

C/C++ でも使える形式に変換するものがないので Python で簡易スクリプトを書いてみた。

動作確認は Python2.7.2 Windows7 。 バッチ処理は Windows 向けだが

Python スクリプト自体は他の環境でも動くと思われる。

まずは以下の Python スクリプトをコピペして保存。

=====[ convert.py ]=====
# -*- coding: utf-8 -*-
import codecs
import sys, re

sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)

print u"open file.\n"

inname = sys.argv[1]
trimname= inname.split('\\')[-1].split('.xml')[0]

f = codecs.open (inname, 'r', 'utf-16')

data = f.read ()

print u"file size: " + unicode (len (data)) + u" byte(s).\n"

#print data

f.close ()

print u"replace text.\n"

xlist = re.findall (r'x="([0-9]+)"', data)
ylist = re.findall (r'y="([0-9]+)"', data)
wlist = re.findall (r'width="([0-9]+)"', data)
hlist = re.findall (r'height="([0-9]+)"', data)
nlist = re.findall (r'name="([a-zA-Z0-9_]+)"', data)

out = u"typedef struct{ int x, y, w, h } ssuv;\n\n"

if len (xlist) == len (ylist) and len (xlist) == len (wlist) and len (xlist) == len (hlist) and len (xlist) == len (nlist):

 i = 0
 
 out += u"enum {\n"
 
 for x in xlist: 
  
  print nlist[i]

  out += u"\t%(name)s,\n" % {'name' : nlist[i][:-4] }
  
  i += 1
 
 out += u"};\n\n"
 
 i = 0
 
 out += u"ssuv %(valuename)s_tex[] = {\n" % {'valuename':trimname}
 
 for x in xlist:
 
  out += u"\t{%(X)d, %(Y)d, %(W)d, %(H)d},\n" % { 'X':int (xlist[i]), 'Y':int (ylist[i]), 'W':int (wlist[i]), 'H':int (hlist[i])}
 
  i += 1

out += u"};\n"

print u"output file."

f = open (trimname + "_out.txt", 'w')

f.write (out)

f.close ()
========================

あとは引数に xml のファイルパスを渡してやれば

ファイル名_out.txt というファイルで enum とテーブルに変換したものを吐き出す。

適当にバッチ化してやると楽かも。

例えば、Windows ならさらに以下の様なバッチファイルを作成する。

=====[ convert.bat ]=====

echo off
python convert.py %1
pause

=========================

以後、このバッチに処理したい xml をドラッグするだけでコンバートされる。

ちなみに enum で定義される名前は、

シンボル名をそのまま使うのでシンボル名に全角を使わないような工夫が必要です。