Unityにおけるスクリプトの基本0
スクリプトファイルの作成
クラス名を入力
- "NewBehaviourScript"という名前のスクリプトファイルが作られるので、"Exsample"と入力して決定。
- この時、名前を"NewBehaviourScript"のまま決定するとNewBehaviourScriptというクラス名になり、再度ファイル名を変更してもクラス名は変更されないのでそのまま実行するとエラーになる。ファイル名とクラス名は一致させること。
- 一致しない時はスクリプトを開いてクラス名をファイル名と同じに修正するか、新規スクリプトファイルを作ってやり直す。
GameObjectに追加する
- スクリプトはGameObjectに追加して使用するのでまずGameObjectを作成する。
- [GameObject] > [3D Object] > [Cube] を選択
- 作成したCubeに先ほどのExsampleスクリプトをドラッグ&ドロップ、もしくはCubeを選択した状態でInspectorビューの下に表示されている[Add Component]を選択、[Script]>[Exsample]で追加 CubeのInspectorビューに"Exsample (Script)"と出ていればせいこう
スクリプトの編集
- Projectビューの"Exsample"スクリプトをダブルクリックしてMonoDevelopを起動
- 今回は↓のStartメソッドに書く
void Start () { Debug.Log ("Hallo"); // 日本語のテキストは最後に"."をつけること. }
実行
- 画面中央 上 にある再生「▶」ボタンを押す
- Console ビューにメッセージ「Hallo」が表示されていれば成功
異なるドメインからXML(RSS)を取得する
前回のエントリーで触れた、ドメインが異なるRSSをswfで取得する方法について。
今回やろうとしていること
ドメインが異なる場合flashはセキュリティの都合で外部のデータを直に読み込めない。
これだと読めない。
[ www.example.com/reader.swf ] -> [www.example.org/news.rss]
なので手を加えて読めるようにする必要がある。
色々と方法はあるみたいなんだけど、自分でもできそうなの、ということでphpを使った方法でひとまず動くことだけを目標にやってみる。
こんな感じになるようだ。
[www.example.com/reader.swf -> www.example.com/relay.php] -> [www.example.org/news.rss]
読み込むRSS
今回は、Googleカレンダーの公開カレンダーから下記のRSSを使わせてもらうことにした。
http://www.google.com/calendar/feeds/7u23mpjv9bd2hoders1fqrft74%40group.calendar.google.com/public/basic
phpの準備
まずテキストファイルを新規作成し、好きな名前をつけて拡張子をphpに変更する(今回は"calendar.php"にした)。
そしてできあがったファイルに以下を記入。
<?php $loadURL = file_get_contents("http://www.google.com/calendar/feeds/7u23mpjv9bd2hoders1fqrft74%40group.calendar.google.com/public/basic"); echo $loadURL; ?>
上書き保存。
他のRSSを読みたい場合は、"file_get_contents(〜"以下の""で囲まれた部分を書き換える。
正常に動作しているか確認したい場合は、phpが実行可能なサーバにアップロードして、そのファイルをブラウザから開いてみる。
読み込みたいRSSがブラウザ上に表示されれば成功。
flashからphpを読み込む
前回のスクリプトで、
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("〜googleカレンダーのアドレス〜", true);
とあった部分を、
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("上で作ったphpの場所", true);
に変更する。
今回は、swfとphpが同じフォルダ(階層)にいるので、単純に"calendar.php"に書き換えた。
最終的には
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("calendar.php", true);
こうなる。
これで、異なるドメイン間でも、情報を受け取るようにすることができる。
異なるドメインからXML(RSS)を取得する
前回のエントリーで触れた、ドメインが異なるRSSをswfで取得する方法について。
今回やろうとしていること
ドメインが異なる場合flashはセキュリティの都合で外部のデータを直に読み込めない。
これだと読めない。
[ www.example.com/reader.swf ] -> [www.example.org/news.rss]
なので手を加えて読めるようにする必要がある。
色々と方法はあるみたいなんだけど、自分でもできそうなの、ということでphpを使った方法でひとまず動くことだけを目標にやってみる。
こんな感じになるようだ。
[www.example.com/reader.swf -> www.example.com/relay.php] -> [www.example.org/news.rss]
読み込むRSS
今回は、Googleカレンダーの公開カレンダーから下記のRSSを使わせてもらうことにした。
http://www.google.com/calendar/feeds/7u23mpjv9bd2hoders1fqrft74%40group.calendar.google.com/public/basic
phpの準備
まずテキストファイルを新規作成し、好きな名前をつけて拡張子をphpに変更する(今回は"calendar.php"にした)。
そしてできあがったファイルに以下を記入。
<?php $loadURL = file_get_contents("http://www.google.com/calendar/feeds/7u23mpjv9bd2hoders1fqrft74%40group.calendar.google.com/public/basic"); echo $loadURL; ?>
上書き保存。
他のRSSを読みたい場合は、"file_get_contents(〜"以下の""で囲まれた部分を書き換える。
正常に動作しているか確認したい場合は、phpが実行可能なサーバにアップロードして、そのファイルをブラウザから開いてみる。
読み込みたいRSSがブラウザ上に表示されれば成功。
flashからphpを読み込む
前回のスクリプトで、
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("〜googleカレンダーのアドレス〜", true);
とあった部分を、
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("上で作ったphpの場所", true);
に変更する。
今回は、swfとphpが同じフォルダ(階層)にいるので、単純に"calendar.php"に書き換えた。
最終的には
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("calendar.php", true);
こうなる。
これで、異なるドメイン間でも、情報を受け取るようにすることができた。
↓つくってみたサンプル
http://block.sub.jp/cdtest/
Googleカレンダーをflashで読み込む
検索クエリがだめだったのか、そもそも需要がないのか、具体的なのが見つけられなかったのでメモ。
AS3.0でGoogleカレンダーを読み込んでみる。
Googleカレンダーの準備
- Googleカレンダーにログイン(もしくはアカウントを作る)
- 適当なカレンダーを作る
- 対象のカレンダーの"カレンダー設定"を開く
- "このカレンダーを共有"タブを選択して、"このカレンダーを一般公開する"をチェック*1
- "カレンダーの情報"のタブに戻って"カレンダーのアドレス"のXMLボタンをクリック
- 表示されたURLを控える
ヘルプはこちら
flashから読み込む
XMLの読み込みはXMLloaderクラスを使わせて頂いた。
上記のXMLloaderクラスを書き込んだXMLloader.asファイルと、メインの〜任意のファイル名〜.flaが同一フォルダにあるとして、メインのタイムラインのスクリプトに
// XMLloaderを継承してインスタンスを作る var myXML:XMLloader = new XMLloader("〜googleカレンダーのアドレス〜", true); // デフォルト名前空間を設定 default xml namespace = new Namespace("http://www.w3.org/2005/Atom"); // 読み込んだXMLを格納する変数 var rootXML:XML = new XML(); // イベントリスナーの設定 myXML.addEventListener(XMLloader.LOAD_COMPLETE, compHandler); // XMLの読み込みが完了したときに呼び出されるハンドラ function compHandler(evt:Event){ rootXML = myXML.getXML(); trace(rootXML.entry); }
と書くことで、
あとはいろんなサイトのサンプルで紹介されてるようなXMLの利用方法を応用すればOK。
補足?
名前空間
個人的につまづいたのが
// デフォルト名前空間を設定 default xml namespace = new Namespace("http://www.w3.org/2005/Atom");
の部分。
これを設定しないと、E4Xに準拠したXMLへのアクセスができず、出力が"undefined"になってしまう。
あまり詳しく理解できていなけれども、対象のXMLがどの規定に沿っているかをあらかじめ設定しなければXMLをちゃんと読めないようだ。
対象のXMLがどの規定に沿っているかを調べるには、XMLの先頭のタグの中にあるいくつかある"xmlns〜"と書かれた値のうち、xmlns="http〜 のようにxmlnsの次に:が続いていない行の""で囲まれた文字列を見る。Googleカレンダーの場合は"http://www.w3.org/2005/Atom"の部分を引数として名前空間を設定する。
クロスドメインについて
今回は話を単純にするために省いたけれど、これをwebサーバにそのまま上げてもクロスドメインが解決されないのでちゃんと動作しない。
↓↓参考
各種APIをFlashで使うために、クロスドメインに打ち勝つPHP // PHP&Flash - bute_lab.
flash PHP経由でクロスドメインにアクセスする方法 (シモムラボ 2.0)
今度ここだけを取り上げる、かも。
.flaのファイルサイズが小さくならない
ものすごい初歩的なことだと思うのだけれど、知らなかったので;
ライブラリのなかの無駄な物を削除して保存しただけだと.flaのファイルサイズは小さくならない。
[ファイル]メニューから[保存して最適化]を選択すると小さくしてくれる(今回の環境はCS3)。
人にflaファイルを渡すことがなかったから全然注意を払ってなかった。。。
HTML側からflashへ値を渡す方法
最初簡単かと思ってたら見事にはまったのでメモ。
http://dev.convexstyle.net/2007/07/flashvars_in_actionscript_30.html
- swfObject.jsを使ってる場合
http://issey-imamura.blogspot.com/2009/03/as3-swfobject-flashvarshtml.html
- AC_RunActiveContent.jsを使ってる場合
http://gtmb.chillout.jp/gold/?eid=5
はまった原因は、もともとAC_RunActiveContent.jsを使ってswfを貼り付けていたのに、
追記
もっとまとまってる記事があったので追記。jsから変数の値を渡す方法も載ってた(実は一番欲しかった情報…)。
http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=6129&forum=6
flashからブラウザの表示領域をリサイズする
ActionScript3.0を使ってブラウザの表示領域をコントロールする方法について。
参考resize me - octech
http://www.flash-jp.com/modules/newbb/viewtopic.php?viewmode=flat&topic_id=778&forum=6
簡単に書くと、flash側からJavaScriptの関数へステージサイズなんかの引数を渡して、html内の要素(swf)のサイズを変更する、という方法。
ただしExternalInterfaceクラスはoctechさんのエントリーで触れているとおり一部ブラウザでうまく動かない事があるので、代わりにnavigateToURL()を使って
var command:String = "javascript:関数(引数)"; var request:URLRequest = new URLRequest(command); navigateToURL(request, "_self");
なんて感じにするとよいっぽい。
navigateToURL()の2つ目の引数"_self"は本当は省略しても良いはず(初期値null)なんだけど、省略しちゃうとこれまた一部のブラウザでうまく動かないから入れた方が安全みたい。