My Android game on Unity
4 subscribers
14 videos
33 files
1 link
Download Telegram
to view and join the conversation
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class SelectLocation : MonoBehaviour {

public GameObject[] notCurrentLocationButtons;
public Sprite thisOne, notThisOne;
[SerializeField]
private string nameOfLocation;

// дізнаємось нинішню локацію та встановлюємо початкову
void Start () {
if (!PlayerPrefs.HasKey ("Location"))
PlayerPrefs.SetString ("Location", "City");
// встановлюємо спрайт відповідно до вибраної локації
if (PlayerPrefs.GetString ("Location") == nameOfLocation) {
gameObject.transform.GetChild (0).transform.GetComponent <Image> ().sprite = thisOne;
} else {
gameObject.transform.GetChild (0).transform.GetComponent <Image> ().sprite = notThisOne;
}
}

// обираємо локацію
void OnMouseUpAsButton () {
PlayerPrefs.SetString ("Location", nameOfLocation);

for (int i = 0; i < notCurrentLocationButtons.Length; i++)
notCurrentLocationButtons [i].GetComponent <Image> ().sprite = notThisOne;
gameObject.transform.GetChild (0).GetComponent <Image> ().sprite = thisOne;
}

}
Далі підключаємо цей скрипт до всіх трьох кнопок вибору локацій (Select City/Forest/Gas Station. Переносимо в нього потрібні скрипти і пишемо назви локацій.
Тепер пишемо скрипт ShowLocation.cs який буде відповідати за відображення локацій. Переносимо його в main камеру сцен game и main.скрипт виглядає так:
using System.Collections;
using UnityEngine;

public class ShowLocation : MonoBehaviour {

public GameObject[] locations; // масив наших локацій

// при старті гри відкриваємо вибрану в магазині локацію
void Start () {
if (PlayerPrefs.HasKey ("Location")) {
for (int i = 0; i < locations.Length; i++) {
if (PlayerPrefs.GetString ("Location") == locations [i].name) {
locations[i].SetActive(true);
break;
}

//if (PlayerPrefs.GetString ("Location") != locations [i].name)
//locations [i].SetActive (false);
}
// якщо не було вибрано ніякої локації то обирається перша стандартна
} else
locations [0].SetActive (true);
//for (int i = 1; i < locations.Length; i++) {
//if (PlayerPrefs.GetString ("Location") != locations [i].name)
//locations [i].SetActive (false);

//}

//Camera.main.transform.position = new Vector3 (13.97f, Camera.main.transform.position.y, Camera.main.transform.position.z);
}

}
В сам скрипт переносимо наші нові локації. Магазин працює коректно, оплата знімаєтся, локації вікриваются, обираются, та корректно відображаются під час гри, при старті гри відображаєтся попередньо вибоана гравцем локація.
Тепер зробимо звукові ефекти для гри. Для цього імпортуємо необхідні звуки. Всі звуки я помістив в нову папку Audio, яка знаходится в папці Assets. Почнемо з кнопок, логіка коду буде заключатись в перевірці чи увімкнений в грі звук і якщо так то ми будемо програвати звук, допишемо цей код в Buttons.cs. Далі обераємо всі кнопки на всіх сценах та додаємо на них звук button click. Тепер при натисканні на кнопку в нас є звук.
Тепер звук прискорення машинок. Для цього зробимо новий скрипт ExhaustSound.cs, який відразу ж додамо до нашого префабу Exhaust. Скрипт виглядатиме так:
using UnityEngine;

public class ExhaustSound : MonoBehaviour {

public AudioClip[] clips; // масив звуків

void Start () {
if (PlayerPrefs.GetString ("Music") != "no") {
GetComponent <AudioSource> ().clip = clips [Random.Range (0, clips.Length)];
GetComponent <AudioSource> ().Play (); // обераємо музику рандомно
}
}

}
Тепер додаємо масив звуків на скрипт в префабі. Все готово, при прискоренні в нас є три звуки які спрацьовують випадково.
Тепер звук сповільнення. На кнопку Slow Time переносимо звук Slow i в скриті SlowTime.cs дописуємо перевірку і музика спрацьовує.
Звук при зіткненні. Для нього створюємо новий скрипт ExplodeSound.cs далі все ідентично як з префабом Exhaust тільки тепер з Explode. Що ж звук зіткнення працьює.
Тепер звуки для магазину. Допишемо необхідні скрипти BuySlowTime.cs ma BuyNewLocation.cs. В нас буде масив з двух звуків успішньої покупки і неуспішної. Так як на кнопках вже є звуки, додамо сам звук на дочірній обєкт кнопки(картинку). Тепер коли вистачає грошей при покупці буде звук успіху, а коли їх не вистачає, то буде звук невдачі.
Тепер додамо постійний звук гудків, який завжди буде в грі (для атмосфери) і не буде зникати чи перезапускатись заново при переході між сценами. Створимо скрипт CreateAudio.cs тут ми просто створюємо об‘єкт і перевіряємо чи він вже існує. Скрипт виглядає так:
using UnityEngine;

public class CreateAudio : MonoBehaviour {

public GameObject music;

// створюємо обєкт, якщо він ще не створений
void Start () {
if (GameObject.Find ("Audio Cntrl(Clone)") == null)
Instantiate (music, new Vector3 (0,0,0), Quaternion.identity);
}

}
Створимо новий пустий об‘єкт AudioCntrl. І додамо на нього звук Car Noise. Робимо з цього обєкта префаб. В main камеру переносимо цей префаб. Тепер додаємо новий скрипт до цього ж префабу AudioCntrl.cs. Скрипт виглядатиме так:
using System.Collections;
using UnityEngine;

public class AudioCntrl : MonoBehaviour {

private bool play;

void Start () {
DontDestroyOnLoad (transform.gameObject); // не знищується при переході на нову сцену
StartCoroutine (horn ());
}
// постійна музика яку ми вимикаємо в реальному часі
void Update () {
if (PlayerPrefs.GetString ("Music") != "no" && !play) {
GetComponent <AudioSource> ().Play ();
play = true;
} else if (PlayerPrefs.GetString ("Music") == "no" && play) {
GetComponent <AudioSource> ().Pause (); // ставимо на паузу щоб потім продовжити її з того ж моменту
play = false;
}
}
// постійно повторювані сигнали які повторюются в діапазоні
IEnumerator horn () {
while (true) {
yield return new WaitForSeconds (Random.Range (12f, 22f));
if (PlayerPrefs.GetString ("Music") != "no")
transform.GetChild (0).GetComponent <AudioSource> ().Play ();
}
}

}
В Audio Cntrl додамо об’єкт Horn і туди перенесемо звук сигналу. Все готово. Тепер в грі є всі потрібні звукові ефекти.