Multiple scenes or one scene?

Hello, something has been really troubling my mind recently.

I’m currently making an RPG with a vast world, and one of the first thing that pops to mind is how to make it in Unity. Should I use one large scene for the whole world (which would severely lag, I think - the world is really big) or should I make more scenes? I recall from a time when I was modding for TES that they divided the whole world by it’s coordinates. That way, I could tend to one area, and give a much better finished product. However, I don’t think a hovering platform would suit well, so… how can I make the game start rendering the scene that the player should transfer to when on the edge? Or, should I make one large scene, but only render and calculate the objects in proximity of the player?

I hope I didn’t confuse you all, I’m quite so myself. If needed, I can further explain the question.

Thanks for reading, and any help in advance.

I think I would divide the world up in different scenes. And I would add these scenes into different areas.

So in the beginning, you load a scene from the area that the player is currently in. But only one scene, the
start scene for example, and then keep track of which scene the player is currently in.
When necessary you load the “neighbour” scene/s with Application.LoadLevelAdditive as the game goes by.

So when the player goes into a new Area (enters a house/elevator/new Enviornment which means the whole world will change to something new) then
you load this scene with the normal Application.LoadLevel function. So then you would clear out some memory and other stuff you don’t need.

And if the player would return to the old area he just was in, then you load the old scene with the Application.LoadLevel function.

And as the player progress through the new Area, or the old area, add new scenes with the LoadLevelAdditive function.

It would take some design-thinking, but I think that would be a nice and smart way to do a big RPG-game without too many loading scenes, or one
huge map that will take a long time to load.

You should use Triggers to achieve this.

Create a new GameObject to represent the trigger area. Choose the most appropriate shape. This will be the area that you have to enter in order to cause the teleport to occur.

Now select the new object you just made, and tick the “Is Trigger” option in the collider component, shown in the inspector pane. This changes the collider from a solid object to an area that you can walk into.

Un-tick the “Mesh Renderer” component, so that the GameObject becomes invisible.

You probably also want to specify a destination for the teleporter, and an easy way to do this is to create another invisible GameObject. This time however you don’t need a collider either, so it’s best to use “Create Empty” to create a completely empty GameObject. Name it “Teleport Destination”.

Now, depending on how you want the teleporter to work, you need to either add some script to the teleporter object, or to the player object.

If you want the teleporter to teleport any object which enters it, add a script something like this to the teleporter object:

var destination : Transform;

function OnTriggerEnter(other : Collider) {
other.transform.position = destination.position;
}
If you only want the player to teleport when it enters the trigger, you should make sure your player object is tagged as “Player”, then add a check for this in your teleporter script, making it look more like this:

var destination : Transform;

function OnTriggerEnter(other : Collider) {
if (other.tag == “Player”) {
other.transform.position = destination.position;
}
}
See the Colliders Manual Page for more information about triggers.

Now for the camera. If your camera is parented to your player (as it is, in the case of the first-person controller prefab), then you need do nothing. The camera will be moved along with the player automatically.

If you’re using a chase-style camera however, you’ll probably want to make the camera jump the same relative distance as the player just jumped. You could do this by measuring the distance that the player moved, and then adding that distance to the camera too - something like this:

var destination : Transform;

function OnTriggerEnter(other : Collider) {
if (other.tag == “Player”) {
var startPosition = other.transform.position;
other.transform.position = destination.position;
var moveDelta = other.transform.position - startPosition;
Camera.main.transform.position += moveDelta;
}
}

I would say split it up into multiple scenes. If its all one scene, and if the world is really big, then heaps of RAM will be used.