【问题标题】:A possible way to access an object before instantiating in Unity在 Unity 中实例化之前访问对象的一种可能方式
【发布时间】:2019-12-21 17:38:22
【问题描述】:

我正在 Unity 中制作一个类似大亨的游戏,游戏是关于机器人和其他东西的,你有一个机器人目录,我一直在尝试一个实例化机器人的代码,但你可以得到两个相同的机器人,这个想法是,如果我实例化了机器人#1,我就不能再实例化它了。我尝试了一个代码,但效果不佳。

 if (position == 1)
    {
        robot1 = Resources.Load ("Prefabs/Robots/" + theRobo.identifier, typeof (GameObject)) as GameObject;
        Instantiate(effect, spawnPosition1.position, Quaternion.identity);
        Instantiate(robot1, spawnPosition1.position, Quaternion.identity);
        finder1 = GameObject.Find(theRobo.recognizer);

        if (finder1.GetComponent<RobotBehaviour>().created == false)
        {
            finder1.GetComponent<RobotBehaviour>().created = true;
        }

        else
        {
            finder1.gameObject.SetActive(false);
            finder1.GetComponent<Collider2D>().enabled = false;
        }
    }

“position”变量是机器人的位置,“robot1”是机器人标识符,“finder1”在实例化时找到“Robot(Clone)”对象,主要问题是代码总是实例化偶数如果它是“创建”的,则由于游戏中的六个位置,此代码将重复 6 次。我也尝试直接访问预制件,但它永远改变了它。

请帮忙

【问题讨论】:

标签: c# unity3d instantiation gameobject


【解决方案1】:

你不能。

您需要找到其他方法来确定如何存储您需要访问的数据。

一些例子:

  • 创建您要访问的字段static(该值在任何地方都只会有一个“副本”,可以随时从任何地方访问)
  • 将数据存储在不同的位置(例如在您的代码所在的类中)
  • 保留对已生成对象的引用;首先,您不应该使用GameObject.Find()

其次,这一行:

if (finder1.GetComponent<RobotBehaviour>().created == false)

在此行之后运行:

Instantiate(robot1, spawnPosition1.position, Quaternion.identity);

意味着您在知道是否应该创建克隆之前创建了一个克隆(如果不需要,您不会销毁它)。

【讨论】:

  • 哦,是的,我知道,但考虑到我有不止一个 finder 和不止一个位置,实际代码所做的是,例如,我在位置 1 上实例化机器人 1,然后我实例化机器人 1,但在位置 2,位置 1 上的机器人“消失”,现在它在位置 2
  • 这不是实例化,而是运动。只需将现有机器人的位置设置为新值。
【解决方案2】:

您需要一个包含该类型所有机器人的列表/计数器。然后是一个简单的数字检查:

if(currentRobotsTypeX >= maxRobotsTypeX)
  //error message
else
  //spawn robot of type X

您如何管理列表/计数器取决于您。只是不要忘记在他们离开游戏时从列表中删除/递减计数器。或者如果游戏重新启动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多