Во-первых, вы должны изучить объединение ваших горных объектов, чтобы не тратить впустую ресурсы процессора и памяти на их создание.
Как только они будут объединены в вашем PathManager
, вам необходимо сначала узнать, как далеко камера сместилась в последнем кадре, а затем указать горам двигаться в соответствии с этим.Вам понадобится ссылка на ваш PathManager
в диспетчере камеры.
В диспетчере камеры LateUpdate
:
if (GameStateManager.GameState == GameState.Set || GameStateManager.GameState == GameState.Playing) {
Vector3 newPosition = new Vector3(this.offset.x + ActorManager.Instance.Actor.transform.position.x + 0.8f, 0, -10);
float cameraMoveAmount = newPosition.x - MainCamera.transform.position.x;
MainCamera.transform.position = newPosition;
pathManager.MoveMountains(cameraMoveAmount)
}
Затем в своем PathManager используйте этоmoveAmount, чтобы изменить положение всех гор, а также место, где будет создана следующая.После этой точки вы должны проверить, нет ли необходимости показывать новые горы, а не в PathManager LateUpdate
.Это потому, что вам нужно передвинуть горы за до , вы проверяете, чтобы добавить новые, и нет гарантии, что произойдет в первую очередь, если у вас есть их в различных вызовах LateUpdate
.
Что-то вродеthis:
// How fast the mountain layers are going to move in the direction of the camera.
// 0.0f - will not move with the camera, mountains will slide out of frame at normal speed.
// 1.0f - will move with the camera, no movement will be visible in frame.
public float nearMountainMoveSpeed = 0.5;
public float farMountainMoveSpeed = 0.9f;
. . .
public void MoveMountains(float cameraMoveAmount) {
float nearMountainParallaxMove = nearMountainMoveSpeed * cameraMoveAmount;
float farMountainParallaxMove = farMountainMoveSpeed * cameraMoveAmount;
// Move the near mountains & their next placement
MountainNearXPosition += nearMountainParallaxMove;
foreach (GameObject nearMountain in pooledNearMountains) {
nearMountain.transform.position = nearMountain.transform.position + new Vector3(nearMountainParallaxMove,0f,0f);
}
// Check for new Near Mountain
if (lastMountainNear != null && GamePlayCameraManager.Instance.MainCamera.transform.position.x > lastMountainNear.transform.position.x) {
this.GenerateNearMountain();
}
// Move the far mountains & their next placement
MountainFarXPosition += farMountainParallaxMove;
foreach (GameObject farMountain in pooledFarMountains) {
farMountain.transform.position = farMountain.transform.position + new Vector3(farMountainParallaxMove,0f,0f);
}
// Check for new Far Mountain
if (lastMountainFar != null && GamePlayCameraManager.Instance.MainCamera.transform.position.x > lastMountainFar.transform.position.x) {
this.GenerateFarMountain();
}
}
И в качестве отступления: если вы в конечном итоге измените свой код и получите один игровой объект со всеми farMountains как дети и один со всеми nearMountains как дети, тогда вы можете просто переместитьпреобразование этих родительских игровых объектов вместо прохождения каждой отдельной горы.Конечно, сумма, необходимая для ее перемещения, одинакова.