#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) в сцене и поместил его туда.