1. 创建地图

  

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

2. 控制游戏的视野

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

3. 敌人路径管理

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

 public class WayPoints : MonoBehaviour {
// 存储路径结点方位
public static Transform[] positions; void Awake()
{
positions = new Transform[transform.childCount]; // 初始化路径数组
for (int i = ; i < positions.Length; ++i)
{
positions[i] = transform.GetChild(i); // 存储所有路径结点方位
}
}
}

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

 public class Enemy : MonoBehaviour {
private Transform[] points; // 存储敌人路径
private int index = ; // 存储当前目的地结点序号
public int speed = ; // 敌人速度 // Use this for initialization
void Start () {
points = WayPoints.positions; // 获取路径
} // Update is called once per frame
void Update () {
Move(); // 控制敌人移动
} void Move()
{
// 敌人移动
transform.Translate((points[index].position - transform.position).normalized * Time.deltaTime * speed);
// 若到达目的地,则更新目的地
if (Vector3.Distance(points[index].position, transform.position) < 0.2f)
{
if (index < points.Length - )
{
index++;
}
else
{
reachDis(); // 到达终点
}
}
} void reachDis()
{
// 到达终点后销毁敌人
GameObject.Destroy(this.gameObject);
} void OnDestroy()
{
EnemySpawner.countEnemyAlive--; // 存活敌人个数-1
}
}

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

 // 自定义每波敌人的参数
[System.Serializable] // 序列化
public class Wave
{
public GameObject enemyPrefab; // 敌人模型
public int count; // 敌人数量
public float rate; // 敌人生成间隔
}
 public class EnemySpawner : MonoBehaviour {
public Wave[] waves; // 定义每波敌人参数
public Transform start; // 敌人出生点
public int waveRate = ; // 每波敌人生成间隔
public static int countEnemyAlive = ; // 生存敌人个数 // Use this for initialization
void Start () {
StartCoroutine(SpawnEnemy()); // 启动线程
} IEnumerator SpawnEnemy()
{
foreach(Wave wave in waves) // 遍历每一波敌人
{
for (int i = ; i < wave.count; ++i) // 生成每个敌人
{
// 生成敌人
GameObject.Instantiate(wave.enemyPrefab, start.position, Quaternion.identity);
countEnemyAlive++; // 生存敌人个数+1
if (i != wave.count - ) // 敌人生成间隔
yield return new WaitForSeconds(wave.rate);
}
while (countEnemyAlive > ) // 上一波敌人全部死亡后,才能生成下一波敌人
{
yield return ;
}
yield return new WaitForSeconds(waveRate); // 等待生成下一波敌人
}
}
}

最新文章

  1. Flapper Bird的学习笔记(一)
  2. Js控制iFrame切换加载网址
  3. [BS-31]导航控制器的interactivePopGestureRecognizer属性
  4. noip2014-day1-t2
  5. 重装VS2010时出现未能正确加载 &quot;radlangsvc.package,radlangsvc.vs...
  6. Linux学习笔记21——线程同步的两种方式
  7. Foundation: Binary Search
  8. 简单实用的下拉菜单(CSS+jquery)
  9. JVM内存划分
  10. great C++ socket library
  11. Linux文件系统中硬链接和软链接的区别 (转)
  12. Server Tomcat v7.0 Server at localhost failed to start.解决方法
  13. ABP官方文档翻译 7.1 后台Jobs和Workers
  14. VMware Workstation 14 Pro永久激活密钥
  15. C#中的?和??,null和Nullable
  16. RabbitMQ中,exchange1绑定exchange2,exchange1和exchange2都绑定queue1,此时消息发送给exchange1,queue1中有几条消息
  17. Ionic2+WebApi 导出Excel转Pdf文件。
  18. Xamarin SQLite教程Xamarin.iOS项目添加引用
  19. idea打包含第三方依赖的jar包
  20. python中的这些坑,早看早避免。

热门文章

  1. js实现图片上传
  2. 20165212 预备作业3 Linux安装及学习
  3. 三分钟教你同步 Visual Studio Code 设置
  4. openresty &amp;&amp; hashids&amp;&amp; redis 生成短链接
  5. git clone遇到的[ssh: connect to host github.com port 22]
  6. java的RTTI和反射机制
  7. Windows Restart Manager 重启管理器
  8. Msys2+mingw-w64 编译VS2013使用的ffmpeg静态库注意事项
  9. 将h264和aac码流合成flv文件
  10. java代码---------实现File的目录下创建文本文档