2015-07-08 4 views
0

В принципе, идея моей игры примерно такова: у вас есть ракета с земли и медленно добавьте скорость. По мере того, как он поднимается все выше и выше, я хочу, чтобы камера следила за ракетой, а затем вы можете переместить ракету, чтобы забрать специальные предметы и избежать препятствий. Итак, как мне создать карту ENDLESS в Unity, чтобы моя ракета не улетела с карты. Спасибо!Сделайте бесконечную двумерную карту в Unity

ответ

0
// Singleton. Translates existing Obstacles and creates additional Obstacles. 

// Мир перемещается по игроку.

// Когда этот объект сталкивается, куски уровня деактивируются. // Уровень заканчивается, когда все части уровня деактивированы

общественного класса LevelTranslator: MonoBehaviour { общественности статической LevelTranslator экземпляра = NULL;

// FIELDS 
public bool automaticallyStart = false; 
public bool isEndless = false; 

// Are all of the level pieces used? 
public bool levelOver 
{ 
    get 
    { 
     if (allLevelObjects.Count == 0) 
      return true; 
     else return false; 
    } 
} 

// Where all of the transforms are attached to 
public Transform levelParent = null; 

// Prefab to add to the level 
public List<Transform> endlessLevelObject_Prefabs = null; 

// Where the level starts. ENDLESS! 
public Vector3 levelObjectOrigin = new Vector3(); 

// The last created object. ENDLESS! 
public Transform lastCreatedObject = null; 

// Contains all of the transforms for the level 
public List<Transform> allLevelObjects = new List<Transform>(); 

// Game Values 
public float speed = 5; 
public float objectSpacing = 5;     // ENDLESS. How much object spacing there is between the current level piece and the going-to-spawn level piece 
public Vector3 direction = Vector3.forward; 
public bool stopMoving = false; 

// Starts the level 
public void BeginMovingLevel() 
{ 
    StartCoroutine(BeginMovingLevel_Coroutine()); 
} 

IEnumerator BeginMovingLevel_Coroutine() 
{ 
    while (!levelOver) 
    { 
     if (stopMoving) 
     { 
      yield return new WaitForSeconds(Time.deltaTime); 
      continue; 
     } 

     // Moves the Transform Parent. All Objects will be attached to the parent, so it's moving the objects... 
     levelParent.Translate(speed * direction * Time.deltaTime); 
     yield return new WaitForSeconds(Time.deltaTime); 

     if (isEndless) 
     { 
      if (Vector3.Distance(lastCreatedObject.position, levelObjectOrigin) >= objectSpacing + Time.deltaTime) 
      { 
       Transform t = Instantiate(endlessLevelObject_Prefabs[Random.Range(0, endlessLevelObject_Prefabs.Count)], levelObjectOrigin, Quaternion.identity) as Transform; 
       t.parent = levelParent; 
       lastCreatedObject = t; 
       allLevelObjects.Add(t); 

      } 
     } 
     else 
     { 
      if (Vector3.Distance(lastCreatedObject.position, levelObjectOrigin) >= objectSpacing + Time.deltaTime) 
      { 
       Transform t = allLevelObjects[0]; 
       t.position = levelObjectOrigin; 
       t.rotation = Quaternion.identity; 

       t.parent = levelParent; 
       t.gameObject.SetActive(true); 

       lastCreatedObject = t; 
       allLevelObjects.Remove(t); 
      } 
     } 
    } 
} 

void Start() 
{ 
    if (instance != null && instance != this) 
     Destroy(gameObject); 

    instance = this; 

    if (isEndless) 
    { 
     if (lastCreatedObject == null) 
     { 
      Debug.LogError("ERROR! It's endless mode, but you didn't assign the lastCreatedObject to a starting object! You fucked up! (Well, it's okay, I did...)"); 
      return; 
     } 

     allLevelObjects.Add(lastCreatedObject); 
     levelObjectOrigin = lastCreatedObject.position; 
    } 
    else 
    { 
     if (allLevelObjects.Count > 0) 
      Debug.LogWarning("WARNING! There are no Objects in the allLevelObjects list! Place some there in order to avoid this error!"); 

     lastCreatedObject = allLevelObjects[0]; 
     allLevelObjects.Remove(lastCreatedObject); 
     levelObjectOrigin = lastCreatedObject.position; 
    } 

    // Apply all of the Transforms to the parent 
    if (automaticallyStart) 
     BeginMovingLevel(); 
} 

// Whenever an Obstacle collides with this... deactivate the colliding object. 
void OnCollisionEnter(Collision c) 
{ 
    Transform obstacleT = c.transform; 
    if (allLevelObjects.Contains(obstacleT)) 
    { 
     allLevelObjects.Remove(obstacleT); 

     // "Destroys" the object 
     obstacleT.gameObject.SetActive(false); 
    } 
} 

}

Я использовал это некоторое время назад.

levelParent - это GameObject. Сделайте это пустой GO. The endlessLevelObject_Prefabs ... положить в уровни, которые вы хотите создать.

lastCreatedObject. Установите этот параметр на уровень FIRST.

0

Чтобы противостоять Гераклиту, не все должно течь.

Например, как я справлялся с этой ситуацией в прошлом, мой основной символ оставался полностью неподвижным, в фиксированной точке 0,0,0, и я породил всю сцену и переместил всю сцену вокруг моего объекта. Вместо того, чтобы заставить вашего персонажа двигаться, сделайте все остальное движением с такой скоростью. Это дает иллюзию, что вы двигаетесь, находясь на самом деле.

В зависимости от сложности того, что вам нужно, вам может потребоваться много манипуляций с другими объектами за пределами вашего корабля.

Удачи вам!

+0

Звучит как план, но если я оставлю персонажа неподвижным и двигаю сцену, довольно скоро сцена пройдет мимо камеры, а затем вы будете смотреть в пустоту. Итак, как сделать бесконечно длинную сцену? –

+0

Вы можете постоянно генерировать более «сцену». Я сделал бесконечную карту, где я сделал кучу сборных и постоянно создавал больше из них, когда одна часть сцены двигалась слишком далеко. Я также создал сценарий, который уничтожал бы «старую» сцену каждый раз, когда она двигалась слишком далеко от персонажа. Разделите свою сцену на части и создайте экземпляр каждого раза, когда вы уничтожаете/деактивируете его, и вы можете воспроизвести бесконечную сцену. – Lairinus

+0

Звучит здорово! Не могли бы вы поделиться немного кода? Я очень новичок в написании сценариев, я едва сделал свой счетчик очков –

Смежные вопросы