地形(Terrain)の指定の座標の高さを得ようと、GetInterpolatedHeight()にマップのX座標とZ座標を指定して戻り値を得てみたが、正しい値が取得できなかった。
解決策を探して、Unity Forumで以下を発見。
TerrainData.GetInterporatedHeight
GetInterpolatedHeight()に与えるパラメータは、マップのX,Z座標そのままではなく、マップ座標をマップの幅と奥行きで割って、0〜1に正規化した値を指定することが分かった。
float height = Terrain.activeTerrain.terrainData.GetInterpolatedHeight(
posx / Terrain.activeTerrain.terrainData.size.x,
posz / Terrain.activeTerrain.terrainData.size.z);
以上で、正しい高さが得られた。
番外
RaycastHitを使って、以下のようにしても求められた。0と地面の間に何もないことが前提。
GetInterpolatedHeight()を使うのが本筋で、処理的にも速いと思われるので、以下の処理はGetInterpolatedHeight()に差し替えた。
RaycastHit hit; Vector3 pos = new Vector3(posx,0.0f,posz); float height = 0.0f; if (Physics.Raycast(pos,Vector3.up,out hit)) { height = hit.distance; }