ゾンビとUnity

ゾンビネタとUnityでのゲーム制作について綴るブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unity ユニティちゃん2Dでウニを投げる

unity uni 6

2Dスプライトで3Dのテレインの上を走り回るプロトタイプはできました。

Unity ユニティちゃん2Dで3Dの地形を走る
http://bosukete666.blog.fc2.com/blog-entry-245.html

次は2Dのオブジェクトを拾って投げるプロトタイプを作りたい。
前回作成したプロトタイプを拡張する形で作ります。


まずは結果から



できました。


何を投げようか

ユニティちゃんの2Dデータに、Uni(ウニ)というダメージオブジェクトが同梱されているので、これを流用します。


投げるウニを作る

ユニティちゃんが拾って投げるためのウニの処理を作ります。

UnityChan2D > Demo > Prefabs にウニのプレハブがあります。
unity uni 11

これを Hierarchy にドラッグ&ドロップして、Circle Collider とスクリプトを削除して、Sphere Collider(3D)と Rigidbody(3D) と自作スクリプト(Uni.cs)を追加。
または、空のゲームオブジェクトを作って、Sprite Renderer と Animator と Sphere Collider と Rigidbody と Uni.cs を追加しても良いです。
後者の方が良いかも知れない。

ウニのコライダーを動的に削除・追加している理由

地面を転がってるピンク色のウニをユニティちゃんが拾うことになるのですが、拾った後、ウニをユニティちゃんの手元に配置します。
この時に、ウニについてる Sphere Collider がついたままだと、ユニティちゃんについてるコライダーと、ウニのコライダーが接触することで、反発し合い、お互いの Rigidbody がお互いを弾くように力を加えてしまいます。
その結果、ユニティちゃんが勝手に動いてしまいます。

unity uni 12

これを防ぐために、ウニを拾ったらコライダーを削除して、投げて手元から離れたらコライダーを追加し直しています。

unity uni 13



投げるウニを発生させる

一定時間ごとに空からウニが降ってくるようにします。
このウニを管理するオブジェクトを自前で作ります。

管理オブジェクトを自前で作る理由

ある程度の知識がついてくると「Unity 自体にゲームオブジェクトの管理機能があるんだから、自分で作るのは無駄じゃないか?」と考えるようになります。
Unite Japan 2014 で 「FindObject は遅いから使うな!」というユニティの講演がありました(どの講演だったかは覚えていません)。
解決策として「オブジェクトをまとめて管理するマネージャーは自前で作ろうぜ!」という方法が提示されていました。

FindObject って何? GameObject.Find ? Object.FindObjectOfType ? という疑問が払拭できないのですが、とりあえず一番マッチしている後者だろうということにしておきます。

大した手間ではないので、自前で作ります。

名前は UniGenerator.cs です。
一定時間でウニを発生させたり、ここにウニを発生させろ!このウニを削除しろ!という命令を扱います。
ユニティちゃんの近くにあるウニを検索する機能もあります。

unity uni 14

空のゲームオブジェクトを作成して、名前を Uni Generator に変更し、UniGenerator.cs を追加。

List を使っている理由

実測してみないと分からないんですが、数千個程度のデータなら線形リストを頭から順番に検索しても問題ありません。
ただ、1フレームで数千個程度のデータを何度も検索するなら問題になるかも知れません。
今回は1フレームに最大で500個のデータを1回しか検索しないので、配列か List で十分です。
二分木を使ったりハッシュを使ったりするのは、もっと膨大な量のデータを扱う場合です。

ウニを子オブジェクトにする

作った Uni を UniGenerator の子オブジェクトにします。

何故か?

ウニは最大で500個まで生成可能です。
それだけのウニを作ると Hierarchy が Uni だらけになります。
Uni を子オブジェクトにしておけば、見る必要がないときは親オブジェクトの左にある三角マークをクリックすることで、子オブジェクトを非表示にできます。
「Hierarchy がウニだらけで、ユニティちゃんが見つからない!」というのを防ぐためです。

unity uni 9 Uni は UniGenerator の子オブジェクト
unity uni 10 見たくないときは非表示にできる


ダメージ処理

ユニティちゃんデータのスクリプトにダメージ処理があるので、これをほぼそのまま流用します。
ライフやHPはなく、ただユニティちゃんが痛がるアニメーションをするだけです。


どんな時にダメージを受ける?

元の処理だと、DamageObject※ のコライダーと接触したらダメージを受けるという処理になっていますが、もうひとつ判定方法を追加します。

※DamageObject の Tag が設定されている GameObject

ユニティちゃんが自分で投げたウニが壁に当たって跳ね返って、それがユニティちゃんに当たった場合、ダメージを受けます。
勢いがなければ当たってもダメージは受けません。
どれくらいの勢いだったらダメージになるか?を調整するのが難しそうなので、Inspector で調整できるようにします。

unity uni 6

勢いは rigidbody.velocity.magnitude で判定してみます。
rigidbody.velocity.magnitude は、剛体にかかっている力のベクトルの長さなので、間違ってはいないはずです。
ダメだったら別の方法を考えます。


ウニを拾う

新しく Projectile というタグを追加します。
このタグがついているウニは、ユニティちゃんがこれから投げる予定のウニです。
ユニティちゃんがただのウニを拾ったときにこのタグに変更して、投げてから数秒間はこのタグのまま変りません。
数秒経ったら元のタグに戻し、ただのウニに戻します。
あとあと障害物や敵キャラを追加することになると思うので、障害物を壊したり、敵を攻撃したりするときの目印として使います。

ウニを拾ったら、親オブジェクトをユニティちゃんに変更します。
ユニティちゃんが持ってるオブジェクトだから、親はユニティちゃん。
直感的に分かるし、このオブジェクトの状態を確認したくなったときに、Hierarchy から探しやすくなると思います。


投げる

unity uni 2

Rigidbody.AddForce() でユニティちゃんが向いている方向にウニを飛ばします。
ユニティちゃんがウニを拾うときにコライダーを削除しているので、投げる瞬間にコライダーを付け直します。


拾って投げるだけじゃ退屈だから、壊せるものを何か作ってみる

ウニを投げてぶつけると破壊できるオブジェクトを作ります。
このために新しく絵を描くのもめんどくさいので、ウニの色変えで対応します。

unity uni 7

ウニをモジャっと固めたウニ塊を作り、真ん中あたりにコアを配置します。
ウニ塊には Rigidbody がありません。見た目で分かるように色を変えておきます。
このコアを破壊すると、ウニ塊が爆発して、ウニが飛び散るようにします。

unity uni 8

ウニ塊の状態では Rigidbody がないため、ギッチギチに詰めて配置してもおとなしくその場にいてくれます。
コアが破壊されて、ただのウニに置き換わると Rigidbody があるため、すし詰め状態のウニがお互いに反発し合い、爆発するように飛び散ってくれます。
物理演算って素晴らしい!


今回作ったプロジェクト一式

ダウンロード(40.5M)


ユニティちゃんライセンス

このアセットは、『ユニティちゃんライセンス』で提供されています。
このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。


 
スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。