【问题标题】:How to spawn objects in Unity?如何在 Unity 中生成对象?
【发布时间】:2020-07-22 17:04:57
【问题描述】:

我正在尝试构建一个类似飞鸟的游戏,并且我正在尝试生成敌方鸟类和金币,因此我编写了 C# 代码并制作了预制件,但是当我运行鸟时,硬币并没有重生。

这是重生代码:

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

public class SpawnPlayer : MonoBehaviour
{
    public GameObject GameObjectToSpawn;
    private GameObject Clone;
    public float timeToSpawn = 4f;
    public float FirstSpawn = 10f;


    // Update is called once per frame
    void Update()
    {
        FirstSpawn -= Time.deltaTime;
        if (FirstSpawn <= 0f)
        {
            Clone = Instantiate(GameObjectToSpawn, gameObject.transform.localPosition, Quaternion.identity) as GameObject;
            FirstSpawn = timeToSpawn;

        }
    }
}

统一截图:

这是我重生第一只敌鸟的地方:

【问题讨论】:

  • 从你的代码中我看不出它为什么不应该......你在 PlayMode 中运行它对吗? ^^ 您在控制台中是否遇到任何错误?顺便说一句,您可以摆脱 as GameObject .. Instantiate 无论如何都会返回给定预制件的类型。另请注意,这将始终覆盖 Clone 字段..如果您需要它们,请使用例如List&lt;GameObject&gt; ... 是否可以在运行时销毁 GameObjectToSpawn 中引用的对象?
  • 它可能正在克隆,但是您是否将新对象的位置设置为原始对象位置,仅此而已?您希望这个新对象出现在哪里?
  • @derHugo,我在控制台中没有任何错误。在给定时间后,它也不会重生鸟类或硬币
  • 你能看到 Inspector 中的 FirstSpawn 值在减少吗?
  • @jai 来自您的新屏幕截图:它似乎是生成的,但离屏幕很远......你可以从字面上看到左下角的小微岛......它真的应该是那里?您是否尝试将其放置在实际应该生成的位置并使用transform.position 代替Instantiate

标签: c# unity3d


【解决方案1】:

从您的第二张屏幕截图来看,它似乎是生成的,但离屏幕很远!您仍然可以看到左下角的小岛。

您似乎认为您必须使用生成点的localPosition 在画布像素空间中生成它。但情况并非如此,因为Instantiate 将其放置到场景根(没有任何父级)中,并且在场景中具有绝对的世界空间位置。

您应该将生成点实际放置到生成应该发生的绝对世界位置,而不是使用

Clone = Instantiate(GameObjectToSpawn, transform.position, Quaternion.identity);

顺便说一句,不需要as GameObject,因为Instantiate 已经返回给定预制件的类型。

【讨论】:

    猜你喜欢
    • 2022-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多