前不久,由於要練習Unity的使用,之前也寫了幾個小遊戲,但是感覺還有一些東西不太熟練,就臨時決定來寫一下這個塔防遊戲,就是模仿一下幾年前比較流行的皇家守衛軍,(其實我當時也不知道寫什麼,是別人提的建議),這對於剛開始學習Unity的我也是一種挑戰,廢話不多說,開始實戰:
我這裏先把我做好的遊戲放這裏,供大家下載,(鏈接:https://pan.baidu.com/s/1d0s49uehmmak3QSToMbWbw 密碼:zlza),遊戲沒有做完,只做了一個箭塔,一個兵種,一個地圖,因爲原遊戲太大了,不是一個人能做出來的;再者,有什麼問題,就請大家提出來,當然,這個遊戲本身就有很多問題,比如項目文件沒有分類好、類的分工雜亂等一些問題,當然,有了問題就要解決,問題對於我們初學者是一個不錯的老師,我們應該正面面對它。
首先是資源,一個好的遊戲一定要有好的遊戲資源,資源在網上找,當然,我已經找好了,資源:(鏈接:https://pan.baidu.com/s/1MdblW61OTzbwDuKsdYEoCg 密碼:7xyh),剛開始不要全部導入,因爲我們不要那麼多,我們只要實現其塔防遊戲的一些功能就行了,我不會把遊戲做的很完整,當然,你有興趣的話,可以完善遊戲;
開始製作遊戲:
一.製作遊戲開始菜單
製作遊戲開始菜單會用到Unity中的GUI,所以在做菜單的同時也能鍛鍊我們對GUI的使用;一般遊戲開始菜單上都會有退出按鈕、設置按鈕、開始遊戲按鈕、關於遊戲按鈕,所以這幾個按鈕的功能我們都要實現;
效果圖:
1.製作背景圖片:
1.在Hierarchy視圖下的Create中選擇UI,然後在UI下選擇Canvas,2.右鍵Canvas選擇UI,然後選擇Image,3.點擊Image,在Inspector視圖下的Image組件中選擇Source Image,在其中選擇好圖片,4.調整好大小,基本上就OK了。
2.製作退出按鈕、開始按鈕、關於遊戲按鈕、設置按鈕:
法1:1.右鍵Canvas選擇UI,然後選擇Button;
2.同樣也是點擊Button後,在Inspector視圖下Image中的Source Image,選擇圖片,調整大小;
3.點擊Button下的Transition,在下拉菜單中有None、Color Tint、Sprite Swap、Animation,現在它默認是選擇Color Tint,Color Tint是用顏色做UI特效,Sprite Swap是用圖片做UI特效,Animation是用動畫做UI特效,我現在就選擇默認的Color Tint,4.在下面還有Normal Color(沒有任何動作時的顏色)、Highlighted Color(鼠標移上去時的顏色),Pressed Color(鼠標在上面點擊時的顏色)、Disabled Color(禁用時的顏色);之後選擇好顏色,;
4.添加script組件,然後開始寫代碼:
//退出遊戲
public void Exit()
{
Application.Quit();
}
寫一個公用的方法就行了;
5.把這個方法綁定到按鈕上,點擊Button下On Click中的“+”,把你之前添加script組件的對象拖到None(Object)上,然後在右邊的下拉菜單中選擇script組件的Exit方法。
這退出按鈕做完了,如果你想做漂亮點可以用Transition下的Sprite Swap和Animation,我這裏用的是Sprite Swap,我還添加了一個點擊播放聲音的方法。
代碼很簡單:
//你可以把它放到一個特殊的類裏面,因爲還有更多的按鈕要用到這個聲音
public AudioClip clip; //要播放的音樂
private AudioSource audios; //播放器組件
void Awake () {
audios = GetComponent<AudioSource>();
}
public void Audio1()
{
audios.clip = clip;
audios.Play();
}
當然還有另外一種方法:法2:前面四步都是一樣的,
5.選中按鈕對象,點擊菜單欄的Component,點擊下面的Event,再點擊Event Trigger,它會在按鈕對象裏添加一個
Event Trigger組件,在外面的Hierarchy下添加一個事件偵聽器,之後你就可以在Event Trigger組件裏添加事件類型和綁定方法,我一般把Event Trigger組件和Button組件相互使用,兩者互補其缺陷,能夠使你的UI更加完美;Event Trigger裏面的事件類型我就不細講了,有一些我也沒用過,一般是用前面幾個;
現在退出按鈕做好了,接下來製作其它按鈕,製作其它按鈕和退出按鈕無非就是實現的功能不一樣而已,就像開始按鈕,點擊之後要切換到下一個場景,也就是主場景,實現起來是簡單的
//切換到主場景
public void StartGame()
{
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("主場景的名稱");
}
同時要導入一個類:
using UnityEngine.SceneManagement;
就如同退出按鈕,想做漂亮,就要用心、用時間去做。
下面做關於遊戲按鈕,它實現起來就是兩個UI界面之間的切換,所以我要做兩個UI界面:
實現方法:
//canvas是一個遊戲對象數組,用於儲存兩個UI遊戲對象
public void Canvas1()
{
canvas[0].SetActive(true);
canvas[1].SetActive(false);
}
添加這段代碼之後,把做好的那兩個UI對象給拖到上面去,就可以實現UI界面之間的切換了,
下面是我做的關於遊戲的UI界面:
最後的設置按鈕,這裏我只說一下新增功能:
1.點擊一下實現設置面板以移動的方式出現;
實現方法:
private Animator animator;
private bool isClick = false;
void Awake () {
animator = GetComponent<Animator>();
}
public void Move()
{
if (isClick)
{
animator.SetInteger("isMove", 1);
isClick = false;
}
else
{
animator.SetInteger("isMove", -1);
isClick = true;
}
}
我這裏加了一個動畫,不然就不會有那種移動的效果
2.設置面板可以調節主音樂音量;
實現方法:
private AudioSource audios;
//調節音量
public void AudioSize(float newVolume)
{
audios.volume = newVolume;
}
在這裏要添加UI組件裏的Slider組件。
3.設置面板可以關閉主音樂;
實現方法:
private bool isClick = true;
//關閉打開主菜單音樂
public void AudioSwitch()
{
if (isClick)
{
audios.Stop();
isClick = false;
}
else
{
audios.Play();
isClick = true;
}
}
這裏要添加UI組件裏的Toggle組件;
效果圖:
到此,四個按鈕就做好了,如果你想把它做得更好也可以添加一些其它的東西,我這裏在中間添加了一個遊戲logo,也讓整個畫面看起來飽滿些,其實我在做開始菜單時,花時間最多的是動畫製作和按鈕製作,這裏的代碼量很少。
下面公佈本節所有代碼:
具體的請到我公佈的資源中查看:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameController : MonoBehaviour {
public GameObject[] canvas; //儲存兩個UI遊戲對象
private AudioSource audios; //音樂播放器
private bool isClick = true;
void Awake()
{
audios = GetComponent<AudioSource>();
}
public void Canvas1()
{
canvas[0].SetActive(true);
canvas[1].SetActive(false);
}
public void Canvas2()
{
Invoke("A", 0.2f);
}
private void A()
{
canvas[0].SetActive(false);
canvas[1].SetActive(true);
}
//退出遊戲
public void Exit()
{
Application.Quit();
}
//調節音量
public void AudioSize(float newVolume)
{
audios.volume = newVolume;
}
//關閉打開主菜單音樂
public void AudioSwitch()
{
if (isClick)
{
audios.Stop();
isClick = false;
}
else
{
audios.Play();
isClick = true;
}
}
public void StartGame() //進入關卡場景
{
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(1);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Canvas : MonoBehaviour {
public AudioClip clip; //音樂
private AudioSource audios; //音樂播放器
void Awake () {
audios = GetComponent<AudioSource>();
}
public void Audio1()
{
audios.clip = clip;
audios.Play();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnimatorMove : MonoBehaviour {
private Animator animator; //動畫播放器組件
private bool isClick = false;
void Awake () {
animator = GetComponent<Animator>();
}
public void Move()
{
if (isClick)
{
animator.SetInteger("isMove", 1);
isClick = false;
}
else
{
animator.SetInteger("isMove", -1);
isClick = true;
}
}
}