1 .怪物的生成
首先需要一个脚本定义怪物类型和变量 :代码如下
public class Wave //敌人属性
{
public GameObject Enemy; //敌人种类
public int wave; //敌人一泼几个
public float speed; //出怪间隔
}
然后有一个实例化怪物的脚本
public Transform place; //出怪点
public Wave[] waves; //怪物属性脚本
void Awake()
{
StartCoroutine("Enemy");
}
IEnumerator Enemy()
{
foreach (Wave wave in waves)
{
for (int i = 0; i < wave.wave; ++i)
{
GameObject a = Instantiate(wave.Enemy, place.position, Quaternion.identity, GameObject.Find("LevelMap_1").transform) as GameObject; //实例化怪物
yield return new WaitForSeconds(wave.speed);
}
}
2.2D怪物寻路
使用空物体,摆出一条道路.然后代码便利所有空物体,判断怪物和第一个空物体的距离,当接近相等,就让怪物去找别一个空物体,以此类推,怪物移动就完成了.大概代码如下:
public Transform[] Waydot; //敌人移动点(空物体)
int Dot=0; //移动点索引
void Update()
{
if (Dot > Waydot.Length - 1) //当怪物移动到最后一个空物体时,
{
return; //下面代码就不执行;
}
transform.Translate((Waydot[Dot].position - transform.position).normalized * Time.deltaTime * Speed); //敌人移动
if (Vector2.Distance(Waydot[Dot].position, transform.position) <= 0.1F)
{
Dot++;
}
3. 2D怪物转向切换动画
遍历所有空物体,计算相邻两个空物体的X相减,Y相减,判断相减后的X和Y的大小;大概代码如下:
if (Mathf.Abs(Waydot[Dot].position.x - Waydot[Dot - 1].position.x) > Mathf.Abs(Waydot[Dot].position.y - Waydot[Dot - 1].position.y) && Waydot[Dot].position.x - Waydot[Dot - 1].position.x >= 0)
{
//向 右动画
}
if (Mathf.Abs(Waydot[Dot].position.x - Waydot[Dot - 1].position.x) < Mathf.Abs(Waydot[Dot].position.y - Waydot[Dot - 1].position.y) && Waydot[Dot].position.y - Waydot[Dot - 1].position.y >= 0)
{
//向 上动画
}
if (Mathf.Abs(Waydot[Dot].position.x - Waydot[Dot - 1].position.x) > Mathf.Abs(Waydot[Dot].position.y - Waydot[Dot - 1].position.y) && Waydot[Dot].position.x - Waydot[Dot - 1].position.x <= 0)
{
//向左动画
}
if (Mathf.Abs(Waydot[Dot].position.x - Waydot[Dot - 1].position.x) < Mathf.Abs(Waydot[Dot].position.y - Waydot[Dot - 1].position.y) && Waydot[Dot].position.y - Waydot[Dot - 1].position.y <= 0)
{
//向下动画
}
4. 防御塔的建造
首先在地图上摆上你要建塔的位置,建塔点,并加上Circle Collider2D ,给建塔点加一个Tag或Layer,当点击鼠标左键时,从相机发出一条射线,判断是否点击到了建塔点,如果点到了就实例化出一个塔; 代码如下:
int BuildPagodac; // 建塔层层
void Start()
{
BuildPagodac = LayerMask.GetMask("BuildPagoda"); //建塔点 标签
}
void Update()
{
if (Input.GetMouseButtonDown(0)) //如果你点了鼠标左键
{
Vector2 pos = (Camera.main.ScreenToWorldPoint(Input.mousePosition)); //从相机发一条射线到鼠标点的位置
Collider2D BuildPagodacHit = Physics2D.OverlapPoint(pos, BuildPagodac); //与建塔点 //检查对撞机是否与空间中的点重叠。
if (BuildPagodacHit) //与建塔点
{
//建塔的方法
//也可以在这里实例化塔
}
}