Unity3D塔防游戏开发——学习笔记(上)

只愿长相守 提交于 2020-08-13 08:32:29

1、导入资源

首先我们导入游戏需要的资源:

导入之后我们可以在项目中看到我们的塔防游戏的资源 

2、烘焙场景,制作怪物移动路线

我们首先将Resource文件里面的主要的游戏场景EVE拖入到我们的主场景中

然后我们利用导航网格的方法来控制怪物的行进路线,禁用掉原路线WayPoint,然后对整个场景进行烘焙,将EVE设置为Static静态环境。

然后选择Window菜单AI里面的Navigation,然后选择Bake进行烘焙

然后我们拖入一个怪物Zombie_1到场景中,给怪物添加一个Nav Mesh Agent的组件让怪物按照烘焙出来的路进行移动

设置Nav Mesh Agent组件的属性,让他的半径和高度贴合怪物本身的大小,然后新建脚本,将脚本放置在怪物对象上,控制怪物进行移动。

这里我们设置了一个全局变量targetPos,就是怪物要移动的最终目标点,我们新建一个Gameobject,命名为TargetPos,放置到场景对象EVE中,并且我们将TargetPos移动到怪物1的脚本组件的targetPos变量上,这样就可以对之前目标位置进行赋值。

然后运行测试一下结果,我们可以看到怪物动起来了,朝着最终目标进行移动:

 

3、怪物孵化器及动画状态机的制作

我们现在实现了怪物的行走,那么现在只需要让怪物在刷怪点固定出现就可以了,新机哪一个Gameobject命名为Gamemanage,赋予怪物初始的位置信息。

然后新建一个脚本EnemyIncubator用来作为怪物孵化器,设置怪物波次的一些信息。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyIncubator : MonoBehaviour
{
    public GameObject[] enemys;
    private float time;//每波间隔时间
    private float times;//每个怪物间隔时间
    private float count;//怪物波次
    private float counts;//一波怪物个数

    // Start is called before the first frame update
    void Start()
    {
        time = 2;
        times = 1;
        count = 2;
        counts = 5;
        StartCoroutine(CreateEnemy());
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private IEnumerator CreateEnemy()
    {
        for(int i=0;i<count;i++)
        {
            for(int j=0;j<counts;j++)
            {
                Instantiate(enemys[Random.Range(0,enemys.Length)],transform.position,Quaternion.identity);//生成怪物
                yield return new WaitForSeconds(times);
            }
            yield return new WaitForSeconds(time);
        }
    }
}

将脚本挂载到 Gamemanage对象上,并拖动prefabs里面的zombie1-5对enemy数组进行赋值

需要注意的是,这些zombie都需要挂载EnemyAI这个脚本,用来控制怪物的行走,并且都需要添加Nav Mesh Agent组件。

接下来我们完成了行走与波次的功能,需要设置行走的动画,我们新建一个文件夹,加入动画控制器并放到怪物1身上。

接着我们调出window里面的animator窗口,找到资源里面的zombie的animation里面的动作,将这些动作拖入到animator窗口组成一系列动作。右键初始动作idel,与第二个动作进行连接,然后右键第二个动作进行连接,设置animation参数为真,并命名为Run,然后点击连接的线,设置has exit time为未勾选,添加conditions,向右箭头为true,向左箭头为false,同理设置另外四个怪物分别的animator controller。这里需要注意双击walk动作,设置为loop,这样动作就可以循环播放。

EnemyAI这个脚本代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class EnemyAI : MonoBehaviour
{
    private NavMeshAgent agent;
    private Transform targetPos;//得到目的地位置信息
    private Animator ani;//得到行走动画信息

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        ani = GetComponent <Animator>();
        targetPos = GameObject.Find("TargetPos").transform;
    }

    // Update is called once per frame
    void Update()
    {
        agent.destination = targetPos.position;
        if(agent.isStopped)
        {
            ani.SetBool("Run", false);
        }
        else
        {
            ani.SetBool("Run", true);
        }
    }
}

然后就可以实现怪物孵化器与行走动作的功能(以2波,每波5个怪物为例):

4、创建炮台的UI制作

炮台的UI主要涉及到了UI的制作问题,我们可以直接在场景右键新建UI->Canvas,然后右键Canvas新建一个空物体用来存放图片,然后导入炮塔的图片,设置图片属性为sprite。然后分别右键创建四个UI->Image,设置源为我们导入的炮塔图片,最后设置一个取消图片。

然后调节UI的大小,让他能够在游戏画面中以适当的大小显示出来,最终效果如下:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!