Як створити гру на Андроїд з нуля, програми та конструктори для розробки мобільних додатків на вашому телефоні або планшеті безкоштовно

Приклад створення гри

В якості прикладу розглянемо гоночний симулятор в сучасній обробці. Зверніть увагу, що цей приклад створений для початківців розробників. Для розробки гри використовується Unity.

Геймплей

Геймплей побудований на тому, щоб подолати на машині максимально можливу дистанцію. Функцію «перешкод» виконують динамічні перешкоди, що з’являються на дорозі. Якщо врізатися в одну з перепон, то гра закінчиться. Для ускладнення геймплея вводимо запас палива, який витрачається при заїзді. Щоб поповнити бензобак потрібно збирати баки з бензином.

Початок розробки

«Гоночний тетріс» складається з двох простих сцен: головне меню та вікно геймплея. Першим ділом займемося меню. Для нього необхідно використовувати елемент керування GUI – стандартний інструмент платформи.

Для фону використовуємо спрайт під назвою «background». У прикладі застосовується сірий колір. При бажанні колірна палітра змінюється.

Другий крок – створення сценарію «menu.cs». Шлях команди: Правою кнопкою миші на рядку скрипта – «Create» – «C# Script». Не забудьте повісити його на «background». Вміст скрипта виглядає наступним чином:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class menu : MonoBehaviour {
public GUIStyle mystyle; //оголошується для того щоб змінювати накреслення GUI компонентів(шрифт, розмір і. т. п.)
string score; //змінна для зберігання пройденої дистанції
void Start ()
{
StreamReader scoredata = new StreamReader (Application.persistentDataPath + “/score.gd”); //створення файлової змінної
score = scoredata.ReadLine (); //читання рядка
scoredata.Close (); //закриття файлової змінної
}
void Update () {
}
void OnGUI(){
GUI.Box (new Rect (Screen.width*0.15 f, Screen.height*0.8 f, Screen.width*0.7 f, Screen.height*0.1 f), “MAX DISTANCE:”+score,mystyle); //створюємо невелике віконце для показу пройденої відстані
if (GUI.Button (new Rect (Screen.width*0.15 f, Screen.height*0.25 f, Screen.width*0.7 f, Screen.height*0.1 f), “Start game”,mystyle)) //створюємо кнопку для запуску ігрової сцени
{
Application.LoadLevel(1);//Завантаження ігрової сцени
}
if (GUI.Button (new Rect (Screen.width*0.15 f, Screen.height*0.4 f, Screen.width*0.7 f, Screen.height*0.1 f), “Exit”,mystyle)) //створюємо кнопку для виходу з гри
{
Application.Quit();//Вихід з гри
}
}
}

У кінцевому підсумку на екрані повинно отримати приблизне таке вікно:

Способи зміни IMEI на Андроїді

Не забувайте, що у програмі є функція редагування текстових елементів за допомогою MyStyle.

Ігрове вікно

Перед початком роботи необхідно визначити ключові елементи, які розташовані на цьому малюнку.

В їх число входять:

  • автомобіль;
  • бензобак;
  • дорога.

Розглянемо створення кожного елемента окремо.

Дорога

Представлена гра – нескінченна гонка, тому з технічної точки зору траса, є рухомою. Приймаючи той факт, що гравець має можливість переміщатися тільки вліво або вправо, саме дорога створить ілюзію руху.

Приступимо:

  1. Завантажуємо спрайт з трасою на сцену з гейплеем, підганяючи її за розмірами камери.

  2. Далі додаємо в якості дочірніх об’єкта всередині дороги чотири блоки з перешкодами і іконку бензобака.

  3. Не забудьте додати до них Box Collider 2D. Додатково потрібно відзначити іконку Is Triger, щоб об’єкти перетиналися з машиною.

  4. Створіть скрипт під назвою «moveroad.cs» і повісьте його на трасу. Далі прописуємо код:
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    public class moveroad : MonoBehaviour {
    public GUIStyle mystyle;//створення стилю
    int f,fuelst;
    float score=0,speed=-0.2 f,data,fuelpos;// змінні для зберігання відстані, швидкості та рекорду
    public GameObject block;// ігровий об’єкт для розміщення блоку
    public GameObject block1;
    public GameObject block2;
    public GameObject block3;
    public GameObject fuel;
    bool turbotriger=false;
    void Start ()
    {
    StreamReader scoredata = new StreamReader (Application.persistentDataPath + “/score.gd”);
    data = float.Parse(scoredata.ReadLine ());//читання з файлу інформації про рекорд
    scoredata.Close ();
    }
    void Update ()
    {
    transform.Translate (new Vector3 (0f,speed,0f));//рух дороги із заданою швидкістю вище
    score = score + (speed*-10);// підрахунок відстані
    if (transform.position.y < -19f) // якщо дорога йде за межі камери то вона “тілі портируется” вгору
    {
    transform.position=new Vector3(0f,33.4 f,0f);//нова позиція дороги
    block.transform.position=new Vector3(10.15 f,block.transform.position.y,block.transform.position.z);
    block1.transform.position=new Vector3(8.42 f,block1.transform.position.y,block1.transform.position.z);
    block2.transform.position=new Vector3(6.62 f,block2.transform.position.y,block2.transform.position.z);
    block3.transform.position=new Vector3(4.95 f,block3.transform.position.y,block3.transform.position.z);
    fuel.transform.position=new Vector3(11.86 f,fuel.transform.position.y fuel.transform.position.z);
    //приховування за межі камери всіх перешкод(блоків)
    f = Random.Range (0, 5);//випадкова поява на дорозі 1-го з 4-х блоків або каністри з бензином
    switch (f)
    {
    case 0:block.transform.position=new Vector3(2.40 f,block.transform.position.y,block.transform.position.z); break;
    case 1:block1.transform.position=new Vector3(0.90 f,block1.transform.position.y,block1.transform.position.z); break;
    case 2:block2.transform.position=new Vector3(-0.80 f,block2.transform.position.y,block2.transform.position.z); break;
    case 3:block3.transform.position=new Vector3(-2.35 f,block3.transform.position.y,block3.transform.position.z); break;
    case 4:
    fuelst=Random.Range(0,4);
    if(fuelst==0){fuelpos=2.40 f;}
    if(fuelst==1){fuelpos=0.90 f;}
    if(fuelst==2){fuelpos=-0.80 f;}
    if(fuelst==3){fuelpos=-2.35 f;}
    fuel.transform.position=new Vector3(fuelpos,fuel.transform.position.y fuel.transform.position.z);
    break;
    }
    if (score>data)// якщо поточне пройдену відстань перевищує те що записано в файлі рекорду то йде оновлення даних
    {
    StreamWriter scoredata=new StreamWriter(Application.persistentDataPath + “/score.gd”);//створюємо файлову змінну для зберігання пройденої відстані
    scoredata.WriteLine(score);//записуємо нове значення в файл
    scoredata.Close();//закриваємо файлову змінну
    }
    }
    }
    void OnGUI(){
    GUI.Box (new Rect (0, 0, Screen.width, Screen.height*0.05 f), “Distance(m):” + score,mystyle);//створюємо вікно для підрахунку відстані
    }
    }
Дивіться також:  Буфер обміну на Андроїд - де знаходиться, як знайти в телефоні або планшеті Самсунг і інших

У результаті повинна вийти рухомі дорога, яка буде автоматично продовжуватися після досягнення «контрольної точки». По суті, виходить нескінченна траса. Проте без змін розробник отримає проблему, коли після проходу «точки» залишиться порожній простір. Щоб виправити цю ситуацію потрібно створити копію готової траси і трохи відредагувати скрипт.

Іншими словами, необхідно створити дві однакові дороги. Ця дія має виправити проблему з розривами.

Автомобіль

Киньте спрайт машини на сцену.

Виберіть авто в будь-яке місце на трасі. Скрипт створіть carcontroller.cs і повести його на машину. Нижче знаходиться вміст скрипта:

using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput;
public class carconroller : MonoBehaviour
{
void Start ()
{
}
public void Update ()
{
if (transform.rotation.z !=0) //перевірка зіткнення коллайдера автомобіля і перешкоди, при зіткненні відбувається завантаження меню
{
Application.LoadLevel (0);
}
}
}
public void OnGUI()
{
if (GUI.RepeatButton (new Rect (Screen.width*0.1 f, Screen.height*0.9 f, Screen.width*0.2 f, Screen.height*0.08 f), “L”)) //створюємо кнопку для руху вліво
{
if (transform.position.x > -2.4 f)
{
transform.Translate (new Vector3 (-0.05 f, 0f, 0f));
}
}
if (GUI.RepeatButton (new Rect (Screen.width*0.7 f, Screen.height*0.9 f, Screen.width*0.2 f, Screen.height*0.08 f), “R”)) //створюємо кнопку для руху праворуч
{
if (transform.position.x < 2.4 f)
{
transform.Translate (new Vector3 (0.05 f, 0f, 0f));
}
}
}
}

За допомогою скрипта автомобіль отримає можливість переміщатися.

Бензобак

Для створення показника наповнюваності бензобака необхідно використовувати однакові спрайт різних кольорів.

Зробіть зелений спрайт дочірнім. Наступний аналогічний з попередніми пунктами: створити скрипт (fuelscript.cs) і повісити його на бензобак (fuel) з таким змістом:

using UnityEngine;
using System.Collections;
public class fuelscript : MonoBehaviour {
public GameObject fuelall;
float mytimer=100f;// завдання плаваючого числа
// Use this for initialization
void Start ()
{
}
void Update ()
{
mytimer = 100f;
mytimer -= Time.deltaTime;//зміни числа з плином часу
if (mytimer/mytimer==1f) //перевірка на період часу в 1 секунду
{
fuelall.transform.position=new Vector3(fuelall.transform.position.x-0.0011 f,fuelall.transform.position.y,fuelall.transform.position.z);
fuelall.transform.localScale = new Vector3(fuelall.transform.localScale.x-0.001 f, 1, 1);
//вище йде зрушення вліво і зменшення по ширині зеленої смуги для імітації шкали
}
if (fuelall.transform.localScale.x < 0) //якщо шкала зникла то завантаження триває завантаження головного меню
{
Application.LoadLevel(0);
}
}
}

Траса в нашому меню називається road183, а її копія – road183(1). В дочірній об’єкт fueltrack додайте скрипт, який відповідає за заповнення бензобака при його контакті з автомобілем. Наступним кроком буде створення скрипта triger.cs. Повісьте його на fueltrack в кожній трасі. І позначте об’єкт, як Is Triger з таким кодом:

using UnityEngine;
using System.Collections;
public class triger : MonoBehaviour {
public GameObject fuel;//додаємо сюди greenfuel
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter2D(Collider2D col)
{
if (col.gameObject.name == “playercar”) //перевірка перетину автомобіля і об’єкта fuel
{
fuel.transform.position=new Vector3(0,fuel.transform.position.y fuel.transform.position.z);
fuel.transform.localScale = new Vector3(1, 1, 1);
//відновлення об’єкта fuel стандартних значень
}
}
}

Підсумковий результат – нехитра аркадная гонка, яку можна зараховувати до «вбивць часу» на Android.