Google

2011年11月25日金曜日

オライリーオンラインストア

過去に紹介したオライリーのストアですが。
ログインして過去の履歴からダウンロードできるようになったとの通知が。

http://www.oreilly.co.jp/ebook/


今まで買ったことがないなら普通に登録すればおk。
買ったことがある人はその際のメアドで登録すると過去の履歴がでます。
ってんで早速やってみたのですが、、、。


あれ、過去に買ったはずのTomcatハンドブック第2版がない、、、。
E-Bookストアからもリンクが消えてる。
ま、手元にはpdfあるからいいんだけど。

ということで多少は便利になったみたいです。

2011年11月24日木曜日

新作ゼルダは

ええ。このざまですよ、、、、、、。


11時過ぎてから発送開始メールが届く有様。
忙しいからあんまやる時間も無いんですけどね、、、。

2011年11月16日水曜日

PrefabをC#のみで生成

GUIで指定したPrefabの生成方法は以前行いました。
しかしこの方法、100個必要なら100個のメンバ変数と紐付けが待ってるという事です。
これではとてもではありませんが実用に耐えるものではありません。

そこで今回はGUI指定不要なプレハブ生成です。
これなら何個あろうが命名規則でまとめるだけですみますね。

では実験の手順です。
  1. プレハブを作成します。
  2. Projectヒエラルキー上にResoucesという名称のディレクトリを作成します。
  3. 作成したプレハブをその下に入れます。
  4. 生成ソースを空GameObjectに紐付け
今回もプレハブにはCubeを使用します。
1.の手順は以前の記事と全く同じなので割愛。
プレハブにしたらヒエラルキー(シーン)からCubeを削除しておきましょう。
2.と3.は以下のように行います。

Projectの下にあるCreateを押して
メニューからフォルダを選択
できたフォルダをResorcesに変名しましょう。
ここまで来たらCubeのプレハブをフォルダにドロップして3.まで完了です。
続いて今回のソースコード。

さっくりとstart関数の中を解説。
1行目はprefabという変数はCubeという名前のプレハブから作成してます。
プレハブの名称はCubeなので、このまま引数に渡し、戻りがObjectなのでGameObjectにキャストします。
このprefabという変数をひな形として、GameObjectを生成しているのが2行目です。

このResouces.Loadはクラスメソッドなのでいつでも呼び出せます。
リファレンス原文はこちらを御覧ください。
http://unity3d.com/support/documentation/ScriptReference/Resources.Load.html

ここから4.の作業に入ります。
以前と同様にUnityGUI上でC#のソースコードを生成し、上記ソースを書きこんで、空っぽのGameObjectにドラッグ&ドロップで紐付けしてください。

実行前にはシーンにカメラとこのソースのGameObjectがあるのみで、目に見える物体が何もない状態であれば準備完了です。
では実行してみましょう。

実行前。カメラとソースが入ったGameObjectだけです。
実行後。シーンになかったCubeプレハブができています。
出来上がった動的GameObjectの名称はCube(Clone)となっています。
(Clone)はUnityが勝手に付けるので、名称管理などをしてて気になるのなら、nameプロパティで動的に名称を変更すればよいでしょう。



ちなみに、今回わざわざフォルダを作成した理由ですが、、、、

・Resource以下で無いと生成元データを見つけられない。

という制約があるためです。
実際にディレクトリ無しでやってみると、ひな形がnullとなってうまく動いてくれません。

なんでこんなルールかというと、、、。
Unity3dはGUI型ツールなので、エディタ等特殊なサポートツールを追加可能です。
しかしサポートツールのコードを、最終的なゲームのバイナリに出力したくない場合もあります。
(例えばEzGUIの設定画面とか)
Unityではその区分けをディレクトリの表記名で行なっているため、こういったルールとなっているようですね。
ResoucesはGameObject等を動的に読み出すために予約された名称で、この下ならある程度のディレクトリ構成名称は自由なようです。

原文を読みたい方は以下からどうぞ。

2011年11月14日月曜日

IT手袋2011年版

今年はやけに暖かいですが、さすがに夜は寒くなって来ました。
去年は人差しと親指だけ静電伝達してスマホを触れる手袋をしてましたが、どうにも滑って危ないので買い替えしようかと考えていた矢先。
近所のコンビニでこんなのが売ってたので即買いしてしまいました。

指全部が通電してくれる新型。1000円。
ま、指全部バージョンは去年からあるっちゃあるんですが。
フリーサイズってのも昔からよく見ますし。
しかし一番のポイントはここでした。

滑り止めがついてるー

軍手のダサさを一瞬想像してしまいましたが。
ヘキサグラム状に黒い樹脂を配置してあるのでデザ上問題ありません。
手のひらにしかついてないので指だけでは滑るという点には注意。

今のところ、つるつるするiPhoneでも全く問題なし。
なかなかお勧めです。

2011年11月11日金曜日

iOS5.0.1

アップデートしてみました。
今までは母艦に接続しなければ不可能だったものが単体でできるっていいですね。

サイズは44.6MB
大体10分程度で終わりました。
再起動後も特に問題なく動いてます。
どれぐらい持つようになったのかはこれからなんで。

あ、手順はあちこちで書かれていますが一応書いときます。

「設定」→「一般」→「ソフトウェア・アップデート」に入って、5.0.1の項目を押すだけ。

アップデート前に「AC電源に繋げばバッテリーを節約できる」とかなんとか、当たり前すぎてあんまし意味のない事を言われた気が。
むしろ電源につながないとアップデートできない某ゲーム機より全然おkです。

2011年11月10日木曜日

プリミティブを動的生成

GUI指定で動的生成は簡単でした。
あまり使う機会は無いかも知れませんが、こんな生成の方法もあります。

 static function CreatePrimitive (type : PrimitiveType) : GameObject

GameObjectに付随するクラスメソッドです。
プリミティブは直訳すれは「原始的」ですが、3Dでは球体や板等の純粋な部品を指します。
Unityが素で作れるGameObjectを作れるという事ですね。

指定できるのはPrimitiveTypeという列挙型。
定義されているタイプは5つ。


  • Sphere
  • Capsule
  • Cylinder
  • Cube
  • Plane


C#で表現する場合、例えばCubeなら以下のような表記になります。

 PrimitiveType.Cube

C++での列挙体では列挙体名は不要でしたが、こちらでは必要です。

ちなみにこの5つの項目。
これはメニューの「GameObject」→「Create Other」の中にある3枠目の項目群と一致します。

先程の関数での使い方も至って簡単。


void Start()
{
    GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Plane);
}


こんな感じで書けばPlaneが生成されます。
位置やスケールの指定が引数に何も無いのでお気づきかと思いますが、位置は全部0,スケールは1のままで生成されます。

ゲームとしては使い物になりませんが一応。

2011年11月8日火曜日

PrefabGUI指定で生成

前回の続き。
最も簡単な方法であるプレハブ指定の方法です。

といいながら、以前書いたように、プレハブのクラスは存在しません。
なので、ここでもまたUnity特有の手法が存在します。

今まで何度も出ましたが、GUI上でドラッグ&ドロップですね。

以下が今回のサンプルソースコード。

using UnityEngine;
public class SampleScript : MonoBehaviour {
 public GameObject prefab;
 public void Start() {
    GameObject aaa =
        (GameObject)Instantiate(
            prefab,
            transform.position,
            transform.rotation);
 }
}

メンバにprefabという名前のGameObjectがあります。
publicにすると紐付けしたGameObjectをクリックした際、インスペクタにメンバが表示されるという点は以前書きました。
そしてドラッグ&ドロップで実行前にインスタンスを指定という方法も書きました。
これをそのままここに応用することができます。

では具体的な手順。

まずは上記コードをC#として作成し保存。



適当な元プレハブを準備しましょう。今回は分かりやすくCubeを作ります。
メニューから「GameObject」→「Create Other」→「Cube」で生成。



そのままProjectビューにドラッグしてプレハブ化。
空色キューブ型アイコンがプレハブの印です。



空っぽのGameObjectを作成してこのSampleScriptをドラッグ&ドロップで紐付け。


インスペクタにprefabというメンバ変数が出るので、Cubeをドラッグ&ドロップ。
赤丸の部分を左上から右下に入れるだけです。


何もない状態から生成される事を分かりやすくするために、シーン上にあるCudeは削除しておきましょう。(プレハブではなく、ヒエラルキー上のCubeです)
これで準備完了です。

実行するとGameObjectと同じ位置にCubeが生成されます。

ビフォー

アフター
なかったはずのキューブが出てきましたね。
要は一旦ゲームオブジェクトとして確定したプレハブは、この方式でいつでも実体化できるということです。

2011年11月7日月曜日

Unityでのオブジェクト生成


Unity3dでGameObjectを生成する方法です。
まずはさらっと概要をば。

実行中に生成するということは、それまで画面上になかったものをインスタンスとして表示させるということです。
開発側からすると、「どれ」をシーンに出すのか?という事を認識する必要があります。
普通はクラスをnewしてインスタンス化しますが、UnityではプレハブやGameObjectを元にします。

インスタンス化のメソッドがこちら。

static function Instantiate
(original : Object,
position : Vector3,
rotation : Quaternion) : Object

これはObjectクラスのクラスメソッドなので、MonoBehaviour派生クラスならいつでも呼び出せます。
クラスメソッドはC++で言えばstaticメンバ関数ですね。

さてこの関数、呼び出しているクラスをコピーするとかではありません。
第1引数にoriginalとあるように、元を入れるとそのコピーをインスタンス化するという機能です。
つまり、既になんかしらの形で存在しているObject又はその派生クラスであるGameObject等を準備しなければなりません。

何が対象になるのかというと、ざっとこんな感じ。

・Project内にあるプレハブ
・シーンに既にあるGameObject
・Project内にあるFBX等のインポートデータ
・アセットバンドルファイル

ゲームを作るには十分なバリエーションではないかと。
FBX等のインポートデータも、取り込んだ時点でプレハブになるので、同じという事になります。

一番簡単なのはプレハブですが、それはまた次回。

2011年11月3日木曜日

別のメソッド呼び出し方法

Unityには通常と違うメンバ関数(メソッド)の呼び方があります。
HogeというクラスにFuncという引数付きメソッドがある場合、通常はこう。

public class Hoge : MonoBehaviour{
void Func(int val);
}
Hoge hoge = new Hoge();
hoge.Func(100);

これをSendMessageで行うとこうなります。


Hoge hoge = new Hoge();
hoge.SendMessage("Func", 100);


リファレンスはこちら。
Component::SendMessage

見ての通りComponentなので、GameObjectでもMonoBehaviourでも使えます。
しかしこのSendMessage、引数取得等には使えません。
一方的に呼び出すプロシージャ的な扱いです。
こんな呼び出し、果たして何のためにあるかという話ですが、、、。

実際には言語の壁を超える場合に最も有効なようです。
C#とJSを混在させた場合、互いのクラスが参照できないといった現象に度々出くわします。
しかしSendMessageは弱い型付けとして動作するため、クラス定義が見つからない状態でもエラーとならず呼び出すことができます。

これはUnityをブラゲーとして動作する場合にも有効です。
HTML上で動作するJsからUnityへ値を受け渡しする際にもこれを使用したりします。
サーバ側でセッション情報等を生成しHTMLに埋め込んで、Unityが受け取って通信したい場合等は必須とも言えますね。

2011年11月1日火曜日

Buzzが終了でGoogleReaderがTwitterに

いい加減な表題に見えますが、風が吹けば桶屋が儲かる話ではありません。
私以外にはどうでもいいのかも知れませんが、人気が無くて終了したGoogleBuzzの影響がGooleReaderとTwitterに来ています。

それは以前書いた この機能 に関する話。
要はGoogleReaderのニュースをツイートしたいだけなんですが。

昨日までは普通に動いていたこの機能だったのに。
今日PCを立ち上げたら、GoogleReaderが新しいデザインになってました。


ぐはっ、どこにも共有のボタンがねぇ。
代わりに転送先指定プルダウンだけのこっていやがるー。

ここからツイートしろとのお達し

これだと別ウィンドウがでるからめんどくさいのに。
さーて、別の手を考えねばならんです。


11/2 追記:
Google+で共有すれば良いらしいという情報があったのですが、ニュースだらけでちからるのでそれもやりたくない、、、、。