Unity - передача скрипта по ссылке из редактора, создание его экземпляра на объекте во время выполнения - PullRequest
0 голосов
/ 06 июня 2018

Итак, в основном я хочу закончить несколькими игровыми объектами, каждый из которых имеет несколько скриптов .cs с монобихевиоризмом.(различный набор скриптов для каждого объекта)

группа персонажей со своими навыками

Эти скрипты для каждого персонажа могут изменяться со временем

персонажи, изучающие новые навыки / отказывающиеся от старых

Поэтому, когда игра начинается, я хочу динамически прикреплять сценарии к объектам во время выполнения

на основе решения игрока в древе навыков

Есть ли способ, как я могу сделать это без использования отражения?

РЕДАКТИРОВАТЬ: Кажется, я нашел решение, как заставить его работать без отражения

public class TestSkill : MonoBehaviour {}

public class TestFireball : TestSkill {}
public class TestMeleeAttack : TestSkill {}

public class TestSkillBook : MonoBehaviour {

    public MonoScript script;

    void Start () {

        System.Type t = script.GetClass();

        TestSkill skill = gameObject.AddComponent(t) as TestSkill;

    }

}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Поскольку это не вписывается в комментарии программистов, приведу пример и поясню, что вы можете / должны делать:

// The component to add
public class B : MonoBehaviour
{
    public void TestCall()
    {
        Debug.Log("Success");
    }
}




public class A : MonoBehaviour
{
    public string ToAddName = "B";

    private void Start()
    {
        System.Type t = System.Type.GetType(ToAddName);
        AddComponent(t);    // This does successfully add the component (assuming it exists)

        Debug.Log(t.GetType());    // This will give out "System.MonoType"

        // This doesn't work since it is not known that this is actually "B", not "MonoScript"
        GetComponent(t).TestCall();

        // What is possible is this, requires hardcoding the method name though:
        System.Reflection.MethodInfo mI = t.GetMethod("TestCall");
        var c = GetComponent(t);
        mI.Invoke(c, null);    // null because "TestCall" doesn't take params
    }
}

Это не значит, что это реальное решение, яЯ бы скорее сказал, что, вероятно, есть (лучший) способ настроить всю конструкцию так, чтобы у вас вообще не было этой проблемы.

0 голосов
/ 06 июня 2018

Я хочу динамически прикреплять сценарии к объектам во время выполнения.

Функция he AddComponent используется для присоединения сценариев к объектам GameObjects.

Ваш объект

public GameObject yourgameObject;

Присоединение сценария к нему:

yourgameObject.AddComponent<YourScript>();

РЕДАКТИРОВАТЬ:

Проблема в том, что я не знаю, будет ли это MyScript1 или MyScript2.Я не хочу, чтобы он был жестко закодирован, но изменяемый через редактор / игровой интерфейс.

Я думаю, что вы ищете AddComponent, который может принимать string в качестве параметра.Раньше был такой, как this :

public Component AddComponent(string className);

, но он устарел много лет назад.Я сделал новый метод под названием AddComponentExt в качестве метода расширения в прошлом году, и вы можете получить его здесь .Его можно использовать так:

yourgameObject.AddComponentExt<"YourScript">();

Вы можете добавить скрипт, даже если он еще не существует.В этом случае вы получите ошибку времени выполнения вместо ошибки времени компиляции.

Есть ли способ как это сделать без использования отражения?

Нет , вы не можете сделать это без размышления, поскольку его еще нетВот для чего используется отражение.

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