・~あらすじ~クリスマスではないけど、一応アドベントカレンダーの名目で二日目の記事書かせてもらいますOUCCの2DCG班長です。最初は適当にunityの音声認識の記事でも書いてやり過ごそうと思ってたんですが、一日目の先代の部長が結構頑張ってたんで、それを見て急遽書く内容変更して、一日で出来るけどそこそこ難易度のあるテーマを考えました。シートン学園を見ながら3時間くらい悩んだ結果、PCの隣にあったMONO消しゴムのデザインがエストニアの国旗に似ているな~とふと気が付いて、現在に至ります。消しゴムの青いところを取得コードが300行あって説明が大変なので要点をかいつまんで書きます。読んでも幸せになれない可能性があるので、青い鳥をお探しの方は結果まで飛ばした後、AMAZONにお買い求めください。※実行環境はwindows10、Python3.8で、使用ライブラリはOpenCVとNumPyです。↑(これは白い部分の中に散見される黒い所を出来れば除去したいなという希望でやってます。・各々の輪郭についてcv2.contourAreaで輪郭領域内の面積を求め、小さすぎる領域や、大きすぎる領域を除外。・一面真っ黒の画像をnp.zerosで生成。・cv2.momentsで輪郭で囲まれた各領域の重心を求める。・cv2.floodFillで先ほど輪郭を描画した画像について重心を含む領域を塗りつぶし。・塗りつぶし画像のnp.averageが大きければ塗りつぶし失敗なので、cv2.bitwise_notで反転。・こうして作成された塗りつぶされた画像(輪郭の数だけ存在)と輪郭情報をペアでリスト(名前:blue_area)に格納。・消しゴムの黒い部分に関しても同様にして、リスト(名前:black_area)に格納。MONO消しゴムを判別MONO消しゴムは青から少し離れて黒の領域があるという性質を利用して消しゴムの柄の場所を特定していきます。・black_areaとblue_areaの要素の全ての組み合わせについて、12つの塗りつぶされた画像の膨張を前述のdilateで行う。2cv2.bitwise_andで重なった領域を取得する32つの画像の重なった領域がnp.averageが0より大きいかを見て存在を確認し、存在すればその組み合わせを除外(一つの消しゴムの青い領域と黒い領域が接することは無いため。)4np.concatenateで2つの輪郭領域情報のリストを結合する。5cv2.minAreaRectで二つの領域に外接する最小の長方形を取得。62つの塗りつぶされた領域の面積を前述の方法で求める。7長方形の面積を求める。8長方形の面積が塗りつぶされた面積に対し比較的大きかったり小さければその組み合わせを除外(青と黒の領域が離れている組み合わせを除外)9除外されずに残った組み合わせの先ほど作成した長方形を保持。青い部分の抽出された画像(blue_areaの要素の一つ)と黒い部分の抽出された画像(black_areaの要素の一つ)をOR演算で合成し、外接矩形を表示した画像。心の清い人には外接しているように見えるはず。長方形の面積が白い部分の面積より比較的大きいため、この組み合わせは正しくないと判別する。・保持された全ての長方形と保持された他の全ての長方形との組み合わせしていき、一方の長方形がもう一方の長方形にほとんど含まれているとき、大きい方の長方形を除外。↑この判別法は、長方形の領域を塗りつぶし、AND演算を行って重なった部分の比率がどれくらいあるかで判別しています。・残った領域一つ一つについて、その領域の部分だけをマスキングして切り取る。(読み込んだ画像と長方形の中身を塗りつぶした画像のAND演算)↑なお、この過程で次元の低い長方形塗りつぶしの画像はcv2.COLOR_GRAY2BGRで3次元に変換。・hitomatagiさんのコードにかけて特徴量マッチングし、コード中のgoodの個数がある一定水準を超えないものを除外。特徴点を結んでいった画像ここまでクリアしたものををMONO消しゴムと認定します。MONO消しゴムをイタリア化ここから色付けをしていきます。...とその前にもう3時近いので寝ます。おやすみなさい~おはようございました。記事を書いていたのは夢落ちではないそうですね。...・各長方形を塗りつぶした画像と読み込んだ画像の青い部分を取得した画像のANDを取る。・AND演算して出来た画像の白い部分が存在するピクセルの座標と、同じ座標の読み込まれた画像の場所の色を緑に変更。完成!・結果イタリアと化したMONO消しゴム他の画像での実行結果とても精度が悪いですね。影は仕方ないとしても、文字の部分や、ノイズは頑張ればどうにかなる部分です。作者は途中で力尽きました。・コードRTAして書いたコードなので絶対見ない方がいいですよ。コード整理をしてなくてもOKで、呪い耐性がある方だけどうぞ。2019の23日目の記事です(完成したのは12/31です)パワポケから野球要素を抜いたノベルゲームみたいなのを作りたかったので、12月から土台作りを始めました。土台作りといっても基礎となる部分は以下のサイトを参考に作成しました。今回はこれをパワポケ風に近づけるために追加した機能を書きたいと思います。キャラの立ち位置を二か所にするパワポケでは左右にキャラが立って、会話が展開されるので、まずはキャラを左右に立たせるようにしました。このとき、3人目のキャラを追加するときは、既にいるどちらか二人のうちの一人を消して、3人目のキャラを追加するようにしました。背景画像を変える#bg_imageで背景を変えられるようにしました。真ん中に画像が出るようにする背景と同じ要領で真ん中に画像が出るようにしました。背景との違いは#center_imageで真ん中に画像が出現して、#center_image_offでその画像を見えなくするといったところです。選択肢の内容をメッセージボックスに表示する選択肢のボタンを表示させて、ボタンに触れるとそのボタンのテキストの内容をメッセージボックスに表示するようにしました。その他機能そのほかに追加した機能としては、BGMを変える機能や、SEを鳴らす機能、コマンドで使用している'#'をメッセージボックスに表示させるためのエスケープシーケンスを実装しました。まとめ以上述べたような機能を実装しましたが、パワポケ風にするためには、パラメーターの追加やフラグ管理など、追加しなければならないことが沢山あるのでこれからも追加していきたいと思います。今回は容量の都合上、gif画像を使えなかったので、次に投稿するときはgif画像を上げられるようなブログで書きたいなと思います。Unityで武器換装機能を実装したい~先週VRのシューティングゲームを作っている最中に武器の換装機能を徹夜で実装する機会がありました。その際プレイヤーやどこかのGameObjectに全ての武器の処理を書くのが煩雑で嫌だなと思ったので、武器のオブジェクトにその武器の動作を規定するスクリプトを張り付けることにしたんです。一様に処理できないことに気が付いて、AM2時を迎えた私は大変困りました。それで何分悩んだかわからないけど死にかけの頭で考えて何とか実装には成功したので、今後同じ事態にはまった時のためにメモとしてここに記述します。GetComponentsGetComponents<>()というメソッドがあって、ここでMonoBehaviourを指定すればMonoBehaviourを継承したスクリプト、つまり自作のスクリプト(の大半)を全て取得できるそうです。(↑実はこの:の後の部分が継承元だったんですね。私はC#を勉強せずにUnity書いてる人なので知りませんでした。存在するメソッドしか使用できないみたいです。取得し、shootメソッドを使用することが出来るようになります。2DCG班班長、AI班班長ちなみに筆者は当日実装間に合ってません。思いついてUnityで簡単に作ったゲームについて書きます。作ったといっても個人で自己満足するくらいの出来で、とても他人に見せられるものではないです。今回考えたゲームのテーマは、「デッキ作製系リアルタイム対戦ゲーム」です。コマンドを10個程度用意し、ボタンをクリックするとその効果を発揮する、という感じで先頭を進めます。連打は禁止するために一定時間押せないようにし、また、押すたびにそのボタンが発揮する効果を変更します。ほんとはもっとカードっぽいものにしたいんですけど、もちろん著者にそんな技術や時間はありません。ボタンに現れる効果は、あらかじめデッキを作成しておき、そのデッキにおけるカードの割合で出す、ということを考えています。攻撃カード、攻撃力アップカード、魔法攻撃カード、魔法攻撃アップカードを各1枚ずつ入れたデッキなら、4分の1の確率で各カードが登場します。戦闘はこのボタンクリックのみで行います。アップなどのカードも入れる必要があると思います。カードゲームをしたことがある人なら、使いたいカードをただひたすら入れてもうまく動かないことがよくわかると思います。戦闘そのものより、戦闘しやすいようにデッキを作る、というのが主なゲームになると思います。そんなところまで作ってませんけど。ここからは、このゲームを作る場合どうするのがいいかということついてだらだら書こうと思います。能力アップ系のカードについてですが、戦闘中に何回も押されるため、効果を小さくする必要があります。1.1^100は約14000なので、まあ1.1倍とかがいいのかなと思います。1回の戦闘で終わるのはせっかく強くしたのに、という感じだったり難易度的にもその敵に対しデッキを作るだけになるので、フェーズの形で1つ前の状態を受け継いで次の敵キャラとの戦闘に入る、とするほうがいいんじゃないかと思ってます。デッキ作製系ゲームを謳うならカードの種類もいろいろ必要だと思うんですけど、上に挙げたもの以外だと普通の攻撃だけでなく必殺技を設けるとか、あとはレベルの高いカードを用意して、効果が1.1倍でなく1.2倍になったり、次にカードが押せるようになるまでの時間が短くなるみたいな効果を追加したらいいんじゃないかと思います。あとは、デッキを2つ用意しておいてデッキを入れ替えるカード、というのもゲーム性が上がるんじゃないかと思います。ここまでいろいろ書いてきましたが、僕はこのゲームを最後まで作るつもりはありません。そんな気力がないので。ここまで作って完成ということにします。いうゲームがあるなら教えてほしいです。