Почему мое минимальное расстояние в Unity не работает? - PullRequest
0 голосов
/ 04 ноября 2018

UNITY 2D C #

У меня есть объект "Gear", который появляется.

Я определил минимальное и максимальное расстояние, которое может быть между объектами.

Однако объекты по-прежнему появляются на других объектах, покрывая (перекрывая) их.

Как это изменить?

Мой сценарий:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GearsSpawner : MonoBehaviour
{

    public GameObject theGear;
    public Transform generationPoint;

    public float distanceBetween;
    public float distanceBetweenMin;
    public float distanceBetweenMax;

    private int gearSelector;
    public GameObject[] theGears;

    private float minWidth;
    public Transform maxWidthPoint;

    private float maxWidth;
    public float maxWidthChange;
    private float widthChange;

    void Start()
    {
        minWidth = transform.position.x;
        maxWidth = maxWidthPoint.position.x;
    }


    void Update()
    {
        if (transform.position.y < generationPoint.position.y)
        {
            distanceBetween = Random.Range(distanceBetweenMin, distanceBetweenMax);
            gearSelector = Random.Range(0, theGears.Length);
            widthChange = transform.position.x + Random.Range(maxWidthChange, -maxWidthChange);
            if (widthChange > maxWidth)
            {
                widthChange = maxWidth;
            }
            else if (widthChange < minWidth)
            {
                widthChange = minWidth;
            }
            transform.position = new Vector3(widthChange, transform.position.y + distanceBetween, transform.position.z);
            Instantiate(theGears[gearSelector], transform.position, transform.rotation);
        }
    }
}

enter image description here

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

решаемые

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GearsSpawner : MonoBehaviour {


public GameObject theGear;
public Transform generationPoint;
public float distanceBetween;

public float distanceBetweenMin;
public float distanceBetweenMax;

private int gearSelector;

public GameObject[] theGears;

private float minWidth;
public Transform maxWidthPoint;
private float maxWidth;
public float maxWidthChange;

private float widthChange;

void Start (){

    minWidth = transform.position.x;
    maxWidth = maxWidthPoint.position.x;
}



public void Update (){

    if (transform.position.y < generationPoint.position.y)
    {
        distanceBetween = Random.Range (distanceBetweenMin, distanceBetweenMax) + 0.5f;

        gearSelector = Random.Range (0, theGears.Length);

        widthChange = transform.position.x + Random.Range (maxWidthChange, -maxWidthChange);

        if (widthChange > maxWidth) {
            widthChange = maxWidth;
        } else if (widthChange < minWidth)
        {
            widthChange = minWidth;
        }

        transform.position = new Vector3 (widthChange , transform.position.y + distanceBetween, transform.position.z);

        Instantiate (theGears[gearSelector], transform.position, transform.rotation);
    }

} }

0 голосов
/ 04 ноября 2018

Ну, я не уверен, полностью ли я понимаю, что должен делать ваш код. Однако есть несколько пятен, которые выглядят подозрительно, и я изменил их в соответствии с моим пониманием его предназначения (отмечено FIX):

void Update()
{
    if (transform.position.y < generationPoint.position.y)
    {
        distanceBetween = Random.Range(distanceBetweenMin, distanceBetweenMax);
        gearSelector = Random.Range(0, theGears.Length);
        widthChange = transform.position.x + Random.Range(-maxWidthChange, maxWidthChange); // FIX: the first argument of Random.Range must be the lower limit, the second one that upper limit
        if (widthChange > maxWidth)
        {
            widthChange = maxWidth;
        }
        else if (widthChange < minWidth)
        {
            widthChange = minWidth;
        }
        Vector3 newPosition = new Vector3(widthChange, transform.position.y + distanceBetween, transform.position.z); // FIX: instead of overwriting the spawner's position, store the newPosition in a local and use that
        Instantiate(theGears[gearSelector], newPosition, transform.rotation);
    }
}
0 голосов
/ 04 ноября 2018

Надеюсь, я правильно понял ваш код: вы пытаетесь создать цепочку передач снизу вверх, перемещая случайную величину вверх, а затем случайную величину влево / вправо. Если это правильно, то, возможно, вы обдумываете это.

Rect boundaries;

void Start()
{
    boundaries = new Rect(
        transform.position, //corner 1
        maxWidthPoint.position - transform.position //size: corner 2 - corner 1
    );
}

void Update()
{
    if (transform.position.y < generationPoint.position.y)
    {
        float deltaY = Random.Range(distanceBetweenMin, distanceBetweenMax);
        float deltaX = Random.Range(minWidthChange, maxWidthChange);
        transform.position += new Vector3(deltaX, deltaY, 0);

        if(transform.position.y < boundaries.yMin)
            transform.position.y = boundaries.yMin
        if(transform.position.y > boundaries.yMax)
            transform.position.y = boundaries.yMax

        if(transform.position.x < boundaries.xMin)
            transform.position.x = boundaries.xMin
        if(transform.position.x > boundaries.xMax)
            transform.position.x = boundaries.xMax

        int index = Random.Range(0, theGears.Length);
        Instantiate(theGears[index], transform.position, transform.rotation);
    }
}
0 голосов
/ 04 ноября 2018

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

...