Суббота, 27 Апреля 2024, 05:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Проверка с отработкой условия в цикле (Проверка объекта на наличие компонента)
Проверка с отработкой условия в цикле
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 зависает cry
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 цикл с проверкой, но достаточно вразумительного условия так и не смог написать sad

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)
---------------------------------------------
Все работает! Спасибо тебе чувак!!! biggrin hands
Держи + smile

Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Проверка с отработкой условия в цикле (Проверка объекта на наличие компонента)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг