实例化地形区域内的对象

时间:2017-05-15 21:19:28

标签: c# unity3d unity5

    @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();
   }

现在有些游戏对象不在地形区域。 我想要做的是保持克隆处于随机位置,但仅限于地形区域内。

我如何在地形区域内实例化对象?

1 个答案:

答案 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);
}