unity3d 在Unity中示例化之前访问对象的一种可能方法

4ktjp1zp  于 2022-11-30  发布在  其他
关注(0)|答案(3)|浏览(177)

我在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次。我也直接访问了预制件,但它永远改变了它。
请帮忙

mwecs4sa

mwecs4sa1#

你不能
您将需要找到一些其他方法来确定如何存储需要访问的数据。
以下是一些例子:

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

其次,这一行:

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

在此行之后运行:

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

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

5vf7fwbs

5vf7fwbs2#

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

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

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

fnx2tebb

fnx2tebb3#

你可以有一个静态变量,作为一个计数器,并在构造函数中递增它。之后,你可以检查变量是否超过了一个期望的数量,并基于此,你可以有一个回调方法,要么删除对象,要么不删除。

相关问题