2012年11月23日金曜日

ゲーム制作

仕事が落ち着いたので、小規模ゲームを完成させることを目標に、制作開始。
FPSな位置固定のガンシュー。
ガンシューティング
左クリック:発射
マウス:照準移動
z,xキー:矢タイプ変更

全て把握して製作するのは最高に楽しいですね。
IKやら画像変形の内容盛り込もうかな。

2012年10月12日金曜日

CGGJP2012画像変形の実装



ComputerGraphicsGemsJP2012の7章「移動最小二乗法を用いたインタラクティブな画像変形」を実装しました。

Unity上で実装、デフォのPlaneがXZ平面なためXY平面に頂点を回転させました。
ピンクの点が制御点となっています。
左クリックで掴んでドラッグして遊んで下さい。
キーボードの上下矢印キーで、アフィン変形→類似性変形→リジッド変形と変化します。
Aキーを押したら制御点が元の位置に戻ります。制御点が画面外に移動した時に押して下さい。
他Shift押しながら上下矢印キーで現在の制御点のまま画像変形のモードだけ切り替えます。

ゲーム中のお遊びで、スーパーマリオ64にあったようなマリオの顔引っ張りまわるの思い出します。
何かの演出(ワープとか異空間とか?)に使ってイベントを盛り上げたい時に役立ちそうですね。
これメインのゲームはあまり面白いのが思いつくところがない・・・

2012年10月6日土曜日

第3回海外ゲーム技術勉強会に参加してきました

第3回海外ゲーム技術勉強会に参加してきました。
http://atnd.org/events/32468
会場ちょっと迷ったので、5分ぐらい遅れての参加です。

#1 Heliumエンジンの設計と実装
スライドはこちら
http://www.slideshare.net/DADA246/helium-14611490
このスライドのMemoryの中盤あたりから話を聴き始めました。
海外のオープンなゲームエンジンのコードを読まれての、各項目について解説されていました。
最近Torque3Dもオープン化したとか、たくさんゲームエンジンがオープンになってきてますね。
色々気になってメモしたところとしては、

CheckSumの方式MurmurHash

は初めて聞いたので、ぐぐってみました。
http://perl-users.jp/articles/advent-calendar/2011/hacker/11
Austin Appleby氏により考案されたMurmurHashは、衝突困難性と一様性に優れ、かつ計算コストがMD5等よりも圧倒的に優れたハッシュ関数でその出力範囲はint型の範囲に限定されています。
ってことらしいです。使える機会があるかどうか。

SmartBuffer

ゲームのバージョンが変わっても、動作をさせるためのものらしい。
バイナリデータを作ってて、バージョンが上がったために、構造体のメンバが増えたりしたときに
古いバイナリで動かしてしまったら、増えたメンバにデフォルト値で初期化させて動かそうとか。
バイナリバージョンが違うよって警告文を画面に出して動いていれば、非プログラマの人でも原因がわかるし修正も早くなっていいですね。
業務でも欲しい機能です。

EulerOrder

3D数学ブログラムで、回転行列の計算順序順に依存しないようにするために、enumでビットシフトをしてるとか。
ちょっとググってみたら割りとやってるとこがありますね。

後半の内容はこのゲームエンジンの作るゲームオブジェクトについての解説や
Rendering部分についてありましたが、追いきれてないのでスライドを御覧ください

#2 カスタマーサポート
Diablo3を買ったときにトラブったのでカスタマーサポートを利用した時のお話。
問い合わせがチケットシステムになってるとか、カスタマーサポート進んでいますね。

#3 アセットビルドパイプライン
Game Development Toolsの第一章からまとめての発表
ここでいうアセットはソースコード以外の全てのリソースだそうです。
アセットビルド時にビルドに必要なファイルの依存性を調べ、更新されているかなどをタイムスタンプやファイルのハッシュ値から調べて、ビルドを高速にするとか。
ビルド前にデータのチェックツールを実行して凡ミスを防ぐとか。
もっと深い話だったはずですが、追いきれませんでした。
スライドが後ほど公開されるそうです。

#4 VisualStudio2012のDirect3Dアプリ開発者向け新機能
スライドはこちら
VisuakStudio2012Pro版を買うと使用出来る新機能についての解説
アセットビューワーがあって、基本的なテクスチャやモデルは表示できるそうですが
ライティングなどないらしい。自前のビュワーの方がデバッグなどもできて高機能でしょうからあまり使わないかと。

シェーダー開発ツール
HLSLエディターで、型名とかの色分けできたりfxcの設定がプロパティで出来たりと便利そうです。

GPU診断機能
PIXのようなデバッガ機能が統合されたようですが、負荷計算はできない。
PrintScreenでスクショを取ればその時のコールスタックとかが見られます。

Windows8入れてVS2012Pro使うときは覚えておきましょう。


2012年9月30日日曜日

Computer Graphics GemsJP2012感想

略してCGGJP2012を読み終えました。
本の内容はamazonの紹介文を読んで下さい。
CG関係の最新技術とかについて解説されている本です。

すっごいいい本です。
章の構成は順番に読んでいくことを想定しているようです。
実装の仕方まで載っている内容があるので、読み終わったら実装してみるといいです。
CCDIKはやってみました。画像変形と他IKもやってみるつもりです。

後半のシミュレーションの章になると数学力が必要になってきて、数式が読めなくて混乱したり、概念の理解ができなくて読み込んだりしてました。
偏微分方程式とか変分原理とか流体シミュレーションとかの考え方が解説されてるので
割りと知識無しで読んでも何とかなります。まだ実装できる気はしませんが。

グラフィック関係のプログラマだったり興味あったりする人なら必読かなと思います。


第8回Unity勉強会に参加してきました

TechBuzzさんが開いてる?第8回Unity勉強会に参加してきました。
http://atnd.org/events/31433
公式なレポートtogetter

以下個人的発表感想

1.山村氏「Unity開発におけるアンチパターンの提案」
アンチパターン、こういう手段で開発してたら最終的にとんでもない失敗になるよね。といったパターンのお話のようです。
Unity開発で特にありがちなパターンをピックアップして幾つか紹介されていました。
ある程度の経験を積んでいれば自然と回避しているので、パターンの内容を聞いたら、あぁそうなるよねぇ気をつけていかないとねという感想を抱くぐらい。
私はアンチパターンが一般的で皆知ってるという名前では無いと思うので、デザインパターンを学んでるといいのではという考えです。
Unityに限らずこの知識は必要ですし。


2.田中孝氏「Unityサウンド入門編」と「サウンドワークショップ事例」
Unityでサウンド鳴らすにはどうするの?どう管理してるといいの?という話から
CEDEC2012でCRI・ミドルウェア社が行ってたワークショップの話。
サウンド入門編は福島GameJamで作られたiOSゲーム「駆け上がれ馬ども」というゲームを元に
解説されていました。
slideshareで公開されています。
「Unityサウンド入門編」と「サウンドワークショップ事例」
記憶に残ったものとしては
SoundManagerを作成してAudioSourceは全てそこで管理して鳴らすようにしてるとか。
常に鳴らすBGMはUpdateでAudioSourceの存在を監視して消えてたら再び鳴らすとか。
α版からサウンド鳴ってたらヤル気沸く!とか。
効果音とかBGMとか重なり合って鳴るときのチェック用にデバッグ機能を作成しておきましょうとか。
コイン獲得音など半音上げていって気持ちよくするとか
...etc

スライド目を通して駆け上がれ馬どもをダウンロードしましょう。

3.伊藤周氏「Unity開発における50のTipsのいくつか」
こちらの内容から幾つかピックアップして紹介されていました。
ひとまずは全部読んだらいいと思います。
注意 Unityとして公式なものではないので、問い合わせたりしないでね!


2012年9月26日水曜日

CCDIK見直し:改

球体で関節だけ更新してたので、ボーンないとわかりづらいなということで
ちょっとCheetah3Dで球体と立方体でボーンっぽいの作って入れ替えました。
ローカル座標の位置成分を回転させていたのを、ローカル座標の回転成分を回転させるようにもしてみました。
CCDIK_BONE

拘束位置とルートの距離がボーンの最大距離を超えると荒ぶる様子。
荒ぶっていたCCDIKを直しました。
transform.localRotation *= Quaternion.AngleAxis(miki, love);
としていたのですが
transform.rotation = Quaternion.AngleAxis(miki, love) * transform.rotation;
のようですね。
ローカルの回転だけ直せばいいよなーとか、クォータニオンの順番意識してなかったので
荒ぶってしまっていました。

コードはこのぐらい

Transform[] childlen = skeletonList.transform.GetComponentsInChildren<Transform>();
for(int i = 0 ; i < numIteratrions ; i++){
  for(int j = childlen.Length - 1 ; j >= 0 ; j--){
    Transform child = childlen[j];
    Vector3 effectorDir = Vector3.zero;
    Vector3 targetDir = Vector3.zero;
    effectorDir = ( effector.transform.position - child.position).normalized;
    targetDir = (target.transform.position - child.position).normalized;
    float dot = Vector3.Dot (effectorDir, targetDir);
    if(dot < 1.0f - 1.0e-6f){
      float rotAngle = Mathf.Acos(dot);
      Vector3 rotAxis = Vector3.Cross(effectorDir, targetDir).normalized;
      if(child.tag == "Bone"){
        child.rotation = (Quaternion.AngleAxis(rotAngle, rotAxis)) * child.rotation;
      }
    }
  }
}

2012年9月16日日曜日

CCDIKを実装しました

先月CEDEC2012に参加しまして、CEDEC書房で先行販売されていた
ComputerGraphicsGemsJP2012を購入しました。

通勤がてら読み進めていて、いくつか実装してみたいものが溜まったので、この休暇にまずCCDIKをUnity上で実装しました。
CCDIK in Unity
カーソルキーで上下左右に拘束位置である赤い球体が移動し、他の関節を表す球体が追随していきます。

アルゴリズムや他のIKについても詳しくはここを参照下さい。
http://www.tmps.org/index.php?CCD-IK%20and%20Particle-IK


実装は3時間ほどでしょうか。IK楽しいですね。エフェクタや対象関節の指定ミスでちょっとあれこれしました。

闇鍋勉強会#2に参加してきました

闇鍋勉強会#2に参加してきました。
闇鍋勉強会ってなんぞやとは、なんかいろんな人達が好きなこと話すごちゃまぜな勉強会。

前日に色々あって2時間近く遅刻して参加しました。
聞けた発表は
ATLの黒魔術
VisualC++付属でCOM扱うActive Template Libraryのreinterpret_castをしたら
同じオブジェクトが元でも別の仮想関数呼べるとかなんとか。

Fortran
私はさっぱり専門外なので名前は聞いたことあるわー
科学技術計算かーへぇーと聞いてました。

Unity x Node x MMD
UnityとNodeとMMDでMMOっぽいことできるんじゃね?ってことで挑戦された結果どうだったかな話。
MMDによってちゃんと表示されるか様々で対応は大変そうですね。
私も過去MMD x XNAのときにLat式ミクを表示させてみましたが、なんか描画うまくいかなくて
悩んでたのを思い出しました。
後、node.jsに興味湧いたのでインストールしてこんにちは世界まで動かしてみました。
刺激を受けて新しいことに手を出すきっかけになっていいですね。

LT枠は聞き流しながらUnity触っていました。
クイックソートの最悪計算量O(n^2)だから、これを利用してサーバーに攻撃して落とそうぜ!って話が面白かった。

boostjpで有名なcpp_akiraさんの集合知の話もタメになりました。
ネットに転がってる情報って、転がってるんじゃなくて誰かが書いてくれているんだぞっと。
http://d.hatena.ne.jp/faith_and_brave/

久々に勉強会に参加してみて思いますが、外に出て刺激を受けるっていいですね。新しいことに挑戦したり気持ちが引き締まったり。
会社に住んでデスマこなしても技術力あがらんし、刺激も無いしでいいことあんまないです。時間あるうちにどんどん外に出ていきたいですね。

2012年6月18日月曜日

AssetStoreセールでお買い物

こんにちは、2ヶ月ぶりです。
Unity AssetStoreで何やらセールしているアセットがたくさんありましたので、思わず色々お買い物しました。
NGUI
強火で進めさんのチュートリアル解説
Bitmap2Material
モデル色々
効果音色々

で、NGUIをチュートリアル解説見ながらちょっとやってみました。
モデルも差し替えつつ作り直し中なのがこちら

NGUIでタイトル画面1分で作成
モデル表示も一発。アニメーションさせて動かすプログラムも一時間かからず。
ThirdPersonControllerを使えば一瞬でここまで行けますね。
解読するよりは自分で作って理解を深めるほうがいいと思います。


2012年4月3日火曜日

インディゲーム開発中

新年度ということで、何か新目標を立てて行こうと思いたち、インディゲーム開発をやろうと決めました。

イース大好きなので、それを目指してあれこれ試行錯誤していきます。
そういうわけで、Unity勉強を再開しました。より深い部分を知って良い物出来るように開発進めていきます。

今日一日github思い出しながら開発進めて動かすとこまで。
カーソルキー移動、Zボタンで弾発射、スペースキーでジャンプ出来ます。


2012年2月12日日曜日

ゲームプログラマのためのC++を読み終えました

20冊近い積み本を崩そうと読書再開しました。
で、今日はゲームプログラマのためのC++を読み終えました。
ゲームプログラムでよく使われるC++で、重要な機能やパフォーマンス向上のために
何を知るといいかがまとまってるような本です。

STLは使わないものだって考えが蔓延していますが、メモリの割り当てとかしって正しく使うのを推奨しています
この本のトピックスひと通り読むと、自分が足りない部分がどこかはっきりわかっていいですね。

サンプルコードもついてるのでダウンロードして写経しましょう


2012年2月7日火曜日

CharacterControllerとRigidbodyを一緒に使う方法?

UnityではCharacterControllerとRigidbodyを一緒には使えません
当たり判定の方向が知りたいし、物理挙動させたいと思った人は諦めて下さい


ではあまりに残念なので、何とかする作りをあれこれ考えました
オブジェクトの構造をまずこんな感じで
GameObject
CharacterController
Rigidbody
CharacterControllerのオブジェクトとRigidbodyのオブジェクトを2つまとめておきます

Rigidbody側でキャラを動かしたり物理挙動させたりします。
移動量をCharacterControllerに渡してMoveメソッドを実行させて、CollisionFlagsを取得
CharacterControllerのtransform.positionをRigidbodyのものに直接設定

このままだとお互いがPhysicsによって暴れるので、Layerを設定してPhysicsを無効にしておきます

これでCharacterControllerとRigidbody両方持ったオブジェが何とかできそう?
調整を続けます

2012年1月10日火曜日

コルーチン(Coroutin)について

コルーチンをUpdateから呼ぶときに、ちょっと調べたのでメモ
コルーチンのウィキペディア

シューティングの弾などで一定時間経ったら自動消滅させる手法で、まず変数でタイマーを使うのが思いつくのですが、そういえばWaitForSecondsとかのコルーチンがあったなぁと思いだして、これを使ってみることにしました

追記
Destroyメソッドが第二引数に時間を指定できるので、Destroy(gameObject, 3.0f)をStartメソッドで呼んでおくのが一番スマートですね

最初のコード
void Update(){
 Kill();
}

IEnumrator Kill(){
yield return new WaitForSeconds(3.0f);
Destroy(gameObject);
}

実行すると、Killが実行されていない・・・
どうやらUpdateからコルーチンを呼ぶときには
StartCoroutin("Kill");
なんてものを使わないといけないらしい

void Update(){
  CoUpdate();
}
void CoUpdate(){
 StartCoroutin("Kill");
}
IEnumrator Kill(){
  yield return new WaitForSeconds(3.0f);
  Destroy(gameObject);
}

で3.0秒後に消滅してくれるようにできました

コルーチンの仕組みはもっと調べておきましょう・・・


2012年1月4日水曜日

プログラマが知るべき97のこと

プログラマが知るべき97のこと」を読み終えました

私はゲーム会社でプログラマとして働いて、二年が経ち今年から三年目になります
コーディングルールやC++言語テクニックな本を読むことは多かったのですが、この手の本は読んだことがなかったので、大掃除息抜き用に購入しました。

十数人のチームでプログラミングしています。この本に書かれていることには頷くばかりでした。
特に心に響いたものは

ボーイスカウトルール コミットするときには前よりもより綺麗なソースコードにする
1万時間の訓練 エキスパートになるにはそれくらいの訓練が必要になる
魔法に頼りすぎてはいけない 誰かがうまくいくようにしている
DRY原則 繰り返しを避けること
ハードワークは報われない
その場しのぎが長生きしてしまう
単一責任原則

この辺りでした。
後はテストの重要性やコードは他人のために書く、振る舞いもカプセル化すべき、正しい使い方を簡単に、誤った使い方は困難に、とかはコーディングルールと被って改めて認識しなおされたってところです。

プログラミングして数年経ったり、新人のときだったりに読むと良い指針になるんじゃないかなぁ。

C++のテクニック本を読むのも大事ですが、仕事はチームワークなのでこういう内容もしっかり知って実践していきたいですね

2012年1月2日月曜日

プロセッサを支える技術を読みました

あけましておめでとうございます
大掃除用に技術書を五冊購入しまして、その一つ「プロセッサを支える技術」を読み終わりました

内容はプロセッサCPUとは何か、プロセッサ開発の歴史からどうやって高速化されてきたか
身の回りにある各種プロセッサの進化方向を考えると言った内容です。

プログラマ的には、キャッシュやL1キャッシュがどうメモリ上のアドレスを認識しているのか、が読んでて面白かったところです。昔の基本情報技術者試験に出てくる言葉をしっかり説明してくれてますし、回路図も載ってて理解しやすいかなぁと思います。

プログラミングの高速化テクニックみたいなことも、ちょっとだけ載っていたりします。最適化してくれない部分とか。それがボトルネックになることはないと思うので、何か知ってればいいことがあるかも?
GPGPUもちょっと載ってますが、この辺はちゃんとした本を読むといいでしょう。

ポインタとか使ってるけど、アドレスからメモリにアクセスして実際にデータをどうやって取得してるのかとか、知ってて損はしないですし、400Pぐらいなので一日かからず読めます。
ちょっとプログラミングの手を止めて、読むにはちょうどいいです。
このガジェットでエラーが発生しました