通往下一关:
脚本及其实现方法:
自动删除脚本AutoDestroy:
控制每次子弹发射后自动销毁。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AutoDestroy : MonoBehaviour {
// Use this for initialization
//子弹创建后自动销毁
void Start () {
Destroy (gameObject, 0.1f);
}
}
传送门Door:
一个碰撞方法,控制与玩家的碰撞。
通关方法:首先限制玩家的移动,然后加载幕布,重置玩家的位置,重置地图,最后恢复玩家的移动,销毁传送门。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Door : MonoBehaviour {
// Use this for initialization
void OnCollisionEnter(Collision col)
{
//碰撞方法:如果是玩家与其发生了碰撞 执行通关方法
if (col.transform.tag == "Player")
StartCoroutine (Operator (col.transform.GetComponent<MyPlayer> ()));
}
//通关方法
private IEnumerator Operator(MyPlayer player)
{
player.enabled = false; //限制玩家移动
yield return new WaitForSeconds (1f);
Vector3 pos = player.transform.position;
UIManager.Instance.Init (); //黑幕
++GlobeValue.Level; //关卡递增
pos.x = new IntegerVector2 (0, 0).X; //重置玩家位置
pos.z = new IntegerVector2 (0, 0).Z;
player.transform.position = pos;
FindObjectOfType<MyMap> ().InitMap (); //重置地图
player.enabled = true; //恢复玩家移动
Destroy (gameObject); //销毁传送门
}
}
GlobeValue:
保存游戏需要的全局变量。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GlobeValue : MonoBehaviour {
//全局变量
public static int Level = 0; //关卡
public static int Score = 0; //得分
}
A*算法 AStar脚本:
A*寻路算法:
1. 从起点A开始, 把它作为待处理的方格存入一个"开启列表", 开启列表就是一个等待检查方格的列表.
2. 寻找起点A周围可以到达的方格, 将它们放入"开启列表", 并设置它们的"父方格"为A.
3. 从"开启列表"中删除起点 A, 并将起点 A 加入"关闭列表", "关闭列表"中存放的都是不需要再次检查的方格
图中浅绿色描边的方块表示已经加入 "开启列表" 等待检查. 淡蓝色描边的起点 A 表示已经放入 "关闭列表" ,
它不需要再执行检查. 从 "开启列表" 中找出相对最靠谱的方块, 什么是最靠谱? 它们通过公式 F=G+H 来计算.
F = G + H
G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动).
H 表示从指定的方格移动到终点 B 的预计耗费 (H 有很多计算方法, 这里我们设定只可以上下左右移动).
4. 把它从 "开启列表" 中删除, 并放到 "关闭列表" 中.
5. 检查它所有相邻并且可以到达 (障碍物和 "关闭列表" 的方格都不考虑) 的方格. 如果这些方格还不在
"开启列表" 里的话, 将它们加入 "