// returns true if there is still space on the platform for a collidable object to spawn private void SpawnCollidable(ObjectType objectType, Vector3 position, Vector3 direction, ObjectLocation location, PlatformObject platform, int platformLocalIndex, bool activateImmediately) { int collidablePositions = platform.collidablePositions; // can't do anything if the platform doesn't accept any collidable object spawns if (collidablePositions == 0) { return; } Vector3 offset = platformSizes[platformLocalIndex] * 0.1f; float zDelta = platformSizes[platformLocalIndex].z * .8f / (1 + collidablePositions); for (int i = 0; i < collidablePositions; ++i) { if (platform.CanSpawnCollidable(i)) { spawnData.slotPositions = platform.GetSlotsAvailable(); int localIndex = infiniteObjectManager.GetNextObjectIndex(objectType, spawnData); if (localIndex != -1) { CollidableObject collidable = infiniteObjectManager.ObjectFromPool(localIndex, objectType) as CollidableObject; Quaternion lookRotation = Quaternion.LookRotation(direction); Vector3 spawnSlot = collidable.GetSpawnSlot(platform.GetTransform().right *slotDistance, spawnData.slotPositions); collidable.Orient(platform, position + (offset.z + ((i + 1) * zDelta)) * direction + spawnSlot, lookRotation); if (activateImmediately) { collidable.Activate(); } int objectIndex = infiniteObjectManager.LocalIndexToObjectIndex(localIndex, objectType); infiniteObjectHistory.ObjectSpawned(objectIndex, (offset.z + ((i + 1) * zDelta)), location, lookRotation.eulerAngles.y, objectType); platform.CollidableSpawned(i); // don't allow any more of the same collidable type if we are forcing a different collidable if (platform.forceDifferentCollidableTypes) { break; } } } } spawnData.slotPositions = 0; }