Nanashi-softプログラマ専用Unityでゲーム開発


◇Unityでゲーム開発 -Mecanimを使ってキャラを動かしてみる(10-

ボールを押せるのはいいのですが,じわーーっとしか転がりません(ぁ
これはこれで面白いのですが,なぜこんな動作になるのか?
恐らくゆっくり衝突しているからでしょう

リジッドボディには,力を加えるための AddForceメソッドがあります
このメソッドの使い方は,強火で進めさんのサイトにて動画付きでよくわかる説明がされています
○[Unity][Unity3d]RigidBodyにAddForce()を行った場合のForceModeによる動作の違い
http://d.hatena.ne.jp/nakamura001/20120320/1332224186

ボールですので,Impulseを使って蹴る動作にしてみます

オブジェクトにコライダをセットしていると,衝突された時に OnCollisionEnterメッセージが来ます
その時に,もっと大きな力を加えてやります

○ボールに大きな力を加える

1.Projectの下の Create→C# Scriptを選択。syoutotuなど適当なファイル名にする(クラス名を同一にするのを忘れないように)
2.以下の OnCollisionEnterメッセージを追記する
    void OnCollisionEnter(Collision collision){
        if(collision.gameObject.name == "chara_collider"){    //衝突して来たのがキャラだったら
            this.rigidbody.AddForce(collision.gameObject.transform.forward * 2.0f + Vector3.up * 2.0f, ForceMode.Impulse);
        }
    }
3.ballオブジェクトをクリックして,syoutotuスクリプトを Inspectorにドロップして追加する

これで,キャラをボールにぶつけると,ボールが吹っ飛んで転がっていきます

解説)
OnCollisionEnterの引数に届く Collisionクラスには様々な情報が入っています
詳細はリファレンスマニュアルを参照のこと
○Collisionクラス(Unityスクリプトリファレンス)
http://docs-jp.unity3d.com/Documentation/ScriptReference/Collision.html

collision.gameObjectにて,衝突してきたオブジェクトの GameObjectクラスが取得できますので,何がぶつかってきたのかを判別します
これをしないと,床に落ちた時にも反応して吹き飛んでいきますw

this.rigidbody.AddForceで,ボール自身のリジッドボディに力を加えています
collision.gameObject.transform.forwardは,キャラの向きを示すベクトルです。その2倍の力を加えているのは適当な値で特に意味はありません
Vector3.upは上を示すベクトルで,ボールを浮かす為に加えています。これも2倍は適当な数値です

ForceMode.Impulseで,瞬発的に力を加えています



TOPプログラマ専用Unityでゲーム開発

メイナの実験場~きょとんとした,ぺたんこ座り娘+~ネコミトリ りうるうり -ノーマル-+