Unity Ссылка на экземплярный (клонированный) объект на кнопке через скрипт - PullRequest
0 голосов
/ 31 мая 2019

Моя проблема: я не могу заставить его работать, так как у каждого здания есть своя SpawnPoint.

Я работаю над механизмом сборки, похожим на RTS.Я установил, что после нажатия клавиши я могу размещать здания на сцене.Здания создаются из префаба, и после того, как они создаются, к ним прикрепляется скрипт под названием «BuildingScript».Теперь я хочу реализовать, чтобы я получал отдельную точку появления для каждого здания (сейчас только рядом с ним).Я настроил пользовательский интерфейс с помощью кнопки, которая нажатием порождает юнит в здании.

У меня был «BuildingScript», прикрепленный к префабу, но когда я установил точку появления для одного здания, он установилэто для каждого здания в сцене.Таким образом, отряд появлялся всегда в одном и том же здании.Я хочу настроить это, чтобы у каждого Здания была своя точка появления.Вот почему я хочу дать каждому Building скрипт «BuildingScript» при его установке, потому что я надеюсь, что таким образом каждый скрипт обрабатывается индивидуально.Это правильно?Или он все равно будет устанавливать одну и ту же точку для каждого здания, потому что сценарий все тот же?

Также я хочу сослаться на текущее размещенное здание на кнопку, поэтому при ее нажатии будет выполняться только кодпоследнее размещенное здание (на данный момент).Я думаю, что я не могу сделать это с помощью «On Click ()» кнопки, потому что мой клон еще не инсталлирован, поэтому я должен как-то ссылаться на клон на кнопку через скрипт, чтобы кнопка работала с клоном. Так что моя проблемаявляется то, что мне нужно установить ссылку из моего клонированного здания на кнопку, после того, как я поместил клон.Я много гуглил о том, как это сделать, но не нашел никаких ответов на мою проблему, кроме этого https://forum.unity.com/threads/controlling-instantiated-game-objects-from-ui-buttons.332005/.

Но я не могу заставить его работать, и я думаю, что он не будет работать, потому что мой клон является объектом ине GameObject, поэтому я никогда не мог установить ссылку на него для вызова функции SpawnUnit (), потому что GetComponent работает только для GameObject.

Теперь я действительно нахожусь в точке, где я просто не знаю, как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();
        }
    }
}

1 Ответ

0 голосов
/ 02 июня 2019

Так что я решил это сам с небольшим обходным путем. Вместо того, чтобы пытаться ссылаться на клона, я написал скрипт на кнопке Spawn, который ищет все объекты с помощью «BildingScript», затем, если они выбраны (что может быть только одним зданием), он порождает юнит в своей точке появления. Само здание сохраняет свою точку появления при размещении (например, когда Input.GetMouseButtonUp (0))

у меня очень хорошо работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...