タイムラインに置いて、名前をつけたシンボルのインスタンス名を取得するうまい方法はないだろうか。


随分あけてしまいましたが、なかなか書くネタを搾り出すのも大変ですね。もうちょっと間隔を狭められるように書けたらいいなと思ってます。

今回はFlash使ってて変な現象に出くわしたのでその話。

まあタイトルの通りなんですが、タイムラインに配置して、同じシンボルを違う名前で配置する時というのはそれなりにあると思います。タイムラインに置いてしまったほうが位置の調整が楽ということもあり、たまにやります。

で、タイムラインに配置したオブジェクトを、『オブジェクトにつけた名前はそのままに、インスタンス名に応じて処理をする』という処理が必要になりました。まあASだけで配置していれば適当に名前をつけてグループ化すればよかったんですが、タイムラインに配置しているので、そうもいかない。

諦めてASで配置することも考えましたが結構な手間になってしまうので、何か方法はないか、ということで探ってみたら、擬似的に何とかできました。

方法 → 対象となるオブジェクトの1フレーム目にラベルを付ける

ラベルがついていればMC.currentLabelで取得できるので、そこから名前を情報を取得する、と。うーん、多用すべきでないテクニック臭がプンプンしますね。どう考えてもスマートじゃありません。しかしまあ、目的は達成できてるので、OKとしておきます。

調べていく過程で気づいたのは、「対象となるオブジェクト自身のタイムラインのフレームアクションに何かしらのスクリプトが記述されていればインスタンス名が取得できるようになる」ということです。スクリプト、と言ってはいますが、単なるコメントのみならず半角スペース1つ入れるだけでインスタンス名が取得できるようになります。

trace((対象オブジェクト).toString())

というような感じで。(toString()は無くても動作します。)

通常、何も書かれてなければ

[object MovieClip]

になるけれど、何かしら書かれていると、

[object インスタンス名_数字]

となるので、インスタンス名を切り出せば使えることになります。

ただこの方法だと、MovieClipでない新しいクラスが作られているようにも見えるので、あまり良くないような気もします。どちらがメモリを食うか等々は調べてないので不明です。その作り方が悪い、というのはもっともな話ですが、小細工をすればある程度のことは何とかなるようです。

↑以外でもスクリプト付けたし法ではうまく行かない条件が何かあった気がするんですが(MovieClipに変換されますのような警告がでた気が)、また同じ状況に出くわしたら書いてみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です