Динамическое добавление изображения во время выполнения — Unity 5

#unity3d #unityscript #unity5

#unityscript #unity3d

Вопрос:

В моей игре для Android на основе Unity я хочу добавлять изображение динамически в зависимости от количества вопросов на каждом уровне. Изображение показано для справки. Каждый правильный ответ будет отмечен зеленым, а неправильный — красным. Я новичок в Unity и изо всех сил пытаюсь найти шаги для достижения этой цели.

Любая помощь с примером для этого требования будет большим подспорьем.

введите описание изображения здесь

Ответ №1:

Однажды я написал скрипт для динамического создания кнопок на основе каждого уровня. Что я сделал, так это создал первую кнопку на сцене и добавил другие кнопки на основе первой. Ниже приведена оболочка моего кода:

 // tutorialButton and levelButtons are public variables which can be set from Inspector
RectTransform rect = tutorialButton.GetComponent<RectTransform> ();

for (int i = 1; i < levelSize; i  ) {
    // Instantiate the button dynamically
    GameObject newButton = GameObject.Instantiate (tutorialButton); 

    // Set the parent of the new button (In my case, the parent of tutorialButton)
    newButton.transform.SetParent (levelButtons.transform);

    //Set the scale to be the same as the tutorialButton
    newButton.transform.localScale = tutorialButton.transform.localScale;

    //Set the position to the right of the tutorialButton
    Vector3 position = tutorialButton.transform.localPosition;
    position.x  = rect.rect.width*i;
    newButton.transform.localPosition = position;
}
  

Я не совсем уверен, что это правильный подход, поскольку он может давать или не давать неожиданные результаты в зависимости от разных размеров экрана и вашего холста, но, надеюсь, это даст вам представление о динамическом создании объектов.

Комментарии:

1. Куда прикрепить этот скрипт . на холсте или панели?

2. Пока вы устанавливаете объекты tutorialButton и levelButton из инспектора, на самом деле не имеет значения, куда вы прикрепляете скрипт. Он не использует ни одно из свойств Gameobject, к которому прикреплен скрипт. (В моем случае у меня был скрипт, который обрабатывает всю игровую логику, и он был прикреплен к пустому Gameobject, и этот фрагмент кода был в функции Start() , поэтому при загрузке каждого уровня (сцены) он вызывался один раз и создавал кнопки, необходимые для уровня).

Ответ №2:

Я не уверен, поможет ли это, но если у вас есть все изображения в сцене под холстом, для этого вам просто нужно перетащить холст в скрипт и использовать

//level-1 is to keep the array notation
FindObjectOfType<NameOfScript>.ChangeColor(level-1,Color.green);

или вы также можете сделать

//level-1 is to keep the array notation
FindObjectOfType<NameOfScript>.RevertColor(level - 1);

Это сценарий:

 //Keep it private but you still see it in inspector
//#Encapsulation :)
[SerializeField]
private Canvas _canvas;

private Image[] _images;
//keep the original colors in case you want to change back
private Color[] _origColors;

void Start () {
    _images = GetComponentsInChildren<Image>();
    _origColors = new Color[_images.Length];
    for (int i = 0; i < _images.Length; i  )
    {
        _origColors[i] = _images[i].color;
    }

}
//Reverts the color of the image back to the original
public void RevertToOriginal(int imageIndex)
{
    _images[imageIndex].color = _origColors[imageIndex];
}
//Change to color to the coresponding index, starts from 0
public void ChangeColor(int imageIndex, Color color)
{
    _images[imageIndex].color = color;
}
  

P.S Если вы хотите, чтобы оно было видно только в конце, вы можете создать метод, в котором вы включаете = (true или false) для холста. Таким образом, вы сохраняете значение false до конца уровня и делаете его true, когда хотите показать, в то время как после каждого ответа вы вызываете changeColor в зависимости от результата.
Чтобы упростить задачу, вы можете использовать:

 NameOfScript variableName = FindObjectOfType<NameOfScript>();
  

и после этого вы просто вызываете

 variableName.ChangeColor(level - 1, Color.green);
  

Также не имеет значения, куда вы помещаете скрипт. Я бы сделал какой-то менеджер (пустой GameObject) в сцене и поместил его туда.