「ソフトウェア」カテゴリーアーカイブ

Unity の Window を透過させてみた

今回は Win32 API を呼び出して Unity アプリを実行させるウィンドウを透過させてみました。

作ろうとしたもの

Unity で exe ファイルを生成して、実行するとウィンドウ枠がなくなって、ウィンドウ背景も透過するようなものを作ろうとした。 最終的に、デスクトップマスコットとして動作させようとした。

途中経過

このフォーラム中のソースコードを書き写し、Query ちゃんと Cube とを配置して実行してみた。
http://answers.unity3d.com/questions/869378/viewing-desktop-in-scene.html

できたもの

こういう風にモデルを配置して
HowIsTheProgress_unity

実行すると、こんな風になる。
HowIsTheProgress_exec

 

感想、今後の予定

現状では、こんなふうに背景もモデルも関係なく透過しているので、個々の Win32 API の機能について調べたり、調べなおしたりして対処したい。

今回のソースコードは、下記プロジェクトのリポジトリ中の HowIsTheProgress です。
https://bitbucket.org/satofumi/unity_learning

Unity を使って狙ったところのオブジェクト情報を取得してみた

Grappling Hook でもって、クリックした先にフックを引っ掛けるような動作をさせようとしたときに、自キャラとカーソルの先にあるブロックの情報を取得しようとしてできなかったので、その情報を得るだけのサンプルを作ってみました。

作ろうとしたもの

画面内にブロックをたくさんと自キャラを配置し、自キャラとクリックした位置の先にあるブロックの情報を表示するサンプル。

途中経過

RayCastInformation_blocks

ブロックと自キャラ(緑)を配置した。

RayCastInformation_rays

Game ビューでクリックすると Scene ビューで Debug.DrawRay() の線が描画された。 あ、ここまででブロックには Blocks っていう名前のレイヤーを定義しておいた。

できたもの

動いた。 主なコードは下記の通り。

void Update()
{
  if (Input.GetButtonDown("Fire1"))
  {
     Vector3 direction = Camera.main.ScreenToWorldPoint(Input.mousePosition) - OwnCharacter.transform.position;
     RaycastHit2D hit = Physics2D.Raycast(OwnCharacter.transform.position, direction, Mathf.Infinity, 1 << LayerMask.NameToLayer("Blocks"));
     if (hit)
     {
        Debug.Log(hit.collider);
        Debug.Log(hit.point);
      }

      Debug.DrawRay(OwnCharacter.transform.position, direction, Color.red, 10f);
   }
}

感想、今後の予定

ここまでに勘違いしてたことは

  • Physics2D.RayCast() の2番目の引数は「目的座標」じゃなくて「向き」であるということ。
  • Debug.DrawRay() の内容は Scene ビューにしか表示されないこと。

です。
正しく理解できてよかった。

今回のソースコードは、下記プロジェクトのリポジトリ中の RayCastInformation です。
https://bitbucket.org/satofumi/unity_learning

Unity を使って Grappling Hook を作ろうとしてみた

フックを使って天井にロープをひっかけて移動していくやつ。 今回はそういうのを作ろうとしてみます。

作ろうとしたもの

天井にロープ付フックをひっかけては進み、ひっかけては進みができるサンプル。

途中経過

GlapplingHook_blocks
ブロックを配置した。

GlapplingHook_rope
Hinge Joint を連続でつなげてロープを作った。

GlapplingHook_connected

ロープに自キャラを接続した。

GlapplingHook_fixed

ロープの質量を軽くしたり、自キャラへの重力の影響を変更した。

できたもの

この次に、自キャラとクリックした先の延長線上にあるブロックに新しいロープを作り直す、って処理を実装しようとして失敗した。 自キャラとマウスの先にあるはずのブロックの情報が適切に処理できなかった。 わからん。

感想、今後の予定

よくわからないので、仕切りなおすことにする。
次は、自キャラとクリックした先にあるブロックの情報を取得するサンプルを作ってみようと思う。

今回のソースコードは、下記プロジェクトのリポジトリ中の GlapplingHook です。
https://bitbucket.org/satofumi/unity_learning

Unity の NavMesh を使って目的地まで移動させてみた

障害物を避けながら移動する仕組み NavMesh を試してみた経過を、スクリーンショットに適当なコメントをつけながら紹介します。

作ろうとしたもの

障害物を避けながら移動する何か。

途中経過

MoveToGoal_objects

とりあえず、移動する物体と障害物になる予定のブロックを用意しました。

MoveToGoal_0

障害物はプレハブ化して、ランダムな位置に配置しました。 このスクリーンショットのように、初期位置が他のブロックと重なると場外に落下することがあります。 諸行無常です。

できたもの

MoveToGoal_1 MoveToGoal_2 MoveToGoal_3

で、Nav Mesh を地面に適用し、Nav Mesh Agent を赤い球に適用し、Nav Mesh Obstacle をブロックに適用しました。

で、クリックした位置を指定して SetDestination() を呼び出すと、赤い球がちゃんと動くのが確認できました。

これらのスクリーンショットから移動の様子を読み取るのは不可能だと思いますが、動画を用意するのは

めんどう

なので、このままでよいことにします。

感想、今後の予定

Unity すごい。 C++ で書くと面倒で仕方がない処理が調べながらでも2時間くらいで実装できるの、やっぱりすごいです。

ただ、移動については速度や加速度を調整しないと障害物間際でプルプルしたりします。

今回のソースコードは、下記プロジェクトのリポジトリ中の MoveToGoal です。
https://bitbucket.org/satofumi/unity_learning

 

Unity を使ってずんだ餅が転がるだけのアプリを作ってみた

前回からの間に「よし、ちょっとカッコイイ陣取りゲームを作ろう!」って思った結果、「良い物を作ろうとして進捗が止まる病」にかかっていました。 で、それを指摘されたので原点回帰として適当な Unity アプリを作りました。

作ろうとしたもの

漏斗に粒をたくさん流しこんで眺めるやつの 2D 版を作ろうとしました。

途中経過

とりあえず画像を貼り付けて簡単な説明を書いていきます。

ZundaFunnel_add_prefab

棒とボールを作って配置しました。 isKinematic がそのままの状態で実行してしまい、棒も落ちていく様子を見ることができました。
あ、ボールには画像として「東北ずん子」のサイトにあるずんだ餅を使用しました。
東北ずん子のイラスト、素材のページ: http://zunko.jp/con_illust.html

zzm_zunda

ZundaFunnel_last

ずんだ餅の粒を Prefab 化して、ある点からランダムな方向に発射されるようにしました。 なんというか、それっぽい感じです。

ZundaFunnel_tumaru

それから、出口が狭いと詰まってしまうのが確認できました。

「つまらないアプリじゃないな!」

とか喜んだりしました。

できたもの

ZundaFunnel_continuous

ここまで実装して、

「あ! これ完全に米の脱穀機だ!!」

って思いました。

感想、今後の予定

今回、無事に米の脱穀の様子を表現することに成功したので、次はまた別の何かをしようと思います。 A* アルゴリズムでキャラクタを移動させるのとか作ってみたいです。

今回のソースコードは、下記プロジェクトのリポジトリ中の ZundaFunnel です。
https://bitbucket.org/satofumi/unity_learning

Unity を使って縦シューティングを作ろうとしてみた

前回のジャンプする何かに引き続き、縦スクロールシューティングを作ろうとしました。
で、途中で挫折しましたが、その挫折するまでの経過と挫折した理由を書き出します。

作ろうとしたもの

ゾンビがわらわらと出現するのを、ショットガンで撃つようなゲーム。

zombieshot_idea

主人公を操作できるようにした

主人公のアニメーションを定義して、指でのスライド操作にしたがって動作するようにした。
素材は「ぴぽや」のものを利用した。 http://piposozai.wiki.fc2.com/

zombieshot_animator

ちゃんと調べた結果、前回よりもアニメーションのステートをシンプルに作れた。 調べることが大事なのが再確認できた。

ゾンビを出現させた

zombieshot_zombies

もとは肌色だった村人の絵を Gimp で色を変えてゾンビっぽくした。 で、それを1秒毎に画面中央に配置した結果、ゾンビが出現するたびに外側に押し出されて、ちょっと怖いスクリーンショットになった。 主人公とゾンビの描画の重ねあわせ順が変なのは気にしないことにした。

zombieshot_rotate

あと「Z 軸で回転しない」のチェックを忘れてたせいで、宇宙遊泳な状態になったりもした。

弾が発射されるようにした

ゾンビが画面上の外側から出現するように調整して、弾を一定間隔で自動的に発射するあたりを実装した。 最初は間違えて右側(ゼロ度)の方向に弾を発射するように実装したけど、修正して上(90 度)の方向に発射されるようにした。

zombieshot_bullets5 zombieshot_bullets5_front

作っててワクワクしなくなったので中断した

ここまで作ったときに「次は弾の命中処理、命中後の処理、ゾンビの体力表示か。 判定のあたりはレイヤー使えばいいか、めんどいな…」って思ってそのまま更新しなくなったので、中断することにした。

仕事ではなくて趣味でやってることなので「作ってて楽しい!」 って思っているうちに一気に作るべきだったと思う。 時間をかけると、どうしても作った直後の高揚感は減る。

まとめ

縦シューは、縦シューを好きな人が作ればいいと思った。 私はもっと…、こう…、私しか作らないような意味のわからない何か作ろうと思った。

あと、最初に Unity で作ったのがそれっぽく動いたせいで「よし、ちょっとカッコイイものを作るぜ!」って思ったのもよくなかった。 変にカッコつけようとすると実装は進まない。 カッコつけるのは Lisp だけでいいと思うんだ。 このブログはもっと適当にいろいろ書こうと思う。

ここまでのソースコードは下記プロジェクトの ZombieShot で管理されています。
https://bitbucket.org/satofumi/unity_learning

Heroes of the Storm のスクリーンショットのプレイヤー名をぼかすプログラム作成

ブログ記事を書くときに、スクリーンショットのプレイヤー名にボカシを入れる処理を、毎回やるのが面倒そうなので、そういうプログラムを作ってみました。

方針

引数でスクリーンショットの画像ファイルを渡すと、プレイヤー名の位置にボカシを入れた画像ファイルを生成することにします。

実装

OpenCV の matchTemplate() を使って、用意した体力フレーム画像とマッチングを行います。
具体的には、赤青それぞれのチームの以下のような画像をゲーム中の画像から切り抜いて用意しました。 jpg 画像から切り抜いたせいか、微妙に各チームの色味があるのがわかります。

blue_frame red_frame

ソースコードの処理概要は、引数で渡された画像を読み込み、枠のテンプレート画像とのマッチングを順番に行っていることくらいです。 難しくないです。

ソースコードへのリンク

動作例

hots_training_clipped hots_training_clipped.png.masked

このくらいの重なりぐらいなら、適切に処理できます。
(名前でない場所にボカシを入れたり、名前のある箇所を検出できなかったりすることもあります)

ソースコードの場所

下記アドレスで Mercurial 管理しています。
https://bitbucket.org/satofumi/hots_tools

今後の予定

もう少し自分で使ってから、Windows 版を作成して配布します。(使ってみたい方は、お知らせ下さい。大喜びでお渡しします)
あとは、このプログラムとは別ですが、ゲーム中の視線を記録してミニマップを見るよう矯正したり、脈拍を計測して自分にどういう影響があるかを可視化するプログラムも作っていきたいと思っています。

Unity を使ってジャンプするゲームを作ってみる

Moai SDK は好きだけど情報量が少なくてつらいので、Unity を使ってみることにしました。 まずは、簡単にキャラクタがジャンプしてブロックを登っていくようなゲームにします。

jump_app_720

イメージはこんな感じです。
で、詳しい作り方はそれっぽいサイトに任せることにして、作成途中のスクリーンショットと感想だけ書いていこうと思います。

TapJump_map

ここまでで Prefab 化したブロックを生成するようにした。 最初は手動でブロックを配置しようとしたものの面倒なので C# から生成するようにした。 マップエディタを使っては? という案もあったが学習コストがマップ規模に対して高い気がしたので見送った。
マップの背景とブロックの素材は「ぴぽや」というサイトのものを利用しています。

TapJump_platform

プロ生ちゃんのサイトからキャラクター素材を持ってきて利用した。
http://pronama.azurewebsites.net/pronama/download/

ここまでに Platform Effector 2D とキャラクターのアニメーションまわりとかを設定した。
Platform Effector 2D をブロックごとに適用するとキャラクターがブロックの継ぎ目で立ち止まったりすることが確認できた。 つらい。
なので、Platform Effector 2D は高さが同じブロックに一括で適用されるようにした。

TapJump_goal

画面にラベルを配置したりして、ゴールに触れたらゴールのアニメーションをするようにした。 ゴール直前でジャンプすると、落下しながらピースしたりと諸々の問題はあるけど気にしないことにした。 Web GL 版が、下記ページから遊べます。
http://hyakuren-soft.sakura.ne.jp/TapJump/

Web GL 版で表示を最大化すると画面枠が適切に表示されないのは…、仕様です!
(今、記事を書いてて試してて新たな実装間違いに気づいたけど、気にしないことにします。

この記事で作ったソースコードは、下記プロジェクト中の TapJump 以下にあります。
https://bitbucket.org/satofumi/unity_learning

電子の動きを制御するゲームの作成 (その2)

残りタスクの書き出しと優先度の定義

自前のチケット管理システムにチケットを作成したので、それの画像を貼ります。 上の方にあるほど、優先度が高めです。

electfic_playfield_tickets

順番に片付けていこうと思います。
せっかくなので〆切を決めると、優先度が黄色い矢印のタスクの完了を来週中に終わらせます。