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



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

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

我已将"BuildingScript"附加到预制件,但是当我为一个建筑物设置生成点时,它会为场景中的每个建筑物设置该生成点。所以一个单位总是在同一个建筑里生成。 我想设置它,每个建筑都有自己的生成点。这就是为什么我想在初始化时给每个建筑脚本"BuildingScript",因为我希望这样每个脚本都可以单独处理。是吗?还是会因为剧本还是一样,为每栋建筑设置相同的点?

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

但是我无法让它工作,我认为它不起作用,因为我的克隆是一个对象而不是游戏对象,所以我永远无法设置对它的引用来调用 funktion 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();
}
}
}

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

对我来说效果很好:)

最新更新