@Override
public void onBackPressed() {
try {
if (getFragmentManager().getBackStackEntryCount() > 1) {
FragmentManager.BackStackEntry first = getFragmentManager().getBackStackEntryAt(0);
getFragmentManager().popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else
safeExit();
} catch (Exception e) {
e.printStackTrace();
}
}
private void safeExit() {
new Builder(this).setIcon(R.drawable.ic_launcher).setTitle("Exit!").setMessage(
"Close Application?").setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MainActivity.this.finish();
}
}).setNegativeButton("No", null).show();
}
现在有些游戏对象不在地形区域。 我想要做的是保持克隆处于随机位置,但仅限于地形区域内。
我如何在地形区域内实例化对象?
答案 0 :(得分:2)
我注意到您正在创建Random
类的新实例。不要使用Unity的Random
API执行此操作。只需使用Random.Range
生成随机数。
至于在地形上生成随机游戏对象:
1 。找到X位置:
Min = terrain.terrainData.size.x.
Max = terrain.transform.position.x + terrain.terrainData.size.x.
最终的随机X应为:
randX = UnityEngine.Random.Range(Min, Min + Max);
2 。找到Z位置:
Min = terrain.transform.position.z;
Max = terrain.transform.position.z + terrain.terrainData.size.z;
最终的随机Z应为:
randZ = UnityEngine.Random.Range(Min, Min + Max);
3 。找到Y位置:
y轴不必是随机的。虽然,如果您愿意,可以将其设为随机值。
它必须在地形上,以便实例化对象不会在地形下。
这是Terrain.SampleHeight
到位的地方。您必须使用此功能才能完美生成不在地形下的位置。您需要#1 和#2 的结果才能使用此结果:
yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ));
如果要将偏移应用于y轴,现在可以在此时执行此操作。
yVal = yVal + yOffset;
以下是一般示例。您必须使用此示例来扩展当前代码。
public GameObject prefab;
public Terrain terrain;
public float yOffset = 0.5f;
private float terrainWidth;
private float terrainLength;
private float xTerrainPos;
private float zTerrainPos;
void Start()
{
//Get terrain size
terrainWidth = terrain.terrainData.size.x;
terrainLength = terrain.terrainData.size.z;
//Get terrain position
xTerrainPos = terrain.transform.position.x;
zTerrainPos = terrain.transform.position.z;
generateObjectOnTerrain();
}
void generateObjectOnTerrain()
{
//Generate random x,z,y position on the terrain
float randX = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth);
float randZ = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength);
float yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ));
//Apply Offset if needed
yVal = yVal + yOffset;
//Generate the Prefab on the generated position
GameObject objInstance = (GameObject)Instantiate(prefab, new Vector3(randX, yVal, randZ), Quaternion.identity);
}