Как создать объект в функции из другого скрипта c# - PullRequest
0 голосов
/ 19 марта 2020

[Unity 2019.3.5f1]

Я пытаюсь создать экземпляр объекта в вызываемой функции из другого скрипта.

Это работает, когда я создаю экземпляр непосредственно в том же скрипте (я пытался в update() с использованием Input.GetKeyDown(KeyCode.Insert))

Это странно, потому что у меня нет проблем / ошибок на консоли Unity, но я не получаю сообщений Debug.Log или print.

Я получил каждые Debug.Log до тех пор, пока не будет вызвана следующая строка:

 var monsterInstance = Instantiate(monster, new Vector3(v.x, 0.3f, v.y), Quaternion.identity);

Вот мой код. (Я удалил ненужные строки)

public class Spawner: MonoBehaviour 
{
    public Monster customMonster;
    public static Spawner instance;

    void MakeSpawner()
    {
        ...
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Insert))
        {
            this.Create("" + Random.Range(1, 100)); // Works from insert key
        }
    }

    private void Awake()
    {
        MakeSpawner();
    }

    //Create monster with proper configuration
    public bool CreateMonster(string id)
    {
        var monster = customMonster;

        if (monster == null)
        {
            Debug.Log("the customMonster is NULL!");
            return false;
        }

        Vector3 v;
        v.x = 10f;
        v.y = 10f;
        v.z = 10f;

        print(id);


        var monsterInstance = Instantiate(monster, new Vector3(v.x, 0.3f, v.y), Quaternion.identity); // failed if called from Manager, works if called from "update"
        print("after instantiate"); // never triggered.
        monsterInstance.setID(id, true);
        monsterInstance.updateID();
        return true;
    }
}

Мой другой скрипт использует следующее:

public class Manager : MonoBehaviour
{
    public static Manager instance;

    public GameObject monster;

    private Monsters[] monsters;


    void MakeManager() {
        ...
    }

    private void Awake()
    {
        MakeManager();
    }

    public bool CreateNewMonster(string id)
    {
        print("CreateNewMonsterid =" + id);

        bool result = Spawner.instance.CreateMonster(id); //using Singleton pattern to createMonster
        print("never triggered");
        if (result)
        {
            print("success spawn. Update list");
            return true;
        }
        else
        {
            print("unable to create monster");
        }
        return false;
    }
}

Спасибо за ваше время!

1 Ответ

0 голосов
/ 20 марта 2020

У вас нет функции обновления в другом скрипте для проверки ввода. Чтобы сказать это, чтобы породить монстра. Но допустим, вы хотели, чтобы класс Spawnner породил монстра в классе менеджера. вам нужна ссылка.

public class Spawner: MonoBehaviour 
{
    public Manager manager //<--- Refrence to the manager class
    public Monster customMonster;
    public static Spawner instance;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
           manager.CreateNewMonster("MonsterID");
        }
    }
...