Unity3D游戏开发——塔防小游戏

时间:2023-02-07 18:44:03

游戏效果图:

Unity3D游戏开发——塔防小游戏

本文参照siki学院的塔防游戏教程写的。http://www.sikiedu.com,搜索塔防游戏登入即可观看。

游戏流程:

1.首先创建cube调整其大小(以便计算),然后将其设成预设体(以便之后统一操作),利用ctrl+D复制弄出地形,在Hierarchy视图上创建一个map文件夹保存其文件。然后在地形内删除cube,创出自己想要的敌人行走路径。

2.在每个转折处设置一个Gameobject文件夹,然后在Transform上放Unity3D游戏开发——塔防小游戏修改一种颜色(以便区分),

将其命名为Waypoint并设置成预设体,创建一个Waypoint文件夹保存所有的Waypoint。在预设体上加上脚本Waypoint:

public class Waypoint : MonoBehaviour {
    public static Transform[] p;//定义数组
    private void Awake()//在脚本执行时执行
    {
        //获取每个数组的参数,也就是节点位置
        p = new Transform[transform.childCount];
        for (int i = 0; i < p.Length; i++) {
            p[i] = transform.GetChild(i);
        }
    }
}

在Scence场景上新建一个Sphere(当成敌人)然后将其放在起点,加上脚本Enemy:

public class Enemy : MonoBehaviour {

    public float speed = 10;//设置敌人的速度
    private Transform[] p;//定义数组

void Start () {
        p = Waypoint.p;//调用Waypoint脚本获取节点的位置信息
    }

void Update () {
        Move();//每一帧执行方法
}

void Move() {
        transform.Translate((p[index].position-transform.position).normalized*Time.deltaTime*speed);//移动,节点到当前位置的向量差的单位差*完成上一帧的时间*速度

        if (Vector3.Distance(p[index].position, transform.position) < 0.2f)//三维坐标,距离(节点,当前位置)小于0.2f的时候执行
        {
            index++;//增加索引,也就获取到下个节点坐标
            if (index > p.Length - 1)//如果大于最后一个节点时执行
            {
                Destroy(this.gameObject);//销毁物体
            }
        }
    }

}

这样就能让物体按照指定的坐标移动起来。

  3.控制游戏的视野(设置摄像机),首先把摄像机调整到一个合适的状态(向上移动一定的位置,x轴旋转45°),之后来用脚本控制摄像机的移动,添加脚本Move():

public class move : MonoBehaviour {
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
        float a = Input.GetAxis("Horizontal");//当按下的左右方向(a,d 方向键的左右 4,6)时获取到一个-1到1的值
        float b = Input.GetAxis("Vertical");//当按下的上下方向(w,s 方向键的上下 8,2)时获取到一个-1到1的值
        float m = Input.GetAxis("Mouse ScrollWheel")*-8;//鼠标滚轮缩放
        transform.Translate(new Vector3(a,m,b)*Time.deltaTime*50,Space.World);//转为世界坐标移动
}
}

4.创建一个Gameobject命名为fuhuaqi代表敌人孵化器(用来控制敌人的生成),首先写一个封装类来保存每一波敌人的类型,总数,速度,封装类命名为Bo:

[System.Serializable]//可序列化,就是能被其他代码引用的意思
public class Bo {
    public GameObject e;//敌人的类型
    public int count;//敌人的总数
    public float rate;//每个敌人的间隔
}

之后再fuhuaqi上写上控制敌人生成的脚本Enemyfuhuaqi:

public class Enemyfuhuaqi : MonoBehaviour {

    public Bo[] b;//封装类
    public Transform start;//定义开始位置
    public float jiange = 3;//每波的间隔

    private Coroutine coroutine;//定义协同,方便控制协同的启动和停止

    void Start () {
       coroutine= StartCoroutine(Move());//启动协程
    }

    public void Stop()
    {
        StopCoroutine(coroutine);//停止协程
    }

//协程
    IEnumerator Move() {
        foreach (Bo b in b)
        {
            for (int i = 0; i < b.count; i++)//循环生成
            {
                GameObject.Instantiate(b.e,start.position,Quaternion.identity);//创建(生成种类,生成位置,不旋转)
                if (i != b.count - 1)
                {
                    yield return new WaitForSeconds(b.rate);//协程中的等待(同样敌人的间隔)
                }
            }    
           yield return new WaitForSeconds(jiange);//完成一波后等待间隔的时间
    }

}

Unity3D游戏开发——塔防小游戏写好脚本后记得给相对应的东西赋值!

5.右键点击Assets->import package->custom package选择载好的材料包,将建筑模型拖入Scence然后在Transform的右侧的齿轮Reset,调整位子(注:选中模型里面所有子物体进行调整,因为之后要按照模型定位与地图方块的地位相同,不让其陷入地板),给对应的位置上材质。做好后设置成Prefab。

6.开始设置UI界面,首先创建一个Canvas(画布),点击Scence上的2D按钮界面会变成2D界面比较容易操作,在画布里在创建一个Gameobject(名称:Switch)在其下创建3个Canvas存放炮塔的图标在其下再创建image(名:background)和text(用来存放炮塔的图标图片和价格)在其background下创建image(名:Checkmark 用来表示被选中状态)将其中Soure image 属性改成Knob然后改变颜色改变透明度

Unity3D游戏开发——塔防小游戏Unity3D游戏开发——塔防小游戏给Switch添加属性Toggle group将每个炮塔添加属性Toggle并is on属性都取消,将Checkmark拖入Graphic,将Group都设置成Switch(表示在一个组里面)

7.在主Canvas下创建Text(名:money)用来显示当前的钱,设置一段动画让钱不够时会闪烁,选择菜单栏上的windows->animation->create->选择保存到Animations文件夹(文件夹自己定义),点击红点开始录制,然后按照喜好变化就好。双击动画进入编辑界面:

Unity3D游戏开发——塔防小游戏

再fuhuaqi上添加脚本buildguanliqi,将定义好的文本和动画赋值上去

8.创建炮塔,首先选中右侧建造的炮塔,检查mapcube上是否为空,并且鼠标点击mapcube,即可建造。加上粒子效果,建造后money减少。

9.创建子弹,在头部定义子弹的位置实例化子弹,然后给炮塔加一个Shpere collider用来检测进入的敌人并用数组存放,并且默认攻击第一个,超出范围或者敌人死亡移除该物体在数组中的位置

10.升级炮塔,检测mapcube上是否有物体存在,物体是否升级过,钱是否够,满足条件这摧毁先前物体,新建升级物体并播放特效。

11.敌人全部死亡,显示胜利,到达终点则显示失败;