2017-02-11 4 views
0

Я сделал простой текстовый ящик , который должен показать сообщение пользователю. Это сборник и делает несколько вещей, в основном анимации при создании экземпляра. Для запуска кода при создании экземпляра я использовал функцию Start(). Это сработало, когда я уже знал, что делать с сообщением, но мне нужно что-то вроде constructor, которое работает до Start(), но по instantiation и может принимать параметры. Теперь я полностью понимаю, что я мог бы создать экземпляр, установить сообщение и запустить все - так используя 3 строки кода, где я его создаю, но мне интересно, есть ли другое правильное решение? Все, что я нашел в сети, это тот экземпляр, а потом что-то сделать.Unity - параметры прохождения при создании экземпляра

EDIT:

Моя призвание MessageBox, чтобы показать:

var timeBox = 
    Instantiate(messageBox, penaltySpawnLoc.position, penaltyPrefab.transform.rotation, transform); 
    var scr = timeBox.GetComponent<MessageBox>(); 
    scr.OnCreated(message); 

OnCreated делает инициализацию, показать анимацию, так что в основном все. Но это нуждается в a string ввод, чтобы знать, что нужно показать, и я не хочу устанавливать текстовое значение «на лету» - это создаст видимое странное мерцание, когда будет видно сообщение, но текст не задавать.

EDIT2:

последний параметр transform в Instantiation является Canvas этот скрипт на так как это скрипт UI. Этот параметр означает, что только что созданный экземпляр GameObject является его потомком.

EDIT3:

timeBox просто экземпляр messageBox, они GameObject s. One message box используется только один раз. Его назначение - появиться с сообщением и после того, как через 0,5 секунды исчезнет и уйдет. После ухода он разрушает себя.

+0

Было бы разумно показать три строки кода, которые вы хотите упростить. – Programmer

+0

Достаточно справедливо, редактирование сразу. – agiro

+0

К сожалению, это 4 линии, я сломал линию. – agiro

ответ

2

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

В этом случае метод расширения более подходит.

Мы сделаем объект расширения с Object вместо GameObject. Поскольку GameObject наследуется от Object, этот метод расширения должен работать как для Object, GameObject, так и для Transform.

Создайте класс под названием ExtensionMethod, затем вставьте все ниже внутри него.

using UnityEngine; 

public static class ExtensionMethod 
{ 
    public static Object Instantiate(this Object thisObj, Object original, Vector3 position, Quaternion rotation, Transform parent, string message) 
    { 
     GameObject timeBox = Object.Instantiate(original, position, rotation, parent) as GameObject; 
     MessageBox scr = timeBox.GetComponent<MessageBox>(); 
     scr.OnCreated(message); 
     return timeBox; 
    } 
} 

Использование:

только одна строка вызова в функции Start должен обрабатывать все другие задачи.

public class Test: MonoBehaviour 
{ 
    GameObject messageBox = null; 
    Transform penaltySpawnLoc = null; 
    GameObject penaltyPrefab = null; 

    void Start() 
    { 
     gameObject.Instantiate(messageBox, penaltySpawnLoc.position, penaltyPrefab.transform.rotation, transform, "Hello"); 
    } 
} 
+0

Так что в основном оберните его вокруг. Хороший способ, хотя я мог бы сделать некоторые ошибки, скопировав 3 строки (и я действительно ненавижу скопирующую пасту). Благодаря! – agiro

+0

Да. Вам не нужно копировать его, и теперь он является частью класса GameObject/Transform. Из любого скрипта в вашем проекте вы можете выполнить 'gameObject.Instantiate (messageBox, штрафSpawnLoc.position, punPrefab.transform.rotation, transform," Hello ");' или 'transform.Instantiate (messageBox, punSlwnLoc.position, punPrefab.transform .rotation, transform, "Hello"); '** вместо выполнения ** вашего' YourOtherClass.Instantiate' ... – Programmer

1

Я хотел бы использовать завод для окон сообщений, так что-то вроде

var timebox = MessageBoxFactory.Create(message); 
timebox.Show(); 

и в классе фабрики делают ваши настройки и вернуться в окне сообщения

public static MessageBox Create(string message) { 
    var newTimeBox = Instantiate(messageBox, penaltySpawnLoc.position, penaltyPrefab.transform.rotation, transform); 
    var scr = newTimeBox.GetComponent<MessageBox>(); 
    scr.SetMessage(message); 
    return scr; 

где Show() является новый OnCreated(). Я нахожу, что этот шаблон помогает с уменьшением кода вызова, и если мне нужны настройки для того, как созданная вещь создается, все это находится в одном месте с общим заводским кодом.

Смежные вопросы