-
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)