C# Unity 3D:如何进行地形流?
我想做一个地形机制,它将根据我角色的位置工作。我只在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文件中解释了。请查收 请回答,我将非常感激C# Unity 3D:如何进行地形流?,c#,unity3d,C#,Unity3d,我想做一个地形机制,它将根据我角色的位置工作。我只在y轴上工作。我的游戏的基本组成是,我的角色(一个球体)在敲击时沿y轴向上,当我在y轴上时,一旦我停止敲击,就不会向上施加任何力,重力就会踢进来,球体开始下落 我基本上想做的是,我已经做了十字路口类型的道路,球体将上升,在这些道路(地形)上有汽车从左右方向进入,我希望在我的玩家上升到一个特定的位置,比如(0,10)我希望地形机制从第一个和最后一个地形开始,锁定间隙,比如在球体的(0,10)位置,它下面有10个地形,上面有10个地形。从现在开始,我
[详细信息]如果我正确理解您的问题,您将试图找出要生成的地形(即从地形列表中选择)。 这背后的数学其实相当简单:
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