Hello my name is Francisco and im barely new to unity (only 3 months) and im trying to make a 2D platformer with some twists.
First i will introduce the premises.
- The world must be circular, and the player will be wandering around it
- There is a point of gravity in the center of the planet. (there could be some other points in the future,thats why it is like this)
- the player won’t notice that the world is circular, but i made it circular so i dont have to bother with translating end and startpoints etc. Also it would be more fun.
- Procedural terrain generation with biomes.
- …
So… it was made with the unity 2d tools (sprite Renderers and box2d).
What is my problem?
i need advice , not in programming just in logic, of how to make it fast as possible (will be targeted to webplayer).
What would be better: - to create some sort of pool manager and then i would go placing blocks as far as the user can see (and little more) (how would you make this?).
- to create all instance and activating them as the user pass (and how you would make this).
- to create all instances and thats it.
I guess this second part i can search for it:
I kind of need to know how to use the perlin noise so i give it a random vector with random heights (around the circle) and will complete the sequence. Also i would like to know how to think to make caves.
The main problem i see of using a circle is that in the sides the X start counting as height and that suck balls.
this is what i made, the outer circle is a circle collider that acts as Attraction field. and the inner is a circle of grass that collide with the player. (the gravity and rotation are working good).
Here is a class that contains the gameobject and pos, and rotation (in the future will contain type of biome etc.)
using UnityEngine;
using System.Collections;
public class TileClass {
public Vector3 Position {get;set;}
public Quaternion Rotation {get;set;}
public GameObject Tile {get;set;}
public TileClass()
{
}
}
Here is my code that i use to create the terrain.
public class TerrainGenerator : MonoBehaviour {
public GameObject floorTile;
public Transform offset;
public float Radio=1;
public float precision=0.1f;
public float InstancesAmount=10;
public GameObject player;
private TerrainClass terrain;
// Use this for initialization
void Start ()
{
terrain = new TerrainClass(Mathf.FloorToInt(Mathf.PI*2/precision));
float rnd = Random.Range (0f,0.9f);
for (int i=0;i<terrain.Tiles.Length;i++)
{
Vector3 posTmp = new Vector3(Mathf.Sin(i * Mathf.PI*2/terrain.Tiles.Length) * Radio + offset.position.x,Mathf.Cos(i * Mathf.PI*2/terrain.Tiles.Length) * Radio + offset.position.y,0);
Vector3 pos = new Vector3(posTmp.x + Mathf.PerlinNoise(posTmp.x * rnd,posTmp.y * rnd),posTmp.y + Mathf.PerlinNoise(posTmp.x * rnd,posTmp.y * rnd),posTmp.z);
Quaternion rotation = Quaternion.LookRotation(offset.position - pos,Vector3.forward);
terrain.SetTile(i,pos,new Quaternion(0,0,rotation.z,rotation.w));
//terrain.Tiles[i].Period = i * Mathf.PI*2/terrain.Tiles.Length;
}
for (int i=0;i<terrain.Tiles.Length;i++)
{
terrain.SetTileGameObject(i,(GameObject) Instantiate(floorTile,terrain.Tiles[i].Position,terrain.Tiles[i].Rotation));
terrain.Tiles[i].Tile.GetComponent<DetectPlayer>().id = i;
terrain.Tiles[i].Tile.GetComponent<DetectPlayer>().player = player;
}
}
}
Just in case you want to know TerrainClass is just a middle Class that contains the TileClass Array.
The detectplayer attaches to the used prefab for tile and just has a oncollisionenter sets an static variable the I variable to know where the player is standing.
and if you want to have the gravity class also is here:
i just place it in an empty GameObject with a circle collider marked as trigger.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Gravity : MonoBehaviour {
private bool AffectOnlyY;
private List<GameObject> goList;
void Start()
{
goList = new List<GameObject>();
}
void FixedUpdate ()
{
foreach(GameObject g in goList)
{
Vector3 offset = transform.position - g.transform.position;
Vector3 force = offset / offset.sqrMagnitude * rigidbody2D.mass;
g.rigidbody2D.AddForce(force );
Quaternion rotation = Quaternion.LookRotation(transform.position - g.transform.position, g.transform.TransformDirection(Vector3.forward));
g.transform.rotation = new Quaternion(0, 0, rotation.z, rotation.w);
}
}
void OnTriggerEnter2D(Collider2D c)
{
if (c.GetComponent<Rigidbody2D>() != null) goList.Add(c.gameObject);
}
void OnTriggerExit2D(Collider2D c)
{
if (c.GetComponent<Rigidbody2D>() != null) goList.Remove(c.gameObject);
}
}
if this post is wrong forgive me please.
Thanks for reading, Francisco.