Игра Click 2D

Судя по названию, автор - ленивая задница. Разве нельзя было придумать, что-то боле оригинальное? Ну да не суть, в общем. Смысл все-же понятен, в этой игре придется мучать мышку. Значит, дело обстоит так. На экране появляется некая фигура, игроку надо успеть кликнуть по ней, до тех пор, пока не истекло отведенное время. Если успел, фигура удаляется и появляется новая. За удачное попадание, засчитывается плюс один, но если время истекло, то минус один и снова обновление до новой фигуры. Кстати каждая новая форма будет покрашена в случайный цвет. Вот, как бы так…


Небольшая подготовительная работа. Нарисуем несколько фигур, допустим, треугольник и квадрат. Еще потребуются пара звуковых эффектов, один будет звучать когда попадаешь по фигурке, а другой если время истекает, типа ошибка. Создаем новый 2D проект и сразу папки: Sprites, Sound, Scripts, Scenes, Prefab, Animation. Распихиваем наши картинки и звуки по местам.

Сделаем три текстовых элемента GameObject -> UI -> Text. Они нужны для вывода количества очков, лимита времени и счетчика перед стартом. Распределите их по позициям на свое усмотрение, и не забудьте переименовать (например: Score, Time, Start), чтоб не запутаться где-что.

Начнем со скрипта GameControl:

Мы будем использовать UI поэтому в самом начале подключаем:

using UnityEngine.UI;

Итак, далее:

public static bool hit;
public GameObject[] forms; // Массив фигур
public Color[] color; // Массив цветов

// Лимит по осям Х и Y позиции для фигуры
public float limitX = 7f;
public float limitY = 3f;

// Текстовые элементы UI
public Text _infoTextStart;
public Text _infoTextScore;
public Text _infoTextTime;

public float timeOut = 2.5f; // Лимит времени на клик

private float curTimeOut;
private int gameStart;
private bool isStart;
private int score;
private AudioSource sound;

void Start () 
{
	sound = GetComponent<AudioSource>();
	curTimeOut = timeOut;
	limitX = Mathf.Abs(limitX);
	limitY = Mathf.Abs(limitY);
	isStart = false;
	gameStart = 3;
	hit = false;
	_infoTextTime.text = "";
	_infoTextStart.text = "";
	_infoTextScore.text = "";
	StartCoroutine (Wait());
}

Чтобы определить лимит по осям, надо добавить фигуру на сцену, установить позицию по нулям, затем, переместить ее по оси Х влево или вправо, не важно. Тоже самое и по Y.

IEnumerator Wait ()
{
	yield return new WaitForSeconds(1);
	gameStart--;
	if(gameStart < 0) 
	{
		AddForm();
		gameStart = 0;
		isStart = true;
		_infoTextStart.text = "";
	}
	else 
	{
		StartCoroutine (Wait());
	}
}

Это счетчик от 3 до 0, и запуск игры соответственно.

void OnGUI()
{
	if(isStart)
	{
		_infoTextScore.text = "Score: " + score.ToString();
		
		if(((int)(curTimeOut * 10f)) / 10f == (int)curTimeOut)
		{
			_infoTextTime.text = (((int)(curTimeOut * 10f)) / 10f).ToString() + ".0";
		}
		else
		{
			_infoTextTime.text = (((int)(curTimeOut * 10f)) / 10f).ToString();
		}
	}
	else
	{
		_infoTextStart.text = gameStart.ToString();
	}
}

Здесь у нас просто вывод текста, время округляется до десятых.

void AddForm()
{
	if(transform.childCount == 0)
	{
		int randomForm = Random.Range(0, forms.Length);
		int randomColor = Random.Range(0, color.Length);
		Vector3 randomPos = new Vector3(Random.Range(-limitX, limitX), Random.Range(-limitY, limitY), 0);
		Vector3 randomRotZ = new Vector3(0, 0, Random.Range(0, 360f));
		GameObject clone = Instantiate(forms[randomForm], randomPos, Quaternion.Euler(randomRotZ)) as GameObject;
		clone.GetComponent<SpriteRenderer>().color = color[randomColor];
		clone.transform.parent = transform;
	}
}

Добавление фигуры на сцену, сплошной рандом: цвет, форма, позиция, поворот по Z. Обратите внимание, что созданный объект будет дочерним тому, на котором висит этот скрипт. Более того, объект создается только в том случаи, если вложенных нет. То есть, чтобы не возникло ситуации, чтоб на сцене было одновременно две формы.

void Update () 
{
	if(isStart)
	{
		curTimeOut -= Time.deltaTime;
		if(curTimeOut <= 0)
		{
			sound.Play();
			curTimeOut = timeOut;
			score--;
			for(int i = 0; i < transform.childCount; i++)
			{
				GameObject obj = transform.GetChild(i).gameObject;
				obj.transform.parent = null;
				Destroy(obj);
			}
			AddForm();
		}
		else if(hit)
		{
			hit = false;
			curTimeOut = timeOut;
			score++;
			if(timeOut > 1) timeOut -= 0.005f;
			AddForm();
		}
	}
	
	if(score >= 9999) score = 0;
}

Отслеживание «подбита» ли фигура, если да, то вытаскиваем ее из объекта и создаем другую. Если попаданий нет, работает счетчик и по достижению нуля, уничтожаем вложенный объект и опять создаем новый. Кстати, timeOut уменьшается с каждым удачным кликом, но не ниже 1 секунды.

Управление фигурой FormControl:

using UnityEngine;
using System.Collections;

public class FormControl : MonoBehaviour {

	private AudioSource sound;
	private Animator anim;
	private SpriteRenderer ren;

	void Start () 
	{
		anim = GetComponent<Animator>();
		sound = GetComponent<AudioSource>();
		ren = GetComponent<SpriteRenderer>();
		ren.sortingOrder = 2; // Поверх "подбитой" фигуры
	}

	void onmouseover()
	{
		if(Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) // левая или правая кнопка мыши
		{
			GameControl.hit = true;
			anim.enabled = true;
			gameObject.layer = 2; // Новый слой объекта Ignore Raycast
			ren.sortingOrder = 1;
			sound.Play();
			transform.parent = null; // Объект больше не дочерний
		}
	}

	void Die() // Для аниматора
	{
		Destroy(gameObject);
	}
}

Функция onmouseover вызывается когда мышка контачит с коллайдером, если игрок кликнул по фигуре, то меняется слой объекта, в котором эта функция будет игнорироваться. Иначе говоря, можно только один раз кликнуть по конкретному объекту.

Сделаем префабы спрайтов, на каждый из них надо добавить:
Скрипт FormControl
Polygon Collider 2D
Animator - убедитесь что он выключен.
Audio Source - отключите Play On Awake. И конечно же AudioClip не забудьте прицепить.

По поводу анимации, она может быть какой угодно. Например, увеличение и уход в прозрачность. Главное, в конце анимации обязательно надо указать функцию Die.


А скрипт GameControl повесьте на пустышку с любым именем, но позиция этой пустышки должна быть по нулям.

Дополнительно, Вы можете скачать уже готовую игру:
Внимание! У Вас нет прав для просмотра скрытого текста.

Комментариев 7

Онлайн
Light 17 апреля 2019
Артурыч, всё должно быть нормально.
Офлайн
Артурыч 17 апреля 2019
а она синхронизируетса с юнити 5 5
Офлайн
kombat 29 октября 2017
Цитата: Антохич
А как создать меню проигрыша если не успел нажать на фигуру за эти две сек?
Что и куда прописать?

Опоздал немного, на год laughing. Попробовал переделать код.

Удаляем строчки:
53 gameStart = 0;
107 score--; // Уменьшение счётчика очков на единицу
114 AddForm(); // Запуск функции


Вместо 114 удалённой строки вставляем:
_infoTextStart.text = score.ToString();
isStart = false;


Заменяем 78-81 строки:
else
{
_infoTextStart.text = gameStart.ToString();
}


На:

else
{
if (gameStart > 0)
{
_infoTextStart.text = gameStart.ToString();
}
}



Теперь если не успел в отведённое время выводит твой результат.
Онлайн
Light 20 октября 2016
Антохич, например другие игры, посмотреть там, как и что сделано.
Офлайн
Антохич 19 октября 2016
Light,
В каких?
можете скинуть на них ссылку?
Онлайн
Light 19 октября 2016
Антохич, смотри примеры в других проектах.
Офлайн
Антохич 18 октября 2016
А как создать меню проигрыша если не успел нажать на фигуру за эти две сек?
Что и куда прописать?
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика