【问题标题】:unity2d: randomly change position of gameobject after it has been loopedunity2d:循环后随机改变游戏对象的位置
【发布时间】:2018-02-04 09:54:53
【问题描述】:

所以,我正在制作这个小游戏,其中角色通过自动滚动相机不断向上移动。角色从一个平台跳到另一个平台,一旦平台或背景图块不再可见,我就会将其循环回来。我为我的平台分配了一个范围,随机发生器从中选择一个值,以便玩家每次开始游戏时都可以获得一组单独的平台。问题是循环:因为我在 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;
    }
}

【问题讨论】:

    标签: c# loops unity3d random


    【解决方案1】:

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

    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();
        }
    }
    

    【讨论】:

    • 但这不意味着,只有在初始化对象后才调用 start ?因此即使在循环集合之后它们仍然具有相同的 y 和 x 值?
    • 我不太明白你的意思。是的,Start() 只被调用一次。但是您可以随时设置变换位置,实际上您已经这样做以实现循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多