mercredi 22 juin 2016

Unity, C# - randomize gap between spawned prefabs but don't allow them to touch?

Alright, in my game I have a Runner object that moves at a velocity towards the left towards platforms. I have succeeded in spawning a random platform prefab at a pt a semi-random distance away from the last platform.

I do this by spawning the platform a random distance spacing, which the distance the object has moved since last platform was spawned.

public GameObject[] spawnableObjects;
    private GameObject prefab;

    private float spacing; // spawns every 2 units/metres

    public float minY, maxY, minGap, maxGap;
    private float oldX = 0; // previous camera position
    private float newX = 0; // current camera position

    private float distanceTravelled = 0;
    private Vector3 spawnPos;
    public Transform player; // getting camera reference
    public Transform spawnPt;

    private float currentY, lastY, currentX, lastX;

    void Start()
    {
        //set beginning y pos
        GameEventManager.GameStart += GameStart;
        GameEventManager.GameOver += GameOver;
        spacing = 20; //random between length of last prefab and max gap?

        lastY = 0;
        lastX = spawnPt.localPosition.x; //first spawn x pos
    }
    void Update () {
        //Debug.Log (distanceTravelled);
        newX = player.transform.localPosition.x;
        distanceTravelled += newX - oldX; // if you are goint to the right
        // if you're going to the left, do this instead:
        // distanceTravelled += oldX - newX;
        oldX = newX; // this is very important

        if (distanceTravelled >= spacing) {
            distanceTravelled = 0;
            spawnNewObject ();
        }
    }

    void spawnNewObject () {
        // code to spawn. Use the newX + some X offset while declaring your new object's position.
        int rand = Random.Range (0, spawnableObjects.Length);
        prefab = spawnableObjects[rand];

        currentY = lastY + Random.Range(minY, maxY);
        currentX = lastX + (prefab.transform.localScale.x + 5f); //randomize 5, 5 is gap

        spawnPos = new Vector3((spawnPt.localPosition.x), currentY,0f);
        //Debug.Log ("new x:"+currentX);

        Instantiate (prefab, spawnPos, Quaternion.identity);

        lastY = currentY;
        lastX = currentX;
        spacing = Random.Range (prefab.transform.localScale.x+3, prefab.transform.localScale.x+5);
        Debug.Log("spawn now!! spacing="+spacing);
    }

The spawnpt game object moves at the same acceleration/speed as Runner, so it appears as if platforms are moving towards the Runner.

For some reason, the Random.Range (prefab.transform.localScale.x+3, prefab.transform.localScale.x+5); which is the length of the prefab currently being spawned+3 or +4 makes it so the platforms virtually never touch.

My thinking in doing length was if the new platform is being spawned from the empty spawnPt.localPosition.x, if the spacing was atleast the length of the current prefab, they wouldn't touch.

Obviously something is flawed in my logic as if I just do prefab.transform.localScale.x platforms touch. I need a new approach for this.

How can I have my randomly selected prefab spawn with a randomized GAP between itself and the last prefab that was spawned? I have tried everything including Physics spheres (don't want to go that route) but can't create a gap that I can alter.

Is there a way to do this?




Aucun commentaire:

Enregistrer un commentaire