satofumi のすべての投稿

マスコットアプリ文化祭 2017 への参加

気楽に参加できるのと自分への〆切になるので毎年 マスコットアプリ文化祭 に参加しています。 そして、毎年のことなのですが「何作ればいいんだよ」と思ったりします。 もっと自由な発想力がほしいです。

とりあえず、思ったことを書いていこうと思います。

マスコットアプリ文化祭

まず、これが今年のロゴです。

ロゴの後ろにキャラクターが描かれてますね、とても可愛らしくて私は好きです。
ただ、このキャラクター達はここだけの登場で、協賛キャラクターでも素材配布もないのが私を悩ませます。

「協賛キャラクターは後から増えるかもしれないし、人数も多いからオリジナルキャラクターを描きましょうよ」

っていう大人の会話があったんだろうか、などと思わされました。
そもそも「マスコットアプリ文化祭」というタイトルなのに、協賛マスコットでなくても参加可能だし、アプリでなくても作品応募可能なので、深く考えなくていいんだよー、と思うことにしました。


マスコットアプリ文化祭 Q&A ページより

で、各協賛サイトをめぐりながら思ったことを書くのは、また次の記事にします。

HTC Vive を使ったゲームを作りたい

体調がよくなってコーディングできる状態になったので HTC Vive のコーディングを開始した。

  • Steam VR Plugin ありがとう!
  • Update(), FixedUpdate() のどっちで何をすべきか忘れてるね!
  • Vive コントローラの操作をコンソール出力したいな。

ってあたりを調べながらやる。

Unity の Update(), FixedUpdate() のどっちを入力に使うべきかは検索したら下記ページがでてきた。 Google さんありがとう!

Unity 〜UpdateとFixedUpdateの違い〜

理解した内容を1行で書くと「Update() フレーム描画ごとに呼び出されて、FixedUpdate() は物理演算のときに呼び出されるから、物理演算の処理だけ FixedUpdate() に書こうね」だった。

SteamVR Plugin の SteamVR_TestThrow.cs のサンプルで入力処理を含めて全ての処理が FixedUpdate() に記述してあった理由はよく理解できてない。まぁ、気にせず進めようと思う。大丈夫、まだサンプルを作ってる段階じゃないか。動けばオッケーさ!

SteamVR の Prefabs フォルダにあった [CameraRig] をシーンに追加して、その Controller(left) / Model に下記 C# スクリプトをアタッチしたら動作した。
https://bitbucket.org/satofumi/vr_quest/src/21e36a750cf38cd01e5cbcabb862371682d1d519/vr_quest/Assets/Samples/ControllerSample_PrintInput.cs?at=default&fileviewer=file-view-default

楽しい!

SteamVR Plugin の使い方については下記ページを参考にした。
https://framesynthesis.jp/tech/unity/htcvive/

Heroes of the Storm での Rank Match (2017-09-21)

Infernal Shrines で Azmodan 使って勝った。 火球が敵の Nazeebo や Kaelthas に命中すると逃げていくのが楽しい。
ただ、終盤は最初の Talent に Sieging Wrath を選んだせいで Azmodan の攻撃力がバーストせずに存在意義が減っていくのが体感できた。短い時間で終わるゲームだと Azmodan が大活躍しそうなのはわかった。

ゲーム終了時に「あなたのヒーローダメージは同じようなプレイヤーに比べて、このくらい多かった」って表示されるのが地味に嬉しい。

そう、勝って当たり前じゃないんだ。勝ったら楽しい気分になろう。

瀕死になっても逃げなかったり、どこまでも追撃するヒーローが多い今のランク帯では、Azmodan みたいに距離関係なく中ダメージを与えられるのは特に有効なのかもしれないと思った。

Heroes of the Storm やってます

のんびり Rank 戦をやってます。(今のランクは Silver 1)  ぶっちゃけていうと私は下手ですが、上手になるように思ったことを書き出していこうと思います。

まず、私のいる Silver 1 のランク帯は、なんだかんだ言ってみんな下手です。 もちろん私も下手です。(えっへん!)

検討内容

マップ: Tomb of the Spider Queen, Rank 戦 (solo)
味方: Murky, Kel’Thuzad, Stitches, Malfurion, Raynor(私)
相手: Malthael, Sonya, Brightwing, Abathur, Johanna
結果: Victory

ゲームの流れ

・ほぼ同じくらいか、少しレベル負けした状態でゲームが進んだ。
・中盤は相手 Malthael と Sonya が無双して集団戦で少し負け気味だった。
・後半は、味方が5人いるのに相手が個別に特攻してきたのを狩れたのと、レベル 20 になった Kel’Thuzad と Raynor で押し切って集団戦で全勝した。

リプレイを見ながら思ったこと

・Raynor(私)は、Malthael の E スキル(Death Shroud)を横に避けてかわそう。
・Mid のレーンで 3 vs 2 なのは別にいいけど、Bot の Murky が Help Ping 出したら誰か寄ってあげた方が良かった。(Top は Raynor)

反省点

・序盤、味方 Murky の Help Ping には、自分が行けないなら “some one go bot, plz” くらいは言うべきだった。
・このマップはオブジェクト参加の強制力が弱いので、相手が Abathur でレーン戦で1人数が多い有利を活かしつつ、Abathur の Locust Strain を優先的に倒しさえすれば EXP 負けせずに有利になるはず、と思ったんだけど、そう思い通りにはいかなかった。
・中盤、殺しにきた相手の Sonya, Malthael に、タイマンでの殴り合いで Raynor が勝てたりはしない。逃げよう

 

箱庭ゲームを作りたい

ユニットが仕事するのを眺めるのがメインのミニスケープゲームを作りたい。
で、いざどうゲームを作ればいいのか考えたときに、思った以上にゲームの作り方がわかってないのに気づかされた。 ゲーム作るの、むつかしいね。

少しずつでいいから実装していこうと思う。 作り方がわからない機能は、わかる方法で実装しようと思う。

 

Ace of Seafood プレイ後の感想

どんなゲームかの紹介はいろんなサイトに詳しいので省略します。
感想のまとめを先に書くと

  • 序盤が面白さのピークで、クリア前後はだれる。
  • 紹介記事は多いけど、まともな攻略サイトが見つからない!

という感じです。

序盤が面白さのピークで、クリア前後はだれる

説明がめんどいのでスクリーンショットを貼るけど、ゲーム開始直後のテンポはすごくいいです。 このためだけに買う価値はあります。

20161211095352_1 20161215170808_1 20161215170850_1 20161215170934_120161215170756_120161213103650_120161215171750_1

ただ、このゲームは拠点にいる敵(魚など)を倒していくゲームなんですけど、私の場合はクリアし後も倒せない敵が存在して、もやもやした気分になりましたね。

その敵が倒せないのが私のプレイスキルが足りないのか、ユニット(魚の種類)の相性が悪いからなのかがゲーム中ではわかわなかったし、 もし相性のよい味方ユニット(魚など)を成長させる必要があるんだとしても、相性を試したいユニットを育成するには時間がかかるしで 「めんどい」 って思ってしまった。

それから、ゲームをクリアすると、ちょっと強い敵勢力が出現するんだけど、これが倒せなくて 「勝てねぇ! もういいよ!」 って思った。 個人的にはプレイ後は気持ちよくゲームを去らせてほしい。

あとは、味方ユニットの活躍を認識しにくいのも、ちょっと気になる。 TPS 視点で自分以外を注視してるわけじゃないので、味方ユニットを成長させても、その活躍がわかりにくい。 (仕方ない気もするけど)

紹介記事は多いけど、まともな攻略サイトが見つからない

ゲーム開始直後の意外性とかはすごく良いせいか紹介記事は多い。でも、まともな攻略サイトが見つけられなくて、後半に 「あれ? クロマグロとサンマが倒せなくね?」 ってなったときに、どうすればいいかわからなくなってしまった。 いい攻略サイトがほしい。

このゲームだけに限った話じゃないんだけど、プレイヤーが工夫してなんとかなるうちは楽しい。 でも、倒せない敵に遭遇してしまったときに 「ゲーム自体にヒントがある」 または 「攻略サイトに対処方法が載っている」 のどちらもないと、とてもつらい。 というか、そのプレイヤーにとってのゲームはそこで終わる。

Ace of Seafood は中盤以降の難易度を上げすぎた感があって、そこは私には合わなかった。

 

Plantera をプレイした感想

そういえば、こんなゲーム買ってたんだっけ? ということで、ついつい Plantera というゲームを始めて、クリアまでしてしまいました。

20161208220218_1

出てくるキャラクタが魅力的で、いい感じです。
ゲーム自体は、野菜や木を植えて、できた果実などを収穫するというクリッカーゲームです。 クリッカーゲームなんですけど、青いユニットが自動で収穫してくれるし、果物が実って木から落ちる様子が見てて飽きなかったりと、ほのぼのとした気分で眺めていられます。

20161208220239_1

はっきり言ってゲーム自体にに深みはないんですけど、適当なプレイ時間で全実績が取れるし、あとくされなくアンインストールできるあたりとか、とてもいいと思います。

20161208220246_1

ゲームのニュースも「今回はこういう変更したんだ。みんなありがとう、これからもよろしくね」みたいな感じで、読んでて好感が持てるし、私はこのゲームが好きです。

こういうゲーム作りたいです!

Infinifactory をプレイ

Humble Bundle で 3D パズルゲームの Infinifactory を購入したので遊んでみた。
ゲーム自体は出現するブロックを目的地まで移動させるように道を作る感じです。

20161123203132_1
初期状態
20161123203143_1
ベルトコンベアで道を作った後

置けるブロックの種類はステージが進むにつれて増えていくようだ。

で、このゲームステージまでにチュートリアルを兼ねたオープニングがあるんだけど、これが思わせぶりですごくいい感じだった。

20161123200707_1

オープニングはこんな感じで夜道を運転してるところから始まって、そのあと…。

おっと、今回はここまでにしようと思います。

透過メガネっぽいアプリ作り

「すけすけゴーグルくん」アプリの記事を見て「あ、これなら私にも作れるかも」って思ったので作り始めた。 画像処理の勉強も兼ねようと思ったので、「実践コンピュータビジョン」(O’REILLY) を見ながら進めた。

作る前の準備

まず、どう作るか考えた。

透過なしの場合の描画内容

ーーーー  ← メガネのフレーム画像
ーーーー  ← カメラで取得した画像

透過する場合の描画内容

ーーーー  ← レンズ部分に透過画像をはめ込んだ画像
ーーーー  ← メガネのフレーム画像
ーーーー  ← カメラで取得した画像

ここまでで、透過前、透過後、そしてメガネの画像が必要そうなのがわかった。
で、必要な素材を「いらすとや」さんで探してきた。

ushi ushi_naked glasses

いらすとや さん、ありがとう!
次に、適当な Web カメラがないのに気づいたので、最寄りのビックカメラで一番安いやつを買ってきた。

cheap_web_camera

なんだろな、ここまで準備がガバガバだと、「本当に思いつきで始めたんだなー」って自分で客観視できて良いです。

作り始めた

私が勉強していく過程でわかったこととかを説明し直すのは面倒なので、作業途中のスクリーンショットだけ貼っていきます。

ushi_sift_matching
同じ画像で SIFT 特徴量を用いたマッチングをしたはずなのに、対応位置がずれてショックを受けたときのスクリーンショット。

ushi_sift_matched_fixed
ふて寝した後で見なおしたら、あっさり修正できたときのスクリーンショット

ushi_match_matched
ホモグラフィーとか RANSAC を使って、モニタをカメラで撮った画像に対して検出できた画像の枠を青色で描画してみたときのスクリーンショット。 それなりに動作してちょっと嬉しかった。

transparent_niku
最後に、眼鏡内に透過後の画像をはめ込むようにして、実際に動作させたときのスクリーンショット。 縮小してない画像に SIFT を適用して処理が激遅だったり、アフィン変換が RGB 画像だと失敗する理由がわからなくて、透過画像が白黒になったりしている。

とりあえず、動作したことにした!

まとめ

  • 実践コンピュータビジョンの内容に沿って進めたら、それなりに動作して嬉しかった。
  • ちゃんと動くものを作るなら、何かの AR ライブラリを利用して作るのが簡単だと思う。
  • 和牛の垂れ幕が透けても、あまり嬉しくないのがわかった。

今回の記事のソースコードとかは、以下にあります。
https://bitbucket.org/satofumi/transparent_glasses

「勝ったら実力、負けたら運」についての考察

ゲームで負けると悔しい。  何度やっても負け続けると、そのゲームではもう遊ばなくなってしまうだろう。 長く楽しめる要件として「負けたときの理由を自分以外に転嫁できる」は大事な要素だと思う。

多対多のゲーム(MOBA)の場合

そういう見方をしたときに、多対多の MOBA は「勝ったら実力、負けたら味方のせい」が成り立ちやすいと思う。 Heroes of the Storm を例に上げると Warrior x 1, Assassin x 3, Support x 1 という構成だったときに、

「Warrior が 仕事してなかった」
「Assassin が突撃して死にすぎた」「Support の回復が悪かった」
「集団戦で 1人だけ集まるのが遅くて 4 vs 5 で負けた」
「私が揃う前に集団戦を始めて 4 vs 5 で負けた」

など、各々の立場で他人への批判ができる。 1 人で敵5人の集団に突撃するようなクソ Assassin にさえ「味方がついてこないのが悪い」という言い訳が可能になる。

その批判が適切なことも当然あるし、20 分くらいのゲームにおいては各人が少しずつ批判されうるプレイングになるのも確かだ。

1対1のゲームの場合

負けたときの理由は「相手が強かった」「自分が弱かった」というのが実際のところで、言い訳としては「ユニット、戦略の相性が悪かった」などになる。

負けたときにリプレイを見て「よし、ここが悪かったから次はこうしよう」と切磋琢磨できる人や、相手を出し抜いて勝ったときの楽しさが忘れられない人が遊んでいるように思う。

1人でやるゲームの場合

ソシャゲに多いパズルゲームなんかを想定して書く。 こういうゲームは基本的にはプレイヤーが勝てるように、あるいは敗北がない設計になっているように思う。 それは、負けたときの言い訳が「自分が下手だった」「必要なアイテム、ユニットを持っていないのに挑戦した」くらいしかできないからだ。

実際には、プレイヤーが勝てるステージを何度もプレイできるようになっており、プレイするうちにユニットのレベルが上がって次のステージがクリアできるようになる、という設計で、ゲームの寿命を伸ばしているように思う。

ただ、何度も同じステージをプレイしていると飽きてしまうので、そのあたりの調整はすごく大変だと思う。

まとめ

負けたときに「下手だから負けた」以外の言い訳ができると、ゲームとしての寿命は長くできると思う。 作りたいゲームを考えるときには、こういうのを意識していこうと思った。

負けたときに他人のせいにしてしまうのは、「自分が他人に親切にしたことは覚えてるけど、親切にされたことは忘れがち」という心理も絡んでいるのかもしれない。