Junpei Qawasaki

博報堂アイ・スタジオという会社でテクノロジーをベースに新規事業とかインタラクティブなものとかを色々とやっております

【Unity】移動&衝突判定するキリンと崩れる箱をさくっと作ってみる

今回はキリンの衝突判定を行いたいと思います。

技術書の序盤に載ってるような超基礎なのですがあんまし参考ブログ見なかったので備忘録までに。ちなみに前回作ったARとは似ているようで実は全然違うものです。あしからず。

さて、Unityでは面倒な物理計算は全てAPIがこなしてくれちゃったりします。なのでキリンが箱にぶつかって箱が倒れるのも以外にサクッと出来てしまうものです。

では、レッツトライ。

1.下準備

まずは動くキリンを作りましょう。新規プロジェクトでCharactorContorollerを選んでください。

f:id:jkawasaki:20140103004655p:plain

Sceneに必要なのはキリンのオブジェクトとぶつかる対象となる箱の山です。Capsuleを配置して[Hierarchy]から"CharactorContoroller"を追加して上げましょう。

これでキー操作でCapsuleが動くようになりました。スピードとかは[Inspector]の値設定で適当にいじってください。

f:id:jkawasaki:20140103001007p:plain

このままだとキリンの見た目にならないのでCapsuleとキリンのモデリングをくっつけて上げます。

くっつけるのは簡単でScene上でCapsuleにキリンのオブジェクトを融合させて、HierarchyでキリンをCapsureの小要素にした上げるだけです。

f:id:jkawasaki:20140103001107p:plain

2.cubeを配置して物理的に存在させる

では倒すためのブロックを配意していきましょう。

まずは1つ、cubeオブジェクトをSceneに追加します。このまま動かすと物理的にはcubeも存在するのでその上にキリンを乗せたりする事は出来ますが相互の物理は干渉されません。cubeは今はただ存在しているだけなので、3Dの世界の重力も何も影響を受けません。

ちゃんと物質として存在させる為に"Rigidbody"というコンポーネントを足してあげましょう。コンポーネントはオブジェクトを選択した状態でメニューのCompornentから追加出来ます。[Compornent]➡[Physics]➡[Rigidbody]で追加してください。

f:id:jkawasaki:20140103001413p:plain

これでこのcubeはこの世界の物理的干渉を受ける事になりました。

ちなみにこのcube、一個一個に設定しないとそれぞれ物理干渉しないのですが、command+Dでコピーすれば設定もそのまま量産出来るので沢山同じオブジェクトを作りたいときは便利す。

3.キリンパワー注入

さて、ここでキリンにcubeを押す物理パワーを与えましょう。

[project]の[Assets]➡[Source]➡[Scripts]に新規JavaScriptファイルを作ってください。このJSにキャラクターのシナリオってやつを書いていきます。今回は押すためのファイルなので[pusher]というファイル名にしました。で、Rigidbodyを押すための関数「OnControllerColliderHit」を追加します。

JSファイルをエディタで開いて下記をペーストしてください。

var pushPower = 2.0;

function OnControllerColliderHit (hit : ControllerColliderHit)

{

    var body : Rigidbody = hit.collider.attachedRigidbody;

    // no rigidbody

    if (body == null || body.isKinematic)

        return;

        

    // We dont want to push objects below us

    if (hit.moveDirection.y < -0.3) 

        return;

    

    // Calculate push direction from move direction, 

    // we only push objects to the sides never up and down

    var pushDir = Vector3 (hit.moveDirection.x, 0, hit.moveDirection.z);

 

    // If you know how fast your character is trying to move,

    // then you can also multiply the push velocity by that.

    

    // Apply the push

    body.velocity = pushDir * pushPower;

}

関数はリファレンスとしてWeb上に転がってます。

ちなみにデフォルトでstart()とかの関数がJSファイルに書かれてますが、これは無視して消してしまいましょう

エディタを修正したら保存して、projectからsceneのキリンにドラッグ&ドロップします。この時、コンポーネントを追加するのは小要素のキリンじゃなくて親要素のcapsuleの方って事に気をつけてください。これでコンポーネントが自動で追加(便利!)されてinspectorでも見れるようになります。

で、実行すると

 

無事cubeを押せるキリンが誕生しました。

f:id:jkawasaki:20140103004721p:plain

 

次回こそはコイツに炎を吐かせて箱を倒したいと思います。