Простая 2D-игра на Unity 5. Часть 5

Добавлено: 04/08/2016 03:20 |  Обновлено: 18/03/2018 08:36 |  Добавил: nick |  Просмотры: 1728 Комментарии: 1
Вводная часть
В этой части добавим звук к нашей простой игре. Для примера озвучим только момент сбора кристаллов.
Десктопная версия игры, основанная на этом материале.
Android-версия игры ×
Чтобы добавить звук вам для начала нужно его подготовить в виде аудиофайла, лучше всего для этой цели использовать wav-файлы, а не mp3. В конце материала будет ссылка на файл navigate_36.wav, можно взять его для примера.

Итак, после того как со звуковыми файлами разобрались. Нужно добавить их в проект. В нашем случае нужно перенести один-единственный файл, просто перебросив его мышкой из папки в область вкладки Project среды разработки Unity3D. Предварительно, конечно, лучше всего создать отдельную папку Sounds. Далее, таким же образом, нужно перенести этот звуковой файл на объект в игре. В нашем случае для этого подойдет объект игрока – тарелка. После переноса, будет создан компонент Audio Source, в нем нужно отключить пункт Play On Awake, так как нам не нужно, чтобы звук проигрывался в самом начале игры. С подготовительной частью мы закончили, теперь откроем файл CompletePlayerController.cs. Объявим новую приватную переменную audioSource, чтобы далее в коде можно было к ней обращаться:
private AudioSource audioSource; 
В методе Start() инициализируем объявленную ранее переменную:
audioSource = GetComponent(); 
Теперь эта переменная хранит ссылку на звуковой файл, который мы можем проиграть в нужный момент, а именно в момент сбора кристалла:
if (other.gameObject.CompareTag ("PickUp")) 
        {
            audioSource.Play (); 
            …
Далее привожу полный текст файла CompletePlayerController.cs.
using UnityEngine;
using System.Collections;

//Adding this allows us to access members of the UI namespace including Text.
using UnityEngine.UI;

public class CompletePlayerController : MonoBehaviour {

	public float speed;	//Floating point variable to store the player's movement speed.
	public Text countText; //Store a reference to the UI Text component which will display the number of pickups collected.
	public Text winText; //Store a reference to the UI Text component which will display the 'You win' message.

	private Rigidbody2D rb2d; //Store a reference to the Rigidbody2D component required to use 2D Physics.
	private int count; //Integer to store the number of pickups collected so far.

	public GameObject gameController;
	private AudioSource audioSource;

	// Use this for initialization
	void Start()
	{
		audioSource = GetComponent();
		//Get and store a reference to the Rigidbody2D component so that we can access it.
		rb2d = GetComponent ();

		//Initialize count to zero.
		count = 0;

		//Initialze winText to a blank string since we haven't won yet at beginning.
		winText.text = "";

		//Call our SetCountText function which will update the text with the current value for count.
		SetCountText ();
	}

	//FixedUpdate is called at a fixed interval and is independent of frame rate. Put physics code here.
	void FixedUpdate()
	{
		//Store the current horizontal input in the float moveHorizontal.
		float moveHorizontal = Input.GetAxis ("Horizontal");

		//Store the current vertical input in the float moveVertical.
		float moveVertical = Input.GetAxis ("Vertical");

		//Use the two store floats to create a new Vector2 variable movement.
		Vector2 movement = new Vector2 (moveHorizontal, moveVertical);

		//Call the AddForce function of our Rigidbody2D rb2d supplying movement multiplied by speed to move our player.
		rb2d.AddForce (movement * speed);
	}


	//OnTriggerEnter2D is called whenever this object overlaps with a trigger collider.
	void OnTriggerEnter2D(Collider2D other) 
	{
		//Check the provided Collider2D parameter other to see if it is tagged "PickUp", if it is...
		if (other.gameObject.CompareTag ("PickUp")) 
		{
			audioSource.Play ();
			//... then set the other object we just collided with to inactive.
			other.gameObject.SetActive(false);
			
			//Add one to the current value of our count variable.
			count = count + 1;
			
			//Update the currently displayed count by calling the SetCountText function.
			SetCountText ();
		}
		

	}


	//This function updates the text displaying the number of objects we've collected and displays our victory message if we've collected all of them.
	void SetCountText()
	{
		//Set the text property of our our countText object to "Count: " followed by the number stored in our count variable.
		countText.text = "Всего собрано: " + count.ToString ();

		//Check if we've collected all 12 pickups. If we have...
		if (count >= 12) {
			gameController.SendMessage("activateRestartButton", true);
			//... then set the text property of our winText object to "You win!"
			winText.text = "Вы выиграли!";
		}
	}
}
Перевод комментариев файла CompletePlayerController.cs смотрите в первой части.

Звуковой файл, используемый для примера.

Оставьте свой комментарий

Комментарии

  • Алексей  07/07/2017 18:42

    Для того, чтобы код заработал пришлось параметризировать метод GetComponent<AudioSource> . Пока этого не сделал игра не запускалась. 

    Ссылка
    • Ответить