【问题标题】:How can I increase the y of the spawned object (Instantiate)?如何增加生成对象的 y(实例化)?
【发布时间】:2020-08-11 07:52:33
【问题描述】:

如何使 prefab2 在高于 prefab1 的 y 处实例化。它们是从同一位置随机生成的。代码:

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (Time.time > nextSpawn)
    {

        what = Random.Range(1, 3);
        Debug.Log(what);
        switch (what)
        {
            case 1:
                Instantiate(prefab1, transform.position, Quaternion.identity);
                break;
            case 2:
                Instantiate(prefab2, transform.position.y, Quaternion.identity);
                break;

        }
        nextSpawn = Time.time + SpawnRate;
    }
}

}

抱歉,我知道解决方案可能很简单,但我就是找不到。

【问题讨论】:

标签: c# visual-studio unity3d


【解决方案1】:

您的 Instatiate 方法调用有问题。在您使用它的方式中,第二个参数必须是Vector3 类型,而transform.position.yfloat 类型。这是一些我相信你会发现有用的示例代码。

float spawnRate = 5f;
float spawnTime;

//how high you would like your new object to spawn above transform.position
float yValueDifference = 5f;

void Update () 
{

    if (Time.time - spawnTime > spawnRate) 
    {
        //pick a random number from 0-1
        int type = Random.Range(0, 2);

        Vector3 position = new Vector3(transform.position.x, transform.position.y, transform.position.z);
        if (type == 1)
            position.y += yValueDifference;

        //if type is 0, use prefab1, if type is 1, use prefab2
        GameObject prefab = type == 0 ? prefab1 : prefab2;
        Instantiate(prefab, position, Quaternion.identity);

        //reset the timer
        spawnTime = Time.time;
    }

}

【讨论】:

    【解决方案2】:

    最简单的方法可能是创建一个浮点数(例如public float prefab2YOffset = 1f;),然后当你实例化 prefab2 时,你可以执行Instantiate(prefab2, transform.position + Vector3.up * prefab2YOffset, Quaternion.identity); 之类的操作。 Vector3.up 是编写 Vector3(0, 1, 0) 的简写,我们将该向量乘以您在 y 轴上的所需偏移量 (prefab2YOffset),并将其添加到您将实例化 prefab2 的原始位置。
    我还建议阅读documentation,了解 Vector3 的工作原理。

    【讨论】:

    • 我以前用过这个,但是没用。我只需要将 x 定义为 transform.position.x 不能只使用 Vector3.up。无论如何,感谢您为回答我的问题所做的努力:)
    【解决方案3】:
        if (Time.time > nextSpawn)
        {
    
            what = Random.Range(1, 3);
            Debug.Log(what);
            switch (what)
            {
                case 1:
                    Instantiate(prefab1, transform.position, Quaternion.identity);
                    break;
                case 2:
                    Vector3 tp = new Vector3(transform.position.x, -2, 0);
                    Instantiate(prefab2, tp, Quaternion.identity);
                    break;
    
            }
            nextSpawn = Time.time + SpawnRate;
        }
    }
    

    【讨论】:

    • 有解决办法,谢谢大家的帮助。我只是不耐烦了!
    猜你喜欢
    • 2020-09-06
    • 2016-11-23
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多