C# Unity 3D:如何进行地形流?

C# Unity 3D:如何进行地形流?,c#,unity3d,C#,Unity3d,我想做一个地形机制,它将根据我角色的位置工作。我只在y轴上工作。我的游戏的基本组成是,我的角色(一个球体)在敲击时沿y轴向上,当我在y轴上时,一旦我停止敲击,就不会向上施加任何力,重力就会踢进来,球体开始下落 我基本上想做的是,我已经做了十字路口类型的道路,球体将上升,在这些道路(地形)上有汽车从左右方向进入,我希望在我的玩家上升到一个特定的位置,比如(0,10)我希望地形机制从第一个和最后一个地形开始,锁定间隙,比如在球体的(0,10)位置,它下面有10个地形,上面有10个地形。从现在开始,我

我想做一个地形机制,它将根据我角色的位置工作。我只在y轴上工作。我的游戏的基本组成是,我的角色(一个球体)在敲击时沿y轴向上,当我在y轴上时,一旦我停止敲击,就不会向上施加任何力,重力就会踢进来,球体开始下落

我基本上想做的是,我已经做了十字路口类型的道路,球体将上升,在这些道路(地形)上有汽车从左右方向进入,我希望在我的玩家上升到一个特定的位置,比如(0,10)我希望地形机制从第一个和最后一个地形开始,锁定间隙,比如在球体的(0,10)位置,它下面有10个地形,上面有10个地形。从现在开始,我想让它分块上升,比如说如果玩家移动到(0,12),那么(0,1)处的地形会被破坏,新的地形会在(0,2)处生成,同样的情况也会发生在顶部。有点像min和max,比如位置是(0,15)min=(0,5)和max=(0,25)。 我所有的地形都是预制的

我不太擅长解释,所以我在下面的word文件中解释了。请查收 请回答,我将非常感激


[详细信息]

如果我正确理解您的问题,您将试图找出要生成的地形(即从地形列表中选择)。 这背后的数学其实相当简单:

public class TerrainLoader : MonoBehaviour
{
    private const float STEP_HEIGHT = 1;
    private const int NR_OF_STEPS_BELOW = 10;
    private const int NR_OF_STEPS_ABOVE = 10;

    private int currentMin;
    private int currentMax;
    
    [SerializeField] private Transform player;

    private void Awake()
    {
        if(player == null)
        {
            Debug.LogError("no player set");
            enabled = false;
            return;
        }
        Check();
    }

    private void Update()
    {
        // Can be moved to a coroutine. Checking in Update is inefficient.
        Check();
    }

    /// <summary>
    /// Checks if player reached a new step
    /// </summary>
    private void Check()
    {
        int currentStep = player.position.y / STEP_HEIGHT;
        int minStep = Mathf.Max(0, currentStep - NR_OF_STEPS_BELOW);
        int usedStepsBelow = currentStep - minStep;
        int maxStep = currentStep + NR_OF_STEPS_ABOVE + (NR_OF_STEPS_BELOW - usedStepsBelow);

        if(minStep == currentMin && maxStep == currentMax)
            return;

        LoadTerrain(minStep, maxStep);
    }

    /// <summary>
    /// Loads terrain between min and max steps.
    /// </summary>
    private void LoadTerrain(int min, int max)
    {
        for (int i = currentMin; i < min; i++)
        {
            UnloadTerrain(i);
        }

        for (int i = min; i < max; i++)
        {
            LoadTerrain(i);
        }

        for (int i = max; i < currentMax; i++)
        {
            UnloadTerrain(i);
        }

        currentMin = min;
        currentMax = max;
    }

    /// <summary>
    /// Loads a certain terrain step if it is not loaded already
    /// </summary>
    private void LoadTerrain(int index)
    {
        if(IsTerrainLoaded(index))
            return;

        // TODO: implement
    }

    /// <summary>
    /// Checks if a certain terrain step is already loaded
    /// </summary>
    private bool IsTerrainLoaded(int index)
    {
        // TODO: implement
    }

    /// <summary>
    /// Unloads a certain terrain step
    /// </summary>
    private void UnloadTerrain(int index)
    {
        // TODO: implement
    }
}

注意:如果你有很多步数,你迟早会需要一个产卵机制来将你的玩家(和他一起的整个世界)移回原点,如果他移动得很远的话。(您可以阅读本期有关浮动不精确性的内容。)

有这样的资产。对不起,您能告诉我这样做的资产的名称吗?我对unity有点陌生,谢谢这会违背我们的目的,所以我们不是来推荐工具和书籍的
terrainIndex * STEP_HEIGHT