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が使えるかどうかをチェックしているだけです。
もっといい方法あれば、教えてください。

Unityから書きだしたXCodeプロジェクトで、 LLVMコンパイラがどねーのでコンパイルできない時の解決法

Unityから書きだしたXCodeプロジェクトで、
LLVMコンパイラがどねーのでコンパイルできない時の解決法

1. Organizerを開く(Shift+Command+2)
2. "Projects"を選択
3. 現在のプロジェクトを選択
4. 右側の"Delete" ボタンを押す

解決!!

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

MakeHumanからBlender2.62にエクスポート

Make HumanのNightlyBuildにはBlender用のインポーターが同封されている、、はずですが、
OSX版には入っていないようなので、Linuxアーカイブ版を落として、
toolsフォルダからio importer scene mhx.pyBlender の addonフォルダに移動させる必要があります。

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
がさっと作ったものなので汚いです。
もし使ってみたいという奇特な方がおられましたら、ご自由にお使い下さい。