【问题标题】:Unity Referencing an Instantiated (cloned) object on a Button via ScriptUnity 通过脚本引用按钮上的实例化(克隆)对象
【发布时间】:2019-05-31 16:07:54
【问题描述】:

我的问题: 我无法让它工作,每个建筑物都有自己的 SpawnPoint。

我正在开发类似 RTS 的构建机制。我已经设置好在按下一个键后我可以在场景中放置建筑物。建筑物从预制件中实例化,在实例化后,它们会附加一个名为“BuildingScript”的脚本。现在我想实现,这样我就可以为每个建筑物获得一个单独的生成点(现在就在它旁边)。我设置了一个带有按钮的 UI,按下该按钮会在建筑物中生成一个单位。

我在预制件上附加了“BuildingScript”,但是当我为一个建筑物设置生成点时,它为场景中的每个建筑物设置了它。所以一个单位总是在同一个建筑中产生。 我想设置它,每个建筑物都有自己的生成点。这就是为什么我想在 Instatiated 时为每个 Building 提供脚本“BuildingScript”,因为我希望这样每个脚本都可以单独处理。是对的吗?还是因为脚本还是一样的,所以还是会为每栋建筑设置相同的点?

我还想将当前放置的建筑物引用到按钮,因此当单击它时,它将仅运行最后放置的建筑物的代码(目前)。我想我不能通过使用按钮的“单击()”来做到这一点,因为我的克隆还没有被实例化,所以我必须通过脚本以某种方式将克隆引用到按钮,所以按钮与克隆一起使用。所以我的问题也就是说,在我放置克隆之后,我需要设置从克隆的建筑物到按钮的引用。 我在谷歌上搜索了很多关于如何做到这一点,但除了https://forum.unity.com/threads/controlling-instantiated-game-objects-from-ui-buttons.332005/之外没有找到任何问题的答案。

但我不能让它工作,我认为它不会工作,因为我的克隆是一个对象而不是一个游戏对象,所以我永远不能设置对它的引用来调用函数 SpawnUnit(),因为 GetComponent 只适用于游戏对象。

现在我真的不知道 Unity 是如何处理这些事情的。

实例化建筑物上的BuildingScript

public class BuildingScript : MonoBehaviour
{
    public bool SavePos = false;

    public Vector3 SpawnPoint;
    public Vector3 BuildingPos;
    public GameObject Unit;    

    void Start()
    {
        FindObjectOfType<SpawnButtonReference>().GiveReference(this);
    }    

    public void SpawnUnit()
    {

//I did this because if a building gets instatiated i wanted it to save its 
Position to Spawn Units from it (doesnt really work though).
"MousePos" ist the last Position of the Mouse in the PlacementScript, before klicking to place the building.

        if (SavePos == false)
        {
            BuildingPos = GameObject.FindObjectOfType<GroundPlacementController>().GetComponent<GroundPlacementController>().MousePos;
            Debug.Log(BuildingPos);

            SavePos = true;
        }

        float PosX = BuildingPos.x + 2;
        float PosZ = BuildingPos.z + 2;
        SpawnPoint = new Vector3(PosX, 0, PosZ);
        Debug.Log("Spawn" + SpawnPoint);

        Instantiate(Unit, SpawnPoint, Quaternion.identity);
    }
}

按钮上的脚本

public class SpawnButtonReference : MonoBehaviour
{
    public GameObject objectReference = null;

    internal void GiveReference(BuildingScript Object)
    {
        objectReference = Object;
    }

    void OnButtonPress()
    {
        if (objectReference != null)
        {
            objectReference.GetComponent<BuildingScript>().SpawnUnit();
        }
    }
}

【问题讨论】:

  • 当您解决了问题后,请不要在您的问题中添加“已解决”或类似的短语。如果有人给你答案,accept it。如果您自己找到了解决方案,post an answer(您也可以在两天后接受自己的答案)。接受答案也是表明问题已解决的方式 - 将“已解决”编辑到问题中不是。
  • 好的不知道,抱歉:)

标签: c# unity3d


【解决方案1】:

所以我自己通过一些解决方法解决了这个问题。我没有尝试引用克隆,而是在生成按钮上编写了一个脚本,该脚本使用“BildingScript”搜索所有对象,然后如果它们被选中(只能是一个建筑物),它会在其生成点生成一个单位。 建筑本身在放置时会保存他的重生点(所以当 Input.GetMouseButtonUp(0))

对我来说效果很好:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2015-02-07
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多