前不久,由于要练习Unity的使用,之前也写了几个小游戏,但是感觉还有一些东西不太熟练,就临时决定来写一下这个塔防游戏,就是模仿一下几年前比较流行的皇家守卫军,(其实我当时也不知道写什么,是别人提的建议),这对于刚开始学习Unity的我也是一种挑战,废话不多说,开始实战:

 

我这里先把我做好的游戏放这里,供大家下载,链接:https://pan.baidu.com/s/1d0s49uehmmak3QSToMbWbw 密码:zlza),游戏没有做完,只做了一个箭塔,一个兵种,一个地图,因为原游戏太大了,不是一个人能做出来的;再者,有什么问题,就请大家提出来,当然,这个游戏本身就有很多问题,比如项目文件没有分类好、类的分工杂乱等一些问题,当然,有了问题就要解决,问题对于我们初学者是一个不错的老师,我们应该正面面对它。

 

首先是资源,一个好的游戏一定要有好的游戏资源,资源在网上找,当然,我已经找好了,资源:(链接:https://pan.baidu.com/s/1MdblW61OTzbwDuKsdYEoCg 密码:7xyh),刚开始不要全部导入,因为我们不要那么多,我们只要实现其塔防游戏的一些功能就行了,我不会把游戏做的很完整,当然,你有兴趣的话,可以完善游戏;

开始制作游戏:

一.制作游戏开始菜单

制作游戏开始菜单会用到Unity中的GUI,所以在做菜单的同时也能锻炼我们对GUI的使用;一般游戏开始菜单上都会有退出按钮、设置按钮、开始游戏按钮、关于游戏按钮,所以这几个按钮的功能我们都要实现;

效果图:

Unity3D之塔防游戏的制作(一)-LMLPHP

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,我还添加了一个点击播放声音的方法。

Unity3D之塔防游戏的制作(一)-LMLPHP

 代码很简单:

//你可以把它放到一个特殊的类里面,因为还有更多的按钮要用到这个声音

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界面:

Unity3D之塔防游戏的制作(一)-LMLPHP

 实现方法:

//canvas是一个游戏对象数组,用于储存两个UI游戏对象
public void Canvas1()
{
    canvas[0].SetActive(true);
    canvas[1].SetActive(false);
}

 添加这段代码之后,把做好的那两个UI对象给拖到上面去,就可以实现UI界面之间的切换了,

下面是我做的关于游戏的UI界面:

Unity3D之塔防游戏的制作(一)-LMLPHP                     

 最后的设置按钮,这里我只说一下新增功能:

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组件;

效果图:

Unity3D之塔防游戏的制作(一)-LMLPHP

到此,四个按钮就做好了,如果你想把它做得更好也可以添加一些其它的东西,我这里在中间添加了一个游戏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;
        }

    }
}

 

10-07 16:51