2D跑步者在不同尺寸的游戏对象之间具有相同的间距

时间:2019-03-16 01:02:54

标签: c# unity3d


我的问题是在随机生成的2d流道中,不同尺寸的预制件之间保持相同的间距。
 我想每秒产生一个新的游戏对象
假设我有一个名为Square的简单精灵
我使用协程生成它,并且距离始终等于运动的1s
我添加了不同大小的正方形阵列作为预制件,当我以1个单位正方形生成它时,我希望预制件之间具有相同的距离,就像我要一个接一个地生成单个正方形一样。 基本上,我希望生成不同大小的预制件,并通过在不同预制件之间保持相同的距离来以相同的间隔生成它们。
也许解决方案是根据预制件之间的测量距离生成预制件,而不是根据时间生成
您如何解决这个问题?
我可以根据子对象数组的宽度来计算空gameObject的宽度吗?
我希望你能理解我在问什么
谢谢!

 void Start() {
    stvaranjeFunkc();
}

// Update is called once per frame
void Update() {



        if (privremeniNiz.tag == "zamka")
        {
            if (privremeniNiz.transform.position.x + privremeniNiz.transform.localScale.x / 2 < stvarac.transform.position.x - vrijednostGranice)
                stvaranjeFunkc();
        }

        if (privremeniNiz.tag == "nizPreprekaZamka")
        {

        // if ((privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.position.x + privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.localScale.x / 2)
        //> stvarac.transform.position.x - vrijednostGranice)
         if ((privremeniNiz.gameObject.GetComponent<nizKutija>().niz[0].transform.position.x + privremeniNiz.GetComponent<nizKutija>().niz[0].transform.localScale.x / 2)
        > stvarac.transform.position.x - vrijednostGranice)
        return;


       // if (privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.position.x + privremeniNiz.GetComponent<nizKutija>().niz[privremeniNiz.GetComponent<nizKutija>().randomBrKutija].transform.localScale.x / 2 < stvarac.transform.position.x - vrijednostGranice)
            stvaranjeFunkc();
        }

    //if (!cekanje)
    //    StartCoroutine(stvaranje());
    //else return;
}

void stvaranjeFunkc()
{
    int poz = Random.Range(0, prepreka.Length);
    GameObject temp =Instantiate(prepreka[poz], stvarac.transform.position, stvarac.transform.rotation);
    privremeniNiz = temp;
}

当我有简单的游戏对象(tag = zamka)时,我却能正常工作,但是当我 生成标签为nizPreprekaZamka的游戏对象,它是一个空的游戏对象,具有附加的脚本,该脚本创建了简单对象的数组。生成器只会一次生成数百个游戏对象。

2 个答案:

答案 0 :(得分:0)

您可能知道游戏水平滚动的速度。我假设您正在跟踪每个块的位置,并且可以知道它们的宽度。

诀窍是在屏幕外生成块,以便您始终有足够的内容滚动到视图中以覆盖下一帧。

屏幕外有多少内容?我假设您只是将新块追加到数组的末尾。这意味着最后一块永远是离屏幕最远的一块,这对我们有帮助。它还有助于了解屏幕的大小。在这种情况下,您可以将屏幕外的内容量计算为last block position + its length + fixed_space - screen size,其中fixed_space是每个块后所需的空间量。

检查每帧是否滚动速度>屏幕外内容。如果是这样,则需要生成一个新块。您的广告块的开始位置应该恰好是屏幕外内容的结束位置。

答案 1 :(得分:0)

GameObject的位置位于其中心,而scale是其总大小。

因此,对象的边缘位于其位置加上比例尺的一半:

float distance = transform.position.x + (transform.scale.x / 2f);

因此,对于每个新的预制件,您都希望添加两个GameObject的中心和边缘之间的距离以及应将它们分开的距离。

public GameObject[] prefabs;
public float distanceBetweenObjects;

float newPosition = prefabs[0].transform.position.x;

newPosition += (prefabs[0].transform.scale.x / 2f);
newPosition += distanceBetweenObjects;
newPosition += (prefabs[1].transform.scale.x / 2f);