Проверка с отработкой условия в цикле
|
|
KoT-PnD | Дата: Воскресенье, 10 Апреля 2016, 01:16 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Есть 5 обектов, на них поочередно, после выполнения условия, вешается BoxCollider2D. Условием является уничтожение BoxCollider2D на объекте нажатием мыши, То есть вешаем на первый, после уничтожения вешаем на второй и тд. Вот код скрипта на C#
Код using UnityEngine; using System.Collections;
public class Scripts : MonoBehaviour { public GameObject ofp; private BoxCollider2D boxCol; public GameObject[] player;
void Awake() { player = GameObject.FindGameObjectsWithTag("Player"); for (int i = 0; i < 5; i++) { Debug.Log("Player Number " + i + " is named " + player[i].name); } }
void Update() {
for (int i = 0; i < 5;) { ofp = player[i];
if (ofp.GetComponent<BoxCollider2D>()) {
if (Input.GetMouseButton(0)) { i = i + 1; boxCol = player[i].AddComponent<BoxCollider2D>(); boxCol.size = new Vector2(7, 7);
}
}
} } }
Добавлено (10 апреля 2016, 01:16) --------------------------------------------- скрипт нажатия мыши using UnityEngine; using System.Collections;
public class MouseClick : MonoBehaviour { Animator anim;
void Start() { anim = GetComponent<Animator>(); }
void OnMouseDown() { anim.Play("LionCompled"); Destroy(GetComponent<BoxCollider2D>()); // Dead! /// Destroy(gameObject); } }
|
|
| |
Lertmind | Дата: Воскресенье, 10 Апреля 2016, 02:55 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Попробуй так (код не проверял):Код using UnityEngine; using System.Collections;
public class Scripts : MonoBehaviour { public GameObject ofp; private BoxCollider2D boxCol; public GameObject[] player; private int boxIndex = 0;
void Awake() { player = GameObject.FindGameObjectsWithTag("Player"); for (int i = 0; i < 5; i++) { Debug.Log("Player Number " + i + " is named " + player[i].name); } }
void Update() { if (Input.GetMouseButtonDown(0)) { boxIndex++; if (boxIndex < player.Length) { boxCol = player[boxIndex].AddComponent<BoxCollider2D>(); boxCol.size = new Vector2(7, 7); } } } } Хотя я бы код добавления коллайдера вынес в метод, который бы вызывал через скрипт MouseClick, а ещё лучше через делегаты/события.
Сообщение отредактировал Lertmind - Воскресенье, 10 Апреля 2016, 02:56 |
|
| |
KoT-PnD | Дата: Воскресенье, 10 Апреля 2016, 14:33 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Unity зависает
|
|
| |
Lertmind | Дата: Воскресенье, 10 Апреля 2016, 15:54 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Сейчас проверил, всё работает как должно. Только стоит учитывать: порядок объектов, которые у тебя в "player", может отличаться от желаемого; Input.GetMouseButtonDown срабатывает при любом нажатии на экран, поэтому на следующий объект BoxCollider2D вешается даже если не была клика на предыдущем BoxCollider2D.
|
|
| |
KoT-PnD | Дата: Воскресенье, 10 Апреля 2016, 17:13 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Как этого можно избежать? "Input.GetMouseButtonDown срабатывает при любом нажатии на экран, поэтому на следующий объект BoxCollider2D вешается даже если не была клика на предыдущем BoxCollider2D." Чтобы если мышь нажали, а предыдущий BoxCollider2D не уничтожен, ничего не происходило?Добавлено (10 апреля 2016, 17:13) --------------------------------------------- Пробовал сначала просто запускать в Udate цикл с проверкой, но достаточно вразумительного условия так и не смог написать
|
|
| |
Lertmind | Дата: Воскресенье, 10 Апреля 2016, 17:53 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Я писал "Хотя я бы код добавления коллайдера вынес в метод, который бы вызывал через скрипт MouseClick". Вот как стоит делать:
Код // ClickManager.cs вместо неуместного названия Scripts.cs using UnityEngine; using System.Collections;
public class ClickManager : MonoBehaviour { public GameObject[] players; // Нужно присвоить объекты через Inspector или другой код private int boxIndex = 0;
void Awake() { AddNextCollider(); }
public void AddNextCollider() { if (boxIndex < players.Length) { var boxCol = players[boxIndex].AddComponent<BoxCollider2D>(); boxCol.size = new Vector2(7, 7); boxIndex++; } } }
Код // MouseClick.cs using UnityEngine; using System.Collections;
public class MouseClick : MonoBehaviour { void OnMouseDown() { Destroy(GetComponent<BoxCollider2D>()); var cm = Object.FindObjectOfType<ClickManager>(); // Работает если ClickManager один cm.AddNextCollider();
Debug.Log(name + " has been clicked"); } } Добавлено (10 апреля 2016, 17:53) --------------------------------------------- Animator добавишь сам. ClickManager можно сделать синглтоном (Singleton).
|
|
| |
KoT-PnD | Дата: Понедельник, 11 Апреля 2016, 20:46 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| Нажатие мыши не срабатывает, по шаманю, может оживет. Добавлено (11 апреля 2016, 20:46) --------------------------------------------- Все работает! Спасибо тебе чувак!!! Держи +
|
|
| |