Unity通过脚本引用按钮上的实例化(克隆)对象

时间:2019-05-31 16:07:55

标签: c# unity3d

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

我正在研究类似RTS的构建机制。我将其设置为在按下键后可以将建筑物放置在场景中。这些建筑物是从预制中实例化的,实例化后,它们会附加一个名为“ BuildingScript”的脚本。现在,我想实施,以便为每个建筑物(现在就在它旁边)获得一个单独的生成点。我设置了一个带有按钮的UI,只需按下按钮即可在建筑物上生成一个单位。

我在预制板上附加了“ BuildingScript”,但是当我为一个建筑物设置生成点时,它为场景中的每个建筑物都设置了它。因此,一个单位总是在同一建筑物内生成。 我要设置它,每个建筑物都有自己的生成点。这就是为什么我希望在Instatiated时为每个Building提供脚本“ BuildingScript”,因为我希望这样,每个脚本都可以单独处理。那正确吗?还是会因为脚本仍然相同而为每座建筑物设置相同的点?

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

但是我无法使其工作,并且我认为它将不起作用,因为我的克隆是一个Object而不是GameObject,所以我永远无法设置对它的引用来调用功能SpawnUnit(),因为GetComponent仅适用于游戏对象。

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

实例化建筑物上的建筑物脚本

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();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

所以在尝试了更多之后,我有了一些工作。似乎通过在实例化后为每个克隆提供脚本可以完成任务。现在,每个克隆都有自己的Spawn Point。有了这个小脚本,点击该建筑物即可自动在其旁边生成单元。

但是我的问题仍然是,我不知道并且无法设法在按钮中引用克隆的建筑物,该按钮位于用户界面的生成单元中... 如前所述,我发现这正是我需要的https://forum.unity.com/threads/controlling-instantiated-game-objects-from-ui-buttons.332005/,但是由于克隆的gameObject的处理方式就像对象一样,因此我无法在“ SpawnButtonReference”脚本中正确引用它。

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

	public bool SavePos = false;

	public CanvasGroup BuildingSelectionUI;

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


	void Start()
    {
		BuildingSelectionUI = GameObject.Find("BuildingSelectionUI").gameObject.GetComponent<CanvasGroup>();

		Unit = FindObjectOfType<SelectableUnitComponent>().gameObject;
	}


    void Update()
    {
		UISelectionInfo();

		if (IsSelected == true )
		{
			SpawnUnit();
		}
	}


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

			SavePos = true;
		}

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

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

Spawn Button Script

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

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

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

如果我更改“ public GameObject objectReference = null;”改为“ public Object objectReference = null;”我无法编写“ objectReference.GetComponent()。SpawnUnit();”部分,因为对象不能具有GetComponent顺序...

如果不将GameObject更改为Object,它将无法正常工作,因为我的克隆对象是Object ...

请有人帮我卡住......:(

答案 1 :(得分:0)

因此,我自己做了一些解决方法。我没有尝试引用克隆,而是在Spawn Button上编写了一个脚本,该脚本使用“ BildingScript”搜索所有对象,如果它们被选中(只能是一个建筑物),它将在Spawn的位置生成一个Unit。 建筑物本身在放置时会保存其生成点(因此当Input.GetMouseButtonUp(0)时)

对我来说很好:)