Meteor入門 [2] サンプルプロジェクトを読んでみる
Javascriptでクライアントサイドからサーバサイドまでやれちゃう、話題の新技術Meteorを勉強してみる。の記録。
http://www.meteor.com/main
サンプルプロジェクトを動かしてみる。
http://www.meteor.com/examples/leaderboard
インストールは終わってるものとして。
→ http://d.hatena.ne.jp/shinobu_siv/20120609/1339245562
リーダーボードサンプルプロジェクトを作成
meteor create --example leaderboard
ローカル実行
cd leaderboard meteor
これで、ローカルホストの3000番( http://localhost:3000/ )にアクセス
プロジェクトを作成するとファイルが3つ作成される。
leaderboard.html leaderboard.js leaderboard.css
この内、cssはいいとして、他の2つのファイルについて見てみる。
まずは、leaderboard.htmlから。中身は基本的にHTML。
<head> <title>Leaderboard</title> </head> <!-- 非常に短いbodyタグ --> <body> <div id="outer"> {{> leaderboard}} <!-- ここにtemplateタグの内容が挿入されるようだ--> </div> </body> <!-- leaderboardテンプレートはここから--> <template name="leaderboard"> <div class="leaderboard"> <!-- playersの数だけplayerテンプレートを挿入--> {{#each players}} {{> player}} {{/each}} </div> <!-- selected_name (セッションに格納されている) に値が入っていればボタンを表示--> {{#if selected_name}} <div class="details"> <!-- セッションに格納されているselected_nameの値を表示--> <div class="name">{{selected_name}}</div> <!-- 5ポイント追加ボタン--> <input type="button" class="inc" value="Give 5 points" /> </div> {{/if}} <!-- selected_name がなければ、クリックして選択するように促す表示--> {{#unless selected_name}} <div class="none">Click a player to select</div> {{/unless}} </template> <!-- ここからplayerテンプレート--> <template name="player"> <div class="player {{selected}}"> <span class="name">{{name}}</span> <span class="score">{{score}}</span> </div> </template>
次にleaderboard.jsを見てみる。
//プレイヤーの情報を保存するコレクションをセットアップ。 //サーバ側でMongoDBにplayersという名前で保存される Players = new Meteor.Collection("players"); //Meteor.is_clientでクライアント側であることをチェック if (Meteor.is_client) { //playersコレクションからデータを取り出す関数をleaderboardのplayersフィールドにセット Template.leaderboard.players = function () { //playersコレクションから全て取り出して、scoreで降順、名前で昇順にソート //(コレクションと読んでいいのかな? MongoDBの用語がよくわかってないけれど、、、) return Players.find({}, {sort: {score: -1, name: 1}}); }; //選択されているplayerをデータベースから取得。 //プレイヤーが存在し、名前を持っているかどうかを返す Template.leaderboard.selected_name = function () { var player = Players.findOne(Session.get("selected_player")); return player && player.name; }; //選択されているplayerの場合"selected"の値を返す。 //leaderboard.htmlではdivのclassに挿入される Template.player.selected = function () { return Session.equals("selected_player", this._id) ? "selected" : ''; }; //leaderboardテンプレートのへのクリックイベント設定 Template.leaderboard.events = { //incクラスが指定されたinputタグへのクリックイベント設定 'click input.inc': function () { //クリックしたらセッションのselected_playerのscoreの値を5増やす Players.update(Session.get("selected_player"), {$inc: {score: 5}}); } }; //playerテンプレートへのクリックイベント設定 Template.player.events = { 'click': function () { //クリックしたらセッションにselected_playerの値をセット Session.set("selected_player", this._id); } }; } //Meteor.is_clientでサーバ側であることをチェック if (Meteor.is_server) { //初期設定 Meteor.startup(function () { //プレイヤーが設定されて無ければ作成 if (Players.find().count() === 0) { var names = ["Ada Lovelace", "Grace Hopper", "Marie Curie", "Carl Friedrich Gauss", "Nikola Tesla", "Claude Shannon"]; for (var i = 0; i < names.length; i++) Players.insert({name: names[i], score: Math.floor(Math.random()*10)*5}); } }); }
ザックリとだが構造がわかってきた。
JavascriptとMongoDBの用語の正しい使い方が解らない、、、
Meteor入門[1] インストール
Javascriptでクライアントサイドからサーバサイドまでやれちゃう、話題の新技術Meteorを勉強してみる。の記録。
http://www.meteor.com/main
クイックスタートそのまんまで。
ちなみん環境はMac OSX Lionです。
とりあえず、インストール。
curl install.meteor.com | /bin/sh
この時点でスマート。
プロジェクトの作成
meteor create myapp
ローカル実行
cd myapp meteor
これで、ローカルホストの3000番( http://localhost:3000/ )にアクセスすればOK
UnityがPro Versionかどうかをスクリプトでチェックする
どうやら、直接的な方法ではチェックできないみたいなので。
こんな感じのスクリプトを書いてRenderTextureが使えるかどうかでチェックします。
using UnityEngine; using System.Collections; public class ProVersionCheck : MonoBehaviour { private bool isPro; void Awake () { RenderTexture rt = new RenderTexture (1, 1, 1, RenderTextureFormat.ARGB32); isPro = rt.Create (); // if it's pro version, you can use movie texture } // Check if it is running Pro version or not. public bool IsPro () { return isPro; } }
こんな感じでテスト出来ます。
using UnityEngine; using System.Collections; public class CheckPro : MonoBehaviour { void OnGUI () { if (GUILayout.Button ("Check!")) { GameObject go = new GameObject ("Check"); bool b = go.AddComponent<ProVersionCheck> ().IsPro (); Destroy(go); Debug.Log (b); } } }
iOSとかAndroid出実行するとfalseが返されます。たぶん。
実質的にはRenderTextureが使えるかどうかをチェックしているだけです。
もっといい方法あれば、教えてください。
iOSでUnityのビューの上にUIScrollViewをのせる時の注意点
iOSでUnityのビューの上にUIScrollViewをのせて使うと、スクロールが途中で止まる現象が起こります。
Unityから書きだしたXCodeプロジェクトのなかで AppController.mm を開き
USE_DISPLAY_LINK_IF_AVAILABLE を 0 に FALLBACK_LOOP_TYPEを NSTIMER_BASED_LOOPに設定します。
#define USE_DISPLAY_LINK_IF_AVAILABLE 0 //デフォルトは1 #define FALLBACK_LOOP_TYPE NSTIMER_BASED_LOOP //#define FALLBACK_LOOP_TYPE THREAD_BASED_LOOP //#define FALLBACK_LOOP_TYPE EVENT_PUMP_BASED_LOOP
これでスクロールがスムーズになります。
http://unity3d.com/support/documentation/Manual/TroubleShooting.html
Perfumeのお祭りに参加してみました
Perfumeのモーションデータとサウンドが公開されたようです。
http://www.perfume-global.com/
盛り上がっているのでお祭りに参加してみました!!
#prfm_global_site
モデルはMakeHumanで吐き出したものです。
もっとかわいいモデルを使えばよかった、、、
UnityGamesに公開してます。
http://www.unitygames.jp/api/embed/ug3031451
Githubにコード公開しました。
https://github.com/shinobushiva/Perfume-Unity
がさっと作ったものなので汚いです。
もし使ってみたいという奇特な方がおられましたら、ご自由にお使い下さい。