c# - unity2d : randomly change position of gameobject after it has been looped

标签 c# loops unity3d random

所以,我正在制作这个小游戏,其中角色通过自动滚动相机不断向上移动。角色从一个平台跳到另一个平台,一旦平台或背景图 block 不再可见,我就会将它循环回去。我为我的平台分配了一个范围,随机发生器从中选择一个值,这样玩家每次开始游戏时都会获得一组单独的平台。问题是循环:因为我在 start() 函数中进行了随机化,所以平台的随机位置只分配一次,然后一次又一次地循环。所以游戏在 20 秒后循环几次后变得有点无聊 :D

这是我的代码:

private float randomFloat = 0;
private int subOrAdd = 0; 

// Use this for initialization
void Start () {

    subOrAdd = Random.Range(1, 10);
    randomFloat = Random.Range(0f, 1.4f);

    // randomly add or subtract height of object 
    if (subOrAdd < 6)
    {
        this.transform.position = new Vector2(transform.position.x, transform.position.y - randomFloat);
    }
    else if (subOrAdd >= 6)
    {
        this.transform.position = new Vector2(transform.position.x, transform.position.y + randomFloat);
    }

}

基本上,我有一个硬编码范围,然后随机决定添加或减去超出范围的数字。那么我将如何做到这一点,让循环的对象总是要求一个新的位置?因为如您所知,start 只被调用一次,即使在循环之后,位置仍然保持不变。我希望我在这里说清楚了:)

任何帮助都会很棒!

这是循环平台的代码:

public class PlattformLooper : MonoBehaviour {

public float spacingBetweenLoops = 0f;

private void OnTriggerEnter2D(Collider2D collider)
{
    if (collider.gameObject.tag == "Plattform")
    {
        Debug.Log("TRIGGERED Plattform!");

        float heightOfBGObj = ((BoxCollider2D)collider).size.y;

        Vector3 pos = collider.transform.position;

        pos.y += heightOfBGObj * (5*5)+spacingBetweenLoops;

        collider.transform.position = pos;
    }
}

最佳答案

只需将您的随机化逻辑提取到一个单独的方法中即可。

void Start () {
    RandomizeHeight()
}

public void RandomizeHeight() {
    subOrAdd = Random.Range(1, 10);
    randomFloat = Random.Range(0f, 1.4f);

    // randomly add or subtract height of object 
    if (subOrAdd < 6)
    {
        this.transform.position = new Vector2(transform.position.x, transform.position.y - randomFloat);
    }
    else if (subOrAdd >= 6)
    {
        this.transform.position = new Vector2(transform.position.x, transform.position.y + randomFloat);
    }
}

然后你可以随时调用它:

public class PlattformLooper : MonoBehaviour {

public float spacingBetweenLoops = 0f;

private void OnTriggerEnter2D(Collider2D collider)
{
    if (collider.gameObject.tag == "Plattform")
    {
        Debug.Log("TRIGGERED Plattform!");

        float heightOfBGObj = ((BoxCollider2D)collider).size.y;

        Vector3 pos = collider.transform.position;

        pos.y += heightOfBGObj * (5*5)+spacingBetweenLoops;

        collider.transform.position = pos;
        collider.GetComponent<YourComponent>().RandomizeHeight();
    }
}

关于c# - unity2d : randomly change position of gameobject after it has been looped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45896801/

相关文章:

c# - EnvDTE - 使用 C# 在 Visual Studio 中从 'FindResult 1"窗口获取查找文本结果

c# - System.Collections 与 System.Collections.ObjectModel

c# - 如果 Try/Catch 中没有捕获则运行代码

image - 在 Unity 3D 中更改按钮图像

c# - 如何存储和恢复无限世界?

c# - 服务器端 SignalR 连接在长时间正常运行后失败

javascript - Javascript 循环内的事件处理程序 - 需要闭包吗?

javascript - 在循环内构建 2 级 JavaScript 数组

arrays - PostgreSQL:错误:数组下标超出范围

c# - 在非异步方法中同步等待任务完成,但任务永远是 WaitingForActivation