Unityにおけるスクリプトの基本0

スクリプトファイルの作成

  • [Assets] > [Create] > [C# Script] またはProjectビューの[Create] > [C# Script] で作成。

クラス名を入力

  • "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]

要はPHPを中継することで、swfからみると同一ドメインから情報を読んでいるかのようになる、ということみたい。

絵にするとこんな感じだろうか

読み込む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]

要はPHPを中継することで、swfからみると同一ドメインから情報を読んでいるかのようになる、ということみたい。

絵にするとこんな感じだろうか

読み込む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カレンダーの準備

  1. Googleカレンダーにログイン(もしくはアカウントを作る)
  2. 適当なカレンダーを作る
  3. 対象のカレンダーの"カレンダー設定"を開く
  4. "このカレンダーを共有"タブを選択して、"このカレンダーを一般公開する"をチェック*1
  5. "カレンダーの情報"のタブに戻って"カレンダーのアドレス"のXMLボタンをクリック
  6. 表示された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)
今度ここだけを取り上げる、かも。

*1:非公開URLを利用することもできるけど、flashで利用すると結局外部からわかっちゃうんじゃないかと。。。

.flaのファイルサイズが小さくならない

ものすごい初歩的なことだと思うのだけれど、知らなかったので;

ライブラリのなかの無駄な物を削除して保存しただけだと.flaのファイルサイズは小さくならない。
[ファイル]メニューから[保存して最適化]を選択すると小さくしてくれる(今回の環境はCS3)。


人にflaファイルを渡すことがなかったから全然注意を払ってなかった。。。

HTML側からflashへ値を渡す方法

最初簡単かと思ってたら見事にはまったのでメモ。