塔防游戏 Day1

1. 创建地图

  

  如上图所示,白色方块为可以放置塔楼的区域,粉红色区域为敌人的行走区域,绿色方块处为起始点,黄色方块点为终止点。

 

2. 控制游戏的视野

 1 public class ViewScript : MonoBehaviour {
 2     public int speed = 10;                                  // 方位键灵敏度
 3     public int mouseSpeed = 600;                            // 鼠标中键灵敏度
 4 
 5     // Update is called once per frame
 6     // W,A,S,D控制画面左右移动,鼠标中轴控制画面缩放
 7     void Update () {
 8         float h = Input.GetAxis("Horizontal");              // 获取左右键输入
 9         float v = Input.GetAxis("Vertical");                // 获取上下键输入
10         float mouse = Input.GetAxis("Mouse ScrollWheel");   // 获取鼠标中轴输入
11         // 摄像头移动
12         transform.Translate(new Vector3(h * speed, mouse * mouseSpeed, v * speed) * Time.deltaTime, Space.World);
13     }
14 }

 

 

3. 敌人路径管理

   在地图上每个转折点设置标记,用以表示敌人的运动路径。并设置 WayPoints 类存储路径结点。

 1 public class WayPoints : MonoBehaviour {
 2     // 存储路径结点方位
 3     public static Transform[] positions;
 4 
 5     void Awake()
 6     {
 7         positions = new Transform[transform.childCount];    // 初始化路径数组
 8         for (int i = 0; i < positions.Length; ++i)
 9         {
10             positions[i] = transform.GetChild(i);           // 存储所有路径结点方位
11         }
12     }
13 }

 

 

4. 创建敌人,控制敌人移动

 1 public class Enemy : MonoBehaviour {
 2     private Transform[] points;             // 存储敌人路径 
 3     private int index = 0;                  // 存储当前目的地结点序号
 4     public int speed = 10;                  // 敌人速度
 5 
 6     // Use this for initialization
 7     void Start () {
 8         points = WayPoints.positions;       // 获取路径
 9     }
10     
11     // Update is called once per frame
12     void Update () {
13         Move();                             // 控制敌人移动
14     }
15 
16     void Move()
17     {
18         // 敌人移动
19         transform.Translate((points[index].position - transform.position).normalized * Time.deltaTime * speed);
20         // 若到达目的地,则更新目的地
21         if (Vector3.Distance(points[index].position, transform.position) < 0.2f)
22         {
23             if (index < points.Length - 1)
24             {
25                 index++;
26             }
27             else
28             {
29                 reachDis();                 // 到达终点
30             }
31         }
32     }
33 
34     void reachDis()
35     {
36         // 到达终点后销毁敌人
37         GameObject.Destroy(this.gameObject);
38     }
39 
40     void OnDestroy()
41     {
42         EnemySpawner.countEnemyAlive--;     // 存活敌人个数-1
43     }
44 }

 

 

5. 创建敌人孵化器管理敌人的生成

1 // 自定义每波敌人的参数
2 [System.Serializable]                   // 序列化
3 public class Wave
4 {
5     public GameObject enemyPrefab;      // 敌人模型
6     public int count;                   // 敌人数量
7     public float rate;                  // 敌人生成间隔
8 }
 1 public class EnemySpawner : MonoBehaviour {
 2     public Wave[] waves;                            // 定义每波敌人参数
 3     public Transform start;                         // 敌人出生点
 4     public int waveRate = 3;                        // 每波敌人生成间隔
 5     public static int countEnemyAlive = 0;          // 生存敌人个数
 6 
 7     // Use this for initialization
 8     void Start () {
 9         StartCoroutine(SpawnEnemy());               // 启动线程
10     }
11 
12     IEnumerator SpawnEnemy()
13     {
14         foreach(Wave wave in waves)                 // 遍历每一波敌人
15         {
16             for (int i = 0; i < wave.count; ++i)    // 生成每个敌人
17             {
18                 // 生成敌人
19                 GameObject.Instantiate(wave.enemyPrefab, start.position, Quaternion.identity);
20                 countEnemyAlive++;                  // 生存敌人个数+1
21                 if (i != wave.count - 1)            // 敌人生成间隔
22                     yield return new WaitForSeconds(wave.rate);
23             }
24             while (countEnemyAlive > 0)             // 上一波敌人全部死亡后,才能生成下一波敌人
25             {
26                 yield return 0;
27             }
28             yield return new WaitForSeconds(waveRate);      // 等待生成下一波敌人
29         }
30     }
31 }

 

posted @ 2018-03-14 20:53  Just_for_Myself  阅读(463)  评论(0编辑  收藏  举报