「ゲーム開発」カテゴリーアーカイブ

Unity勉強中5:uGUI使ってみた

Terrainで地形作るの楽しい。でも実在するような地形って、いざ作ろうとしてもよくわからないな。

リアルな風景のアセットを買おうか迷ったり。

そんな感じで最近Terrainばっかいじってたけど、実はスマホだとTerrain重いから使っちゃダメみたいなんだよねw 楽しいけど、今のところ役に立たないスキルだ。

Unity4.6が正式リリースされたので、早速uGUIことUnity UIを使ってみた。

GameObject > UI > Image
で画像を追加できる。

最初アスペクト比が変わる度に画像がどこかに行っちゃうんで、どうするんだろと思ってたら、ImageのAnchor Presetsで位置を固定できた。

あとImageのPreserve Aspectをチェックしたら、画像自体のアスペクト比を固定できる。

ちゃんと日本語も表示できるし、これは簡単で良いね。ボタンの配置とかはこれから試す。

© UTJ/UCL

Toon Level Kit買いました!【Unityアセットストア】

toon-level-kitUnityのアセットストア4周年記念セールが今日までなので、気になっていたToon Level Kitを買ってみました。

セールで半額の20ドルです。ちなみに有料アセット買うの初めてです。

見ての通りのファンタジックなPrefabが大量に入ってます。画像のカントリー以外にも砂漠、雪国、サーキット、ハロウィンと色んなタイプのものがあります。

ただ、触ってみて気付いたけど、モデルのサイズがばらばらだ。Unityは1単位が1メートルだと思ってたけど、それに従ってる訳ではないんだね。

あとコリジョンや透過もまちまちで、ちょっと手間が掛かりそうです。

でもまあ、これだけ良いModelが大量に入ってるのは素晴らしいです。

Unityのお話

Unity最近触り始めたばかりだけど、意外と日本語の情報ないね。あっても2年くらい前の情報だったり。

uGUINGUI2D ToolkitUni2Dはどう違い、どれを使えばいいんだとか。

スマホではDrawCall20以下が良いって見かけたけど、今はどうなんだろうとか。

セール以外でも気になるアセットが大量にあるんだけど、やっぱりぐぐっても情報が無かったり。

みんな最新情報はどこで入手してるんだ。

↓買った本。1年以上前の本だけど、フルカラーでわかりやすい。

Unity4入門 最新開発環境による簡単3Dゲーム制作

ゼンリンがゲーム用に秋葉原の3Dマップを無償提供!

Unity向け3D都市モデルデータ「Japanese Otaku City」|ゼンリン

ゼンリンがUnityで使える秋葉原の3DデータをCC-BYライセンスで公開しました。

ダウンロードしてみたけど、なかなか凄い。クォリティはそれなりだけど、秋葉原がほぼ丸々入ってる。これが完全無料で使えちゃうとか。

地形はこれ、キャラクタはユニティちゃんが使えるので、モデリングできなくてもゲーム作れるね。多分。

ゲーム開発38:DXライブラリに差し替える

ここしばらくDXライブラリをいじってました。

DirectX9を使った自作のライブラリで一通り2Dゲームは組めるようになってるんだけど、Wave以外の音楽再生やら画像処理やら、まだまだ足りない機能がたくさんあります。それに将来的に3Dやる事も考えると、基底部分だけでも途方もない作業量になります。

あと互換性の問題が怖い。前に「動きません」とメール来た事があるんだけど、正直俺一人じゃ色んなハードウェアやOSの検証なんて無理だしね。

そんな苦労を取っ払うために、基底部分をDXライブラリに差し替えちゃいました。まぁ80ファイル以上あるソースコードのうち、4ファイルが差し替わっただけなんだけどね。

これでゲーム部分の開発に専念できます。ついでだから全体的な処理も見直してみようかな。

ゲームエンジン・アーキテクチャ読了

gameenginearchitectureゲームエンジン・アーキテクチャ読み終わりました。アンチャーテッドの開発者が書いた本で、800ページ以上あります。

ゲームエンジンを作るために必要な機能について一通り書かれてます。丁寧に書かれているため、わかり易いです。まぁわからない箇所もあったけど、単に俺の勉強不足か。あと理論が書かれてるだけで、実装方法についてはほとんど書かれてません。

以下自分用メモとして思った事などを…

11.6
アニメーション同士を組み合わせるアニメーションブレンディングという手法でキャラクタの多様な動きをリアルタイムに作ってるんだね。怪我の度合いで動きを変えるとか、武器を構えたまま歩いたりとか。しかし不自然にならないように結構複雑な処理が必要です。

11.7
アニメーションブレンディングした後、さらに不自然なところを直すため、ポスト処理を行います。例として平らじゃない地面に身を屈めて、地面から物を拾い上げるアニメーションについて書かれてたけど、改めて考えると物凄く大変だ。

11.11.5.4
歩いてる時に地に足が着いているように見せるための処理。これもリアルさを考えると重要だね。

12.4.8.7
人が倒れる時とかの挙動の物理シミュレーションをラグドールと言います。確かにやられたアニメーションパターンを全部は用意してられないし、壁とか床とかで動き変わるから必要だね。

12.5.3.2
地形の当たり判定と見た目が違う場合、狭い隙間とかに弾を撃ち込めないというのは確かにと思った。弾を撃つ時だけはレンダリング用のポリゴン見て当たりを判断するのか。

14.4
ゲームワールドのロード方法。一度に1つのレベルを読み込む、狭い空間を通らせてる間に次の広いレベルを読み込むエアロック、ストリーミングで随時読み込むという3つの方法。

14.6.3
オブジェクトとサブシステムの相互依存性。猫を抱いてる人とか、ジープに乗ってる人が持ってる武器の弾倉とか、依存関係大変だ。

一通り読んで思ったのは「無理だw」という事。全ての機能を作る必要はないけど、それでも3Dをやるという事は思った以上に大変なんだね。

今作ってるのは2Dのゲームだからいいけど、3Dゲーム開発する時にはフリーのゲームエンジンを利用させてもらおうかな。ただUnity 3DとかIrrlichtとか色々あるみたいだけど、どれが良いんだろ。

プレイ動画を作成してみる2

冬コミで配布した同人ゲームのプレイ動画です。
http://www.yagasuri.com/prog/

前に動画作った時から時間経ったせいで、作り方忘れてたり(汗) ちゃんと工程をメモっとかないとダメだね。

ともかく出来た動画を眺めてみたけど、やっぱ地味かな。今後はアクションや敵を増やしたり、グラフィックを描き直したり等、色々手を入れてきたいです。

ゲームコーディング・コンプリート読了

gamecodingcompleteゲームコーディング・コンプリート 一流になるためのゲームプログラミングを読み終わりました。ウルティマシリーズの開発者が書いた本です。この本は図や表がほとんど無く、文字とソースコードのみなので、読むのに結構苦労しました。理解出来ないところも多々あったり…ちなみに800ページ以上あります。

しかし現場の人が書いた本は有益ですね。実戦的なのは勿論、失敗談や他のプログラマの話とかが書かれたコラムが面白い。

以下自分用メモとして思った事などを…

第2章
ゲームアーキテクチャですが、本書ではアプリケーションレイヤー、ゲームロジック、ゲームビューの3つに分けてました。俺は勝手に基底部分なんて呼んでたけど、アプリケーションレイヤーの方がかっこいいねw

第3章
スマートポインタとかSTLとかの説明があるんだけど、そういえば全然使いこなしてないな…そのうちちゃんと勉強しよう。

第10章
「本書の中で、この第10章が最も重要かもしれない」と書かれたゲームのイベント管理。イベントデータの引き回し面倒だなぁと思ってたんで、この章の考え方は参考になりました。イベントデータを持ち歩くんじゃなくて、イベントマネージャに管理させるという方法。確かにこうしないと大規模なゲーム作るの無理だわ。

第11章
Luaを使ったスクリプティング。自作スクリプトでキャラクタの挙動とかを操るのは知ってたけど、今は既存のスクリプト言語を組み込むんだね。

第15章
物理シミュレーションSDKのBulletを統合する方法。Bulletはオープンソースだから、いつか自作ゲームにも組み込んでみよう。

第17章
ゲームAI。3Dゲームもフィールドを線分で構成して経路探索やってるんだね。A*(スター)とか昔やった気がする。自作ゲームにも、もう少しましな思考ルーチン入れないとなぁ。

第20章
C#によるゲームエディタ。C#はGUI作るの簡単そうだな。これもそのうち触ってみよう。

第21章
ゲームのデバッグ。絶対音感を持ったプログラマのデバッグの話は面白かった。

第22章
海外のゲーム会社は時間的に余裕があって、豊富なリソース使って優雅にゲーム作ってるんだろうなぁと思ったけど、そうでもないらしい。1日18時間作業とか、スタッフがごっそり抜けて新会社設立など、日本でも聞いたような話があったり。

3Dの章とかは流し読みしただけだし、他にも理解できなかった箇所とかあるんで、そのうちまた読み返そう。

ゲーム開発37:フェードイン・フェードアウト

友人に更新が少ないって言われた>挨拶
---

画面切り替え時のフェードイン・フェードアウトを作成しました。これまでもあったんだけど、CGraphicsクラスに入れて全ゲームモードで使い回せるようにしました。

フェードのやり方は色々あると思うけど、俺は一番手前に画面全体を覆う白いスプライトを用意して、それの透過値を変えることで実現してます。

いちいち初期化するのも面倒なので、FadeMove()を呼んだらその中で初期化もループ動作も行ってます。例によって即値が入ってたり、無駄な処理があっても気にしない。

絵を描いたりボスキャラ組んだり、まだやることはたくさんあるな。

//—————————————————————————–
enum {
 FADE_IN,
 FADE_OUT,
 FADE_BLACK,
 FADE_WHITE
};

struct Fade {
 float cnt;  // 移動量
 float now;  // 現在の値
 int  color;  // 色
 int  spr_no;  // スプライトNo
 BOOL complete; // 完了フラグ
};

//—————————————————————————–
// フェード動作
// in_out:フェードインかフェードアウトか
// minutes:フェードする秒数
// color:切り替わる色
BOOL CGraphics::FadeMove(int in_out, float minutes, int color)
{
 RECT workRect;

 // 初期化
 if (fade.spr_no==-1) {
  // フェード用画像登録
  SetRect(&workRect, 0, 0, 47, 47);
  fade.spr_no=CreateSprite("data\graph\status.png", workRect);
  fade.now=1.0f;
  fade.complete=TRUE;
 }

 if (fade.complete) {
  // フェード開始
  if (in_out==FADE_OUT) {
   fade.cnt=1.0f/((float)minutes*60.0f);
   fade.now=0.0f;
  }
  else {
   fade.cnt=-1*(1.0f/((float)minutes*60.0f));
   fade.now=1.0f;
  }
  fade.color=color;
  fade.complete=FALSE;
 }
 else {
  // フェード中
  fade.now+=fade.cnt;
  if (fade.now>=1.0f && fade.cnt>0) {
   fade.now=1.0f;
   fade.complete=TRUE;
  }
  if (fade.now<=0.0f && fade.cntFadeMove(FADE_IN, 0.8f, FADE_WHITE)) {
 // フェード完了後の処理
 ………
}
// みたいにして置いておく