gameObject.GetComponent<BoxCollider>().enabled = false;
gameObject.GetComponent<BoxCollider>().enabled = false;
前8个课程都是搭建场景的,未写代码
PlayerPrefs.SetInt("score",100);
Float height=183.5f;
①两个迭代器(IEnumerator)交叉调用,完成一个生命周期。
TargetManager代码逻辑梳理
Random.Range(x,y)//随机生成x到y之间的数,不包括y,包括x
协程
//创建save对象(单独写一个save类脚本)并储存当前游戏状态信息
private SaveManager CreatSave()
{
//新建SaveManager对象
SaveManager save = new SaveManager();
//遍历九组位置的怪物组
foreach(GameObject allmonsters in AllMonsters)
{
//新建一个遍历出来的九组MonstersScript对象
MonsterScript monsterScript = allmonsters.GetComponent<MonsterScript>();
//把九组里(每组都有四种类型的怪物)激活的怪物的位置和种类储存下来
if (monsterScript.activeMonster != null)
{
//储存九组里哪组的位置信息
save.MonstersPosition.Add(monsterScript.MonsterPos);
//储存每组当中激活状态的怪物种类
int type = monsterScript.activeMonster.GetComponent<monstercollision>().monsterType;
save.MonstersType.Add(type);
}
}
//把UI面板上的分数和子弹数保存下来(因为只有一个UI分数所以可以适用单例模式)
save.ShootNum = UIScript._instance.shootnum;
save.Grade = UIScript._instance.grade;
//返回SaveManager对象
return save;
}
//二进制方法:存档和读档
private void SaveByBinary()
{
//序列化过程(将Save对象转换为字节流)
//创建Save对象并保存当前游戏状态
SaveManager save = CreatSave();
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//创建一个文件流
FileStream fileStream = File.Create(Application.dataPath + "/MyPro/Save" + "/ByBinary.txt");
//用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
bf.Serialize(fileStream, save);
//保存完成之后关闭文件流
fileStream.Close();
//保存的时候跳出提示信息
if (File.Exists(Application.dataPath + "/MyPro/Save" + "/ByBinary.txt"))
{
UIScript._instance.ShowMessage("保存成功");
}
}
1 .找到围墙模型 调好一个围墙的位置 生成模型
2.围墙模型复制 成一排4个
//两个围墙中间留空放怪物
用unity模型 Cube(一个正方形)修改成 地板形状
放入4个围墙上面 材质黑色
4个围墙加地板 组成一个物体 这个物体复制 上移生成另一层 共3层 最下层加个地板就行
对围墙 地板 加 (Box ...)碰撞器 用来反弹子弹
组件:
Animation:播放管理1animation:初始播放状态
2animation: 次级播放
Box collider:碰撞器
Mash menderer:物体实体
当点击事件在toggle上时,isOn发生改变就调用该方法,而不是根据isOn的值判断
6:40 开始读取游戏
游戏物体的激活与组件的激活不同
得到退出键键盘响应
(Input.GetKeyDown(KeyCode.Escape))
得到鼠标左键摁下的响应
(Input.GetMouseButtonDown(0))
//左键是0,右键是1
private void LoadByJson()
{
string filepath=Application.dataPath+ "/MyPro/Save" + "/ByJson.json";
if (File.Exists(filepath))
{
//创建一个StreamReader(跟存档反着来,这个是专门用来读取json格式文件的函数)
StreamReader sr = new StreamReader(filepath);
//将读取到的内容流赋值给string变量
string jsonstr = sr.ReadToEnd();
//关闭流
sr.Close();
//将读取到的json格式内容流字符串转换为SaveManager对象
//利用jsonMapper将读取到的json格式内容流字符串转换成save对象
SaveManager save = JsonMapper.ToObject<SaveManager>(jsonstr);
UIScript._instance.ShowMessage("成功读取文档");
StartCoroutine("IsMessage");
//通过读档信息重置游戏状态
SetGame(save);
}
else
{
UIScript._instance.ShowMessage("存档文件不存在");
StartCoroutine("IsMessage");
}
}
private void SaveByXML()
{
//创建Save对象并保存当前游戏状态
SaveManager save = CreatSave();
//创建一个XML的文件路径
string filePath = Application.dataPath + "/MyPro/Save" + "/ByXML.txt";
//创建XML文档
XmlDocument Xmldoc = new XmlDocument();
//创建根节点,最上层的节点
XmlElement root = Xmldoc.CreateElement("SaveXML");
//设置根节点中的值(键值对的值)
root.SetAttribute("name", "XML储存信息");
//继续创建根节点(怪物信息---(包含)怪物的位置,种类)
XmlElement Monsters;
XmlElement monstersposition;
XmlElement monsterstype;
//遍历save并将里面保存的数据转换成XML格式内容
for (int i = 0; i < save.MonstersPosition.Count; i++)
{
//设置"怪物信息"节点名字
Monsters = Xmldoc.CreateElement("怪物信息");
//设置InnerText值,怪物位置和种类节点名字
monstersposition = Xmldoc.CreateElement("位置");
monstersposition.InnerText = save.MonstersPosition[i].ToString();
monsterstype = Xmldoc.CreateElement("种类");
monsterstype.InnerText = save.MonstersType[i].ToString();
//设置节点间的层级关系root--Monsters--(monstersposition,monsterstype)
Monsters.AppendChild(monstersposition);
Monsters.AppendChild(monsterstype);
root.AppendChild(Monsters);
}
//设置射击数和分数节点,并且设置层级关系
XmlElement shootNum = Xmldoc.CreateElement("射击数");
shootNum.InnerText = save.ShootNum.ToString();
root.AppendChild(shootNum);
XmlElement grade = Xmldoc.CreateElement("分数");
grade.InnerText = save.Grade.ToString();
root.AppendChild(grade);
//里面子信息都设置好之后,将总root加到xmldoc文档里,并且保存
Xmldoc.AppendChild(root);
Xmldoc.Save(filePath);
if (File.Exists(filePath))
{
UIScript._instance.ShowMessage("保存成功");
StartCoroutine("IsMessage");
}
}
private void LoadByXML()
{
//创建一个XML的文件路径
string filePath = Application.dataPath + "/MyPro/Save" + "/ByXML.txt";
if (File.Exists(filePath))
{
//创建save对象
SaveManager save = new SaveManager();
//创建XML文档出来读取filepath路径文件
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(filePath);
//通过节点名字来获取元素,结果为xmlnodelist类型
XmlNodeList Monsters = xmldoc.GetElementsByTagName("怪物信息");
//遍历所有的Monsters里的节点,并获得子节点和子节点的InnerText
if (Monsters.Count != 0)
{
foreach(XmlNode Monster in Monsters)
{
//遍历"怪物信息"里的位置和种类,并把得到的值保存到save里
XmlNode monsterposition = Monster.ChildNodes[0];
int monsterpositionIndex = int.Parse(monsterposition.InnerText);
save.MonstersPosition.Add(monsterpositionIndex);
//这里的ChildNodes[1]指的是在Monster里第2个节点
XmlNode monstertype = Monster.ChildNodes[1];
int monstertypeIndex = int.Parse(monstertype.InnerText);
save.MonstersType.Add(monstertypeIndex);
}
}
//得到存储的射击数和分数
XmlNodeList shootNum = xmldoc.GetElementsByTagName("位置");
int shootNumIndex = int.Parse(shootNum[0].InnerText);
save.ShootNum = shootNumIndex;
XmlNodeList grade = xmldoc.GetElementsByTagName("分数");
int gradeIndex = int.Parse(grade[0].InnerText);
save.Grade = gradeIndex;
UIScript._instance.ShowMessage("成功读取文档");
StartCoroutine("IsMessage");
//通过读档信息重置游戏状态
SetGame(save);
}
else
{
UIScript._instance.ShowMessage("存档文件不存在");
StartCoroutine("IsMessage");
}
}
/// <summary>
/// 生成怪物
/// </summary>
/// <returns></returns>
IEnumerator AliveTimer()
{
while (true) {
yield return new WaitForSeconds(Random.Range(1, 2));
Debug.Log("生成");
ActiceMoster();
while (true) {
Debug.Log("检测");
if (activeMoster == null) {
break;
}
aliveTime -= Time.deltaTime;
if (aliveTime < 0) {
Debug.Log("死亡");
DeActiceMoster();
}
yield return null;
}
}
}
Json 保存游戏
Save save = CreateSaveGo();
string filePath = Application.dataPath + "StreamingFile" + "/byJson.json";
//利用JsonMapper将save对象转换为Json格式的字符串
string saveJsonStr = JsonMapper.ToJson(save);
//将这个字符串写入到文件中
//创建一个StreamWriter,并将字符串写入文件中
StreamWriter sw = new StreamWriter(filePath);
sw.Write(saveJsonStr);
//关闭StreamWriter
sw.Close();
金口难开没看看没开门,吗,吗,吗,吗,吗,m