カテゴリー: テクノロジー

「人間大砲」ゲームを作ってみました!

こんにちは。開発担当のマットです。

以前の記事でUnityという3Dゲームエンジンを使って、3Dを体験できるゲームを作りましたが、今回は簡単なゲームを作りたくて「人間大砲」というゲームを作りました!
どうやって作ったか説明していきたいと思います。

ゲーム・デザイン

まず、ゲーム・デザインを行い、以下の目標を設定しました。

  1. 誰でも簡単に遊べる
  2. 開発に時間がかからない
  3. ハマってしまい遊び終わった後に『もう一回だけ』という気分になる

「こんなゲームを作れるのかな・・・そのためにはどんなゲームを作ろうかな・・・」と考えていたら、なぜか頭に浮かんだのは息子のスーパー・ボールでした。

単純でおもしろい、スーパー・ボール

スーパー・ボールを壁に向けて投げてキャッチする息子の遊びを何度も見ています。
ボールはもちろん物理の法則を則った動きをしますが、ちょっとした壁の凸凹や投げる力や方向の変動により、跳ね返り方は大きく変わります。

そこで「何かを適当に投げて、跳ね返りを楽しむのは良いかもしれないな」と思いました。

しかし、ボールはつまらないかな・・?
もっと面白い形の何かはないかな・・?
何を飛ばせば、息子に1番ウケるかな・・?
そうだ!人間!

「大砲で人間を打って、どれだけ遠く飛ばせるか」というゲームのアイディアがひらめきました。
下記のとおり目標で決めた条件を満たしていたので、開発に進めることにしました。

  1. 狙って打つだけなので、誰でも簡単に遊べる
  2. 複雑なAIや処理がないので、開発に時間がかからない
  3. 狙って打つ操作は時間がかからないのでハマって、『もう一回だけ』という気分になるはず

「アセット」の準備

Unityゲームは「アセット」と「コンポーネント」の組み合わせでできています。

「アセット」とはゲームの部品。
例えば、サッカー・ゲームの場合、ボール、選手、審判、ゴールポスト、スタジアムなどはそれぞれ「アセット」となります。

それらのアセットに付属させる「振る舞い」は「コンポーネント」と言います。
例えば、「ボール」のアセットに「球体として動く」コンポーネントを付属させることもでき、「スタジアム」のアセットに「歓声を上げる」コンポーネントを付属させることもできます。

Unityには「ラグドール」(Ragdoll = 人形のような動き)なコンポネントをアセットに付属させる機能があるので、それを使いたいなと思いました。
しかし、先に人間やゲームの中の世界となるアセットを準備する必要があります。

Blenderで3Dモデルを作成する

Blenderとは3Dモデリング・アプリケーションです。
簡単なものから、複雑なものまで、Unityゲームで使えるものが欲しければ、Blenderで作ることができます。

今回のゲームでは飛ばされる人間、その人間を飛ばす大砲、そして途中でぶつけてしまう建物や樹木などのモデルが必要だったので、それぞれをBlenderで準備しました。

Blenderでの3Dモデリング

次はこれらのBlenderファイルをUnityにインポートして、ゲーム作りに使います!

Unityでゲームを作る

上記のモデルが全部出来上がったら、次は実際のゲーム作りです。
まずは、アセットを組み合わせて世界を作ります(今回のゲームでは都会の街を使います)。

実は、今回のゲームで1番時間がかかったのはこの街づくりでした。
ユーザーが退屈にならないよう、それぞれのエリアをユニークにしたくて、コピーペーストをできる限り使わないように頑張りました。

なお、街を部分的に区切って、パフォーマンス問題を防ぐために街を部分的にロードする仕組みを取り入れました。

街が出来上がったら、それぞれの建物や木のアセットに「Collider」(衝突反応)のコンポーネントを付属させることで、「RigidBody」(固体物体)のコンポーネントが付いている人間が当たると跳ね返るようにしました。

そして、街の真ん中に大砲のモデルを設置して、ユーザーがボタンを押すと、人間が大砲から飛び出ていくスクリプト(コンポーネント)を書いて付属させます。

最後は人間の服色と髪型をランダム化、複数カメラ、及び音楽と効果音をつけました。


すべてのアセットとコンポーネントが揃ったら、ゲームは完成です。
 
まとめ

良いアイディアさえあれば簡単なゲームを開発することができ、とても楽しいです。

Google HomeとNature Remoで涼しい帰宅を!

毎日家に帰ると暑い部屋が出迎えてくる・・・そんな日々を変えたくて家にGoogle Homeを導入しました!

 

Google Home miniとNature Remo

 

左:Nature Remo:備え付けの旧式のクーラーなので赤外線のみ有効なのと遠隔で操作する為に購入。
右:Google Home mini:スピーカーの違いぐらいだったのでminiにしました。

 

届いた後の設定等はいろんなサイトが紹介しているのと、手順通りにすれば動いたので省略します。
ここでは導入した後の快適さを実感とともにアピールしたいと思います!

 

・帰宅前にスマホからクーラーを起動できるので帰宅した時の部屋の中は快適!(超重要)
・部屋の明かりを消すのにリモコンを探さなくていい!「ねぇ Google おやすみ」
・タイマーセットが簡単「ねぇ Google 3分測って」
・外出時のクーラーと部屋の明かりを消すのがラク「ねぇ Google 行ってきます」
・起きる時間にアラームとともに部屋の明かりをつけることができる!(重要)

 

ただし不満点が全くないとは言えません。

 

当初は外出するときに「ねぇ Google 行ってきます」と言って、IFTTTを経由して電気とクーラーを消してました。
しかし「行ってらっしゃい」としか反応してくれないことが何度かあったので、今では大体朝出てるだろう時間をトリガーに電気とクーラーを自動で消すようにセットして電気とクーラーをつけたまま外出するようになりました。
外に出るまで電気はついてるし消し忘れはないしで最終的にはこっちに変えて快適になりましたが、思った通りの動作をしなかったのは少し微妙に感じました。
あとたまに音声をちゃんと認識してくれないときもある。

 

それを踏まえても導入した後の快適さを考えれば購入費用はペイできてる気がします!
日々の生活を快適にするためにスマートホーム化はおすすめです!

ログ調査に使えるコマンド色々

サーバを運用していると、どうしてもログを調査しなければならない時があります。
そんな時に使える便利なアレコレを紹介します。

 

1行が長いが、読みにくくなるので改行させずに確認したい

less -S filename.log

ファイルの頭から20行までを確認したい

head -20 filename.log

ファイルの最後から20行までを確認したい

tail -20 filename.log

gz圧縮されたログ出力

zcat filename.log.gz

1列目、3列目、5列目〜7列目まで表示

cut -f1,3,5-7 filename.log

フィルタ

単純な検索

fgrep hello filename.log

タブ区切りで1-3列目まで表示

cat filename.log | awk ‘BEGIN{FS=”\t”} {print $1,$2,$3}

タブ区切りで2列目が400以上のものだけ1-3列目まで表示

cat filename.log | awk ‘BEGIN{FS=”\t”} $2 >= 400 {print $1,$2,$3}

ソート関連

単純なソート

sort filename.log

降順ソート

sort -r filename.log

数値としてのソート

sort -n filename.log

2列目を基準にソート

sort -k2,2 filename.log

区切り文字を,にして2列目基準ソート

sort -t”,” -k2,2 filename.log

ファイルへ出力

単純に結果をファイルへ書き出す

sort -nr before.log > after.log

様々な処置を行い画面へ出力させながらログにも残したい

sort -nr before.log | head -20 | tail -10 | tee after.log

 
様々なコマンドがあり、組み合わせの発想で目的のデータを抜き出すことが可能になります。
ぜひ苦手意識を持たずにチャレンジしてみてください。

ちょっとしたときのSQLite

今年こそは絶対焼かない!
毎年そう意気込んでみるものの今年も見事に市民プール焼けしているマエダです。
 
全然最新技術調査でもないのですがSQLiteってちょっとしたときに便利だなと思いますのでご紹介です。
 
「SQLite」で検索すると白地に英語テキストとロゴ画像が無造作に羅列されたロックでクールなサイトが確認できます。
https://www.sqlite.org/

 
Ubuntuでの簡単な使い方。
 
sudo apt-get install sqlite3 libsqlite3-dev
sqlite3 testdb.sqlite3
 
以上。
 
 
 
え!?簡単すぎてイミフですって!?
 
 
 
ではここからはRDBMSに慣れ親しんだ方にはおなじみのSQLの実行例。
 
まずDBに接続。(DB作るときと同じコマンドです。)
sqlite3 testdb.sqlite3
 
1) テーブル作成
create table users (id, name);
※ データ型を指定することは必須ではありません・・・
 
2) データ保存
insert into users values(1, ‘maeda’);
 
3) データ参照
select * from users where id = 1;
 
特別なことは全然なくて、ほんとにちょっとしたときにサクッと利用できちゃいます。
 
どうやって接続終了したらいいの?はいつも使ったことないエディタ使ったりするときに思うやつなのでご紹介。
.quit
 
以上。
 
 
 
毎日数値をエクセルなどにデータ転記するようなルーチンをSQLiteを活用して自動化してみてください♪
シェルでのクエリ実行は以下のような感じです。
sqlite3 testdb.sqlite3 ”${sql}”
 
もちろん各種プログラミング言語もだいたいライブラリあるようなので大丈夫です!(無責任)
 
 
SQLといえば全然話変わりますが、弊社の英語表記を考えたときにSploutSQLを見つけたのを思い出しました😇
http://sploutsql.com/
 
 
 
 
 
※ 本文とアイキャッチイメージは特に関連性はありません。

3Dの自動地形生成をやってみました!

こんにちは。開発担当のマットです。

以前の記事で地形生成アルゴリズムを紹介しましたが、3Dの世界が自動的に生成するプログラムを作ってみたいと思いUnityという3Dゲームエンジンで作ってみました!

自動地形生成とは?

自動地形生成(Automatic Terrain Generation)とは、世界を作ってくれるプログラムです。「手続き型の生成」(Procedural Generation)の一種です。
簡単に説明すると、コンピュータの乱数生成の特徴を活用して世界を作り出します。

乱数生成と「シード」

コンピュータというものは、とても予想しやすいものです。決まっているルールに従って、予期不可能なことを一切やりません。コンピュータのファンクション(処理手順)に同じ値を入力すると、毎回出力される結果は必ず同じです。

しかし、時々、コンピューターに乱数を決めてもらいたい場合があります。
例えば、サイコロのプログラムを作ろうと思えば、毎回同じ結果だと困りますよね。

そのため、乱数を生成するファンクションを呼び出す度に、入力値を変更しなければなりません。
多くの乱数ファンクションはコンピューターの機内時計を入力値として使います。時計を使うと、ファンクションの呼び出し時間によって、返ってくる結果が異なりますので、サイコロのプログラム等に乱数を生成することができます。

この乱数ファンクションの「入力値」を「シード」(Seed[種])といいます。

パーリン・ノイズ

パーリン・ノイズとはゲーム業界でよく活用されている「ノイズ生成アルゴリズム」です。「ノイズ」とは「雑音」ですが、パーリン・ノイズは「波」のような2D雑音マップを生成してくれます。

パーリン・ノイズ・マップ

Ken Perlin氏というコンピュータ科学教授が1983年に開発し、それから、多くのプログラムに使われているノイズ生成機能です。

いくつかの引数(ファンクションの設定値)を設定することができ、変更することによって、波の形が変わります。
例えば、ものすごい雑なノイズを作ることもできますし、なめらかな波のようなノイズも作ることができます。

引数を変更すると、波の特徴が変わります。

なお、パーリン・ノイズのファンクションに与えるシードを変更することによって、「同様ながら違う」結果が返って来ます。

シードを変更すると、波の位置が変わります。

パーリン・ノイズを活用して、白いエリアを「高い高度」と解釈し、黒いエリアを「低い高度」と解釈すると、3Dマップを作ることができます。

なお、複数のノイズを重ねる事によって、より面白いものを作る事ができます。

世界づくり(デザイン)

まずは、どのような世界をつくりたいかを決める必要があります。
個人的な好みで中心が山となっている島を作ろうと思いましたが、それをどうやって作るかを決めなければなりませんでした。

要素

まずは、全体的にちょっとなめらかな地形がほしかったので、「Base」という優しいノイズを入れました。
次に中心となる山の形となる「Mountain」のノイズも必要だったので、それもデザインに入れて、最後に海岸の形を決める「Edge」も入れることにしました。

島づくりに使う3つのノイズマップ

しかし、この3つのノイズ要素を単純に足すだけだと島にはなりませんので、最終的の地形計算を行うとき、ちょっと特別な処理を行わなければなりません。

Baseノイズをマップ全体に適応して、地形をなめらかな形にしてくれます。

Mountainに関しては、以下のルールを加えました。
「マップの中心に近いほど、マップに影響を及ぼす。」
つまり、マップの中心にMountainノイズが地形の高度に影響を及ぼしますので、島の真ん中に山が生成されますが、中心から離れているところでは高い山が生成されません。

Edgeに関しては、以下のルールを加えました。
「マップの限界に近い程、逆影響を及ぼす。限界に近くない場合、影響を及ぼさない。」
「逆効果」とは「高度を下げる」とのことなので、マップの限界近くのエリアの高度が低くなります。

海を適切な高度に設置すると、島の形になります!

世界づくり(実装)

最近個人的にUnityでプログラミングをやっていますが、Unityは3Dゲームエンジンでとても使いやすいと思います。

今回は地形を作りたいので、Unityでゲームシーンを作って、Terrain(地形)とWater(水)オブジェクトを入れて、Waterの高度を10メートルに設定しました。そうすると、Terrainの高度が10mを超えていない箇所が海に浸かります。

上記で考えた3つのパーリン・ノイズを実装して、地形の高度に設定すると島が出来上がりました!

「12345」のシードで作り上げた島

上記の画像を見るとわかるかと思いますが、右側の設定画面でSeed(シード)を「12345」と設定しています。
そのシードでマップを生成すると、パーリン・ノイズの乱数生成に使われますので、毎回必ず同じ形の島が生成されます。

しかしシードを少しでも変更すると、全く違う島が出来上がります。

シードを少しでも変更すると、全く違う島が生成されます。

世界づくり(森も入れましょう!)

島づくりはなんとなくできましたが、ちょっと寂しいので森も生成しようと思いました。

地形と同じ原理で、パーリン・ノイズで木が生える場所を決めるのがいいです。
パーリン・ノイズ・マップを使って、ある閾値より白いところに木を生やす、という仕様を決めました。
単独に立つといい樹種は、ザラザラな雑音系のノイズ・マップを生成し、森のように、「群れる」木がいい場合は、なめらかな波を作るようノイズの引数を設定します。

Unityはデフォルトで、3種類の木を用意してくれるので、それぞれの樹種にノイズ・マップを用意する必要があります。

なお、それぞれの樹種に生える箇所の条件も加えてみました。

ヤシの木:高度が低い(海に近い)ところのみ。
松の木:高度が高くて、傾斜がきついところのみ。
楠の木:中間の高度なところのみ。

これらのルールで島を生成すると、より良い島が出来上がりました。

森も生成した「12346」の島。

折角ので、探検しましょう〜

Unityで簡単にファースト・パーソン・キャラクターを導入できますので、作り上げた島にキャラクターを入れて、島を走り回って楽しむことができました!

寂しくなくなった世界

まとめ

「手続き型の生成」はとても有力なツールだと思います。
ゲームやシミュレーションに使うことができ、無限コンテンツを生成することができるので、オープン・ワールド系のプログラムに向いていると思います。

今回は地形の高度と樹木の配置に使いましたが、それ以外の使い道もたくさんありますので、今後色んなことに使ってみたいと思います。