Unity 2D塔防

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);                                    
 
             }

扫描二维码关注公众号,回复: 194843 查看本文章

        }

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)                                                                     //与建塔点  
            {
                //建塔的方法 

                //也可以在这里实例化塔

            }

       }


猜你喜欢

转载自blog.csdn.net/cadnzhu/article/details/78531455
今日推荐