Raycast とはある地点から透明な線 (Ray) を
特定の方向に引いて
その Ray 上のどこかでコライダがあるか
検知するものです。
例をあげると、
銃から弾を発射するケースです。このレッスンでは
キャラクターが、
裏切り者で父を殺した敵である悪魔の箱を撃つことにしましょう。
Raycast 関数の文法は次のようなものです。
最初はまぎわらしいかもしれませんが
一回それぞれの部分で何がおこなわれるのか
理解すれば良く意味が分かるようになります。
最初に Ray の原点は
ワールド空間座標のどこかの地点です。
このレッスンでは銃の銃口の前の地点を
どこか選んで
Vector3 として X, Y, Z を格納します。
しかし、ワールド空間座標の向きは
撃つ方向に向いていないため
二つめの Vector3 により向き(direction) を
格納する必要があります。
この二つの Vector3 変数により
Ray が構成されます。さらに Ray 変数により
代用が可能であり、このデータ型で
二つの Vector3 変数を格納出来ます。
コードは次のようになります。
関数の次の引数は
RaycastHit 変数であり、
コライダの衝突にもとづいて情報を格納します。
これにより、コードの中で検索をかけて
どのオブジェクトが Ray と交差するか判定出来ます。
最後に、必須ではない引数が二つあります。
ひとつは Distance であり Ray の長さが決まり、
もし省略した場合、 Ray の長さはデフォルトで
無限(infinity)となります。
そしてレイヤーマスク(Layer Mask)です。これは
Unity のレイヤーシステムにおける特定のレイヤー番号であり、
もし Ray に無視させたいオブジェクトがある場合、
そのレイヤーに配置することができます。
それでは Raycast を使用した実用的な例を
みていきます。
このサンプルではパラシュートつきの壷があり
フロアに近いとき、パラシュートが
開きます。
壷は二つの部分から構成されていて
パラシュートと壷そのものです。
パラシュートには二つのアニメーションがあり、
一つはパラシュートを開くためののものであり、
もうひとつは閉じるためのものです。
このサンプルでは Raycast を下方向に
行なってフロアから壷がどれくらい
離れているかみて、environment コライダを
見つけることでフロアの確認を行ないます。
environment コライダは
environment という単語でタグづけされています。
スクリプトの中でそのタグを探しています。
Raycast 関数は if 文の中に
配置されているので、もし戻り値が true である場合、
つまり何かと交差した場合、
if 文の中のコマンドが実行されて
RaycastHit 変数にクエリをかけて
何をヒットしたかが取得できます。
今回 if 文の中に
Physics.Raycast を記述して、landingRay 変数により
箱の位置および下向きの方向を
格納します。Vector3.down というショートカット
を今回使用しています。
そしてこれを Raycast で使用する Ray としています。
RaycastHit 変数である hit は
下向きに Raycast するときに、
Ray によりヒットを受けるもの全てを格納します。
そして Ray の距離、すなわち length は
deploymentHeight 変数により定義されます。
もし Ray が environment タグを持つコライダと
交差した場合、DeployParachute 関数をコールします。
この関数は boolean 型である deployed フラグに true をセットして
反復しないようにします。
次に Rigidbody の Drag を
に parachuteEffectiveness 変数の値をセットします。
このため 壷がパラシュートにより抑制されたかのように
動きを遅くします。
さらに parachute オブジェクトのアニメーションを
再生して、
これは public 変数に割り当てする
ゲームオブジェクトです。
次に別の OnCollisionEnter があり、
閉じるアニメーションを再生します。
このため、地面または別のオブジェクトに当たると、パラシュートは
閉じることが出来ます。
ここで Ray の length に 4 をセットするために
deplomentHeight に 4 をセットします。
Rigidbody の Drag に 8 をセットするために
Parachute Effectiveness に 8 をセットします。
そして prop_parachuteCrate_chute オブジェクト を
Parachute 変数の上にドラッグしています。
Animation コンポーネントがアタッチされているオブジェクト
であり、開いたり閉じたりするアンメーションを
再生するためです。
それでは再生をもう一回だけみてみましょう。
シーンビューまたはゲームビューで
Raycast が描画されないことは
覚えておくべき
です。一方で
Debug.DrawRay 関数を使用すれば
Ray のプレビューをすることが出来ます。
Debug.DrawRay を追加することで
Vector3.down の向きに
箱の位置からの
視覚的な Ray を描画して、
長さとしては length に deploymentHeight を掛け算することが出来ます。
こうすることで、
下の if 文で実際に行なう Raycast と一致します。
再生を行なうことで、
Unity 上のシーンビューにて Ray が
描画されるところを確認することができます。
(翻訳:gamesonytablet)