この手順では大きく分けて2つの処理の実装を考えてください。
まずは、
キャラと水面とがどの位離れているかを計算する方法です。
そしてもう1つは、
その計算した距離をゲーム画面に表示する方法です。
最初は、1つ目の「キャラと水面とがどの位は慣れているのかを計算する」という処理について、考えてみてください。
この制御処理を実装するために、必要な情報はなんでしょうか。つまり、
どんな情報があれば、キャラと水面との距離を測ることが出来るでしょうか。
そのためには、どんなゲームオブジェクト、あるいはスクリプトの情報を参照すれば必要な情報を確認できるでしょうか。
その部分を考えてください。
必要な情報がわかったら、その情報が
すでにスクリプトやゲームオブジェクトによって取得できるものなのか、
あるいは新しく追加しれければ取得できない情報であるのかを考えます。
キャラと水面については参照できる情報がありそうですが、どの位離れているか、という情報はどこにもなさそうです。
ではその情報を
新しく変数として用意をしなければなりません。この値を
どのスクリプトに用意すればよいのかも考えます。
今回の実装例では、新しくスクリプトを作成し、そのスクリプトをアタッチする専用のゲームオブジェクトを作成していますが
すでにあるスクリプトに追加をしていただいても問題ありません。
<ヒント>
<= クリックすると開きます。
1.距離を求めるためには、到達位置(ゴール地点)と到達位置まで動く位置(スタート地点からゴール地点へ向かう地点)の、2つのゲームオブジェクトの位置情報が必要になります。
スタート地点からゴール地点へ向かう地点はキャラのゲームオブジェクト、ゴール地点は水面のゲームオブジェクトとして考えてみてください。
2.ゲームオブジェクトには Transform コンポーネントが必ずアタッチされています。つまり、位置情報を参照することが可能です。
2つのゲームオブジェクトの参照を取得して、その Transform コンポーネントから位置情報を参照しましょう。
このとき、必要な情報はどんな位置情報かどうかも考えてください。
落下するまでの距離ですので、お互いのゲームオブジェクトの「高さ」に当たる部分の情報だけあれば計算が可能です。
3.スクリプトは変数を利用することでゲームオブジェクトの情報を取得出来ます。つまり、2つのゲームオブジェクトそれぞれのために変数が必要になります。
ですが、宣言しただけでは変数は空っぽのままです。どのような処理を用意すれば、この変数に2つのゲームオブジェクトの情報を参照して取得できるかを考えます。
Findメソッドでもよいですし、SerializeField属性を利用してもいいでしょう。
参照する情報が決まったら、それらがどの位離れているのか、という計算をどのように行うか考えます。
距離の計算は、2点の位置情報があればそれを減算すれば、その差分値が距離となりますので、
この計算式を、常時行ってくれるメソッドに記述するようにすればよいでしょう。
<ヒント>
<= クリックすると開きます。
1.距離を求める計算式は、【距離の値 = キャラのゲームオブジェクトの高さの値 - 水面のゲームオブジェクトの高さの値】 で算出できます。
イコールのある代入計算ですので、左辺の型と右辺の型は同じである必要があります。この場合、3つすべてが同じ型になります。
2.ゲームオブジェクトの Transform コンポーネントの Position の型は Vector3 型です。では、高さに当たる部分の情報の型はなんでしょうか。
それが読み解ければ、距離の値を代入するために必要な変数の型が特定できます。
3.距離の計算は常に更新が必要な情報です。幸いにも、Unityには Update メソッドという便利なメソッドがありますので上手く活用しましょう。
まずは自分で処理を考えて書いてみましょう。距離の値は、
Debug.Logメソッドを利用して Console ビューに表示させてください。
その値が実際のキャラと水面との距離になっていれば、距離の値がどんどんと小さくなって、いずれはマイナスになると思います。
<実装動画>
https://gyazo.com/362c348a57b8b892bcc0811ab98edb38