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的大小,让他能够在游戏画面中以适当的大小显示出来,最终效果如下:
来源:oschina
链接:https://my.oschina.net/u/4406496/blog/4305061