回答編集履歴

1 修正

IShix

IShix score 1513

2017/12/24 00:53  投稿

###ローカルポジションへの代入
```C#
GameObject prefab = (GameObject)Instantiate(hogehoge);
prefab.transform.SetParent(canvas.transform, false);
//ここに算出した値を代入するといいと思います。
prefab.transform.localPosition = ??;
```
###座標変換
```C#
//ローカル→ワールドlocalPos(Vector3)がローカル座標
Vector3 worldPos = transform.TransformPoint (localPos);
//ワールド→ローカル座標の変換 worldPos(Vector3)がワールド座標
Vector3 localPos = transform.InverseTransformPoint (worldPos);
```
###Terrainのワールド座標を取得
```C#
var terrainLocalPos = worldPos - terrain.transform.position;
var normalizedPos = Vector2(Mathf.InverseLerp(0.0, terrain.terrainData.size.x, terrainLocalPos.x),
                               Mathf.InverseLerp(0.0, terrain.terrainData.size.z, terrainLocalPos.z));
var terrainNormal = terrain.terrainData.GetInterpolatedNormal(normalizedPos.x, normalizedPos.y);
```
[参照元](https://answers.unity.com/questions/27172/get-terrain-position-from-world-position.html)
###ランダムなポジションを取得
こんな感じだとわかりやすいと思います。
こんな感じだとわかりやすいと思います。すみません。これ2Dようなので3D用に書き換えてください。
```C#
//ここに範囲内の左上を代入
Vector2 Left_top;
//ここに範囲内の右下を代入
Vector2 Right_bottom;
//範囲内でランダムな位置を取得
Vector2 GetRandPos()
{
 var x = UnityEngine.Random.Range(
   Left_top.x,
   Right_bottom.x
 );
 var y = UnityEngine.Random.Range(
   Left_top.y,
   Right_bottom.y
 );
 return new Vector2(x, y);
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る