打地鼠游戏(2D)学习笔记

制作流程

1. 导入素材、Sorting Layer(分层)和调整相机位置

分类建立文件夹,并导入如下素材:
为做到图层的覆盖,将图层进行分类


调整相机位置

2. 生成洞口

将对象素材拖制成预制体后,编写脚本GameController部分内容:利用二位数组转化成一元数组生成洞口:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameController : MonoBehaviour {public struct Hole {//地洞位置信息public int holeX;public int holeY;}public Hole[] holes;public float intervalPosX = 2, intervalPosY = 1;//地洞之间的横纵间隔设定public GameObject holeObj;public GameObject moleObj;// Use this for initializationvoid Start () {Initmap();}private void Initmap(){Vector2 originalPos = new Vector2(-2, -2);//初始地洞位置holes = new Hole[9];//利用二维数组转换成一维数组设定地洞,如holes[8]即第一个地洞=数组【2,3】for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){holes[i * 3 + j] = new Hole();holes[i * 3 + j].holeX = (int)(originalPos.x + j * intervalPosX);holes[i * 3 + j].holeY = (int)(originalPos.y + i * intervalPosY);//生成地洞Instantiate(holeObj, new Vector3(holes[i * 3 + j].holeX, holes[i * 3 + j].holeY, 0), Quaternion.identity);//Quaternion四元数,表示旋转,可防止万向锁;Quaternion.identity表示默认初始旋转角度}}}// Update is called once per framevoid Update () {}
}
3. 生成地鼠

为地鼠添加Collider,在stuct Hole中加入语句public bool isAppear;用于判断地洞中是否有地鼠,并在Initmap()生成地洞时为其赋值holes[i * 3 + j].isAppear = false;;编写脚本GameController中的MoleAppear()函数:

public void MoleAppear() {int id = UnityEngine.Random.Range(0, 9);//随机选一个地洞生成地鼠while (holes[id].isAppear == true) {id = UnityEngine.Random.Range(0, 9);}Instantiate(moleObj, new Vector3(holes[id].holeX,holes[id].holeY+intervalPosY/3,0), Quaternion.identity);holes[id].isAppear = true;}

在start中用InvokeRepeating("MoleAppear", 0f, AppearFrequency);运行MoleAppear()函数生成地鼠,其中,public float AppearFrequency = 0.5f;,0f表示运行延后秒数;
为预制体Mole添加脚本Mole:

void Start () {Destroy(gameObject, 3f);//每一个预制体生成的对象3秒后销毁}

其中,

Bug
 当9个地洞都有地鼠后,地鼠一直在生成,3秒后地鼠被销毁,但是地洞结构体中的isAppear的值仍然为true,从而MoleAppear()函数进入死循环。
Console
 在struct Hole中加入代码`public GameObject mole;`,并将生成的地鼠对象赋值给它`holes[id].mole = Instantiate(moleObj, new Vector3(holes[id].holeX,holes[id].holeY+intervalPosY/3,0), Quaternion.identity);`;编写CleanMoleState() 函数:
private void CleanMoleState() {//相当于遍历所有地洞,解决地洞都有地鼠后的死循环(每清除一次mole,修改mole所在地洞isAppear的值)for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (holes[i * 3 + j].mole == null) {holes[i * 3 + j].isAppear = false;}}}}

并在void Update()中运行

4. 打击地鼠功能实现

在脚本mole中,将击打后地鼠对象传入public GameObject beatenMole;,并编写OnMouseDown()函数:

void OnMouseDown() {Instantiate(beatenMole, gameObject.transform.position, Quaternion.identity);Destroy(gameObject);}

为预制体Mole_Beaten添加脚本BeatenMole:

void Start () {Destroy(gameObject, 1f);}

此时,产生

逻辑错误
 在成功打击地鼠后,正常状态地鼠销毁并修改所在地洞isAppear值为false,即表示此时所在地洞为空,可再生成新的地鼠了,然而,实际上,打击后的地鼠状态对象Mole_Beaten仍再地洞,即实际所在地洞并不为空;正确状态应为:成功打击地鼠时,对象Mole_Beaten销毁后地洞才变为空。
纠错方法
 设置地鼠数组id与地洞数组id同步,并在成功打击到地鼠后,将hole[id]的mole值由原来的对象Mole替换成对象Mole_Beaten,故修改函数如下:

在脚本Mole中设置id——public int id,并在脚本GameController中初始化id——holes[id].mole.GetComponent<Mole>().id = id;;将脚本GameController传入脚本Molepublic GameController gameController;,初始化gameController = GameObject.FindObjectOfType<GameController>();;通过赋值完成替换gameController.holes[id].mole = Instantiate(beatenMole, gameObject.transform.position, Quaternion.identity);

5. 计时计分功能实现和游戏结束

计时功能:添加UI——TimeCountDownText,调整UI位置;添加空物体Timer作计时器,并为其添加脚本Timer:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Timer : MonoBehaviour {public Text timerText;public float time = 30.0f;public bool canCountDown;//是否开始计时// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (canCountDown == true){time -= Time.deltaTime;timerText.text = "Time: " + time.ToString("F1");//表示保留小数点后一位}}public void CountDown(bool canCountDown) {this.canCountDown = canCountDown;}
}

其中,地图生成的时候开始计时,即在脚本GameController的void Start()中添加语句timer.CountDown(true);

计分功能:添加文本UI——ScoreText,调整UI位置;成功打击地鼠时加分,在对应位置添加如下语句:
using UnityEngine.UI;public class Mole : MonoBehaviour {public Text scoreText;public static int score;// Use this for initializationvoid Start () {scoreText = GameObject.Find("ScoreText").GetComponent<Text>();//需遍历所有游戏对象,耗能大,需小心使用}void OnMouseDown() {score++;scoreText.text = "Score: " + score;}
}
游戏结束:时间小于0时,游戏结束,地鼠不再生成,时间重新归零,不再计时,即在对应位置添加如下语句:

脚本GameController中

void Update () {if (timer.time < 0) {GameOver();}}private void GameOver(){timer.CountDown(false);CancelInvoke();//取消所有因Invoke在进行的动作}

脚本Timer中

public void CountDown(bool canCountDown) {if (canCountDown == false) {time = 0;timerText.text = "GameOver!!!";}}
6. 修改图标图案并添加音效
修改图标图案:添加Image(图像)UI——HarmmerImage,并设置初始图案Hummer,编写脚本ChangeCursor如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class ChangeCursor : MonoBehaviour {public Sprite normalCursor;public Sprite hitCursor;public Image harmerImage;// Use this for initializationvoid Start () {Cursor.visible = false;}// Update is called once per framevoid Update () {if (Input.GetMouseButton(0))//从鼠标左键按下开始保持Hummer_Hit状态,直到放开左键,恢复Hummer状态{harmerImage.sprite = hitCursor;}else {harmerImage.sprite = normalCursor;}harmerImage.rectTransform.position = Input.mousePosition;//效果图位置始终跟随鼠标位置}
}

添加音效:Mole出现时,播放音效appear;成功打击地鼠,即Mole_Beaten出现时,播放音效beaten——分别在预制体Mole和Mole_Beaten中添加AudioSource组件,并传入音效

7. 重新开始游戏

添加Button(按键)UI——RestartButton,调整UI位置,

修改按键内容,编写脚本Restart:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class Restart : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}public void RestartGame(){SceneManager.LoadScene(0);}
}

其中,添加OnClick激活按键功能(调用RestartGame())

8. 导出游戏

总结收获

  1. 学会利用二位数组转换成一位数组设定规律排列多个对象,同时,学会灵活运用结构体等解决Bug;
  2. 加深了对函数InvokeRepeating("MoleAppear", 0f, AppearFrequency);的认识和利用(CancelInvoke(););
  3. 制作游戏时更加严谨,仔细排除运行死循环(死机)和逻辑错误;
  4. 调整UI位置,更加熟练使用按键Button——使用OnClick调用不同组件(脚本)中的函数。

打地鼠游戏(2D)学习笔记相关推荐

  1. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)

    此文写在golang游戏开发学习笔记-创建一个能自由探索的3D世界之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里我们要创建一个简单的2D游戏场景以及配套的人物,并实现人物运动和碰撞检测功能 ...

  2. Unity 2D 学习笔记:游戏实例Sunnyland

    Unity 2D 学习笔记:游戏实例Sunnyland 01安装软件&导入素材 02编辑素材&Tilemap 03图层layer&角色建立 04角色移动 05角色方向& ...

  3. 跳跳涂鸦——向上跳动游戏(学习笔记)

    跳跳涂鸦跳跳涂鸦--向上跳动游戏(学习笔记) 一.需求分析 (一).游戏的主要玩法 1.是一款2D向上跳动游戏 主要玩法:player向上跳动,然后有五种类型的砖块,每个砖块有不同的属性.砖块上面有怪 ...

  4. 小狐狸横版游戏开发学习笔记(上)

    小狐狸横版游戏开发学习笔记(上) 目录 小狐狸横版游戏开发学习笔记(上) 1.关于如何创建Tilemap 2.关于地图格子之间出现间隙的问题 3.如何设置自己想要的控制按键 4.如何解决玩家移动过程中 ...

  5. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十一课:Cocos2D-X网格特效1-3

    [麦可网]Cocos2d-X跨平台游戏开发---学习笔记 第二十一课:Cocos2D-X网格特效1-3 ================================================ ...

  6. RPG游戏Demo学习笔记一

    导航 RPG游戏Demo学习笔记一 UE笔记 -- 一个简单的AI_weixin_52918492的博客-CSDN博客 目录 一.准备资源 二.基础功能 生命值与能量值 创建Widget Bluepr ...

  7. 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作

    在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...

  8. golang游戏开发学习笔记-创建一个能自由探索的3D世界

    此文写在golang游戏开发学习笔记-用golang画一个随时间变化颜色的正方形之后,感兴趣可以先去那篇文章了解一些基础知识,在这篇文章里,我们将创建一个非常简单(只有三个方块)但能自由探索的的3D世 ...

  9. 游戏开发学习笔记——lua脚本语言——安装、汉化与小测试(解决lua运行代码乱码问题)

    游戏开发学习笔记--lua脚本语言--安装.汉化与小测试 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: Lua 是一种轻量小巧的脚本语言,用 ...

  10. Unity游戏框架学习笔记——03基于观察者模式的事件中心

    Unity游戏框架学习笔记--03基于观察者模式的事件中心 基于观察者模式的事件中心 一如既往指路牌:https://www.bilibili.com/video/BV1C441117wU?p=5. ...

最新文章

  1. thinkphp 模型的创建
  2. 一些挺不错的visualstudio主题样式
  3. javascript中涉及到汉字的比较
  4. java 网站计数器_Java Bean实现网页来访计数器
  5. 你必须知道的23个最有用的Elasticseaerch检索技巧
  6. Redis 面试题补充与汇总
  7. eda技术试卷_《EDA技术》试题及答案
  8. OpenStack Juno版本网络节点gre模式配置
  9. 抖音小店无货源,出现退货的情况怎么处理?千万别大意
  10. abp框架java_asp.net core之abp框架
  11. vue 图片写入文字,图片注入文字,图片添加文字
  12. onenote 无法正常使用的解决办法
  13. IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应
  14. 谷歌浏览器被2345主页强制绑定
  15. 【随手记】有趣的面试题 —三人三鬼过河
  16. Java-8-Optional类
  17. 关于babe-loader^8.0.6的配置问题
  18. Android端适老化与无障碍改造
  19. zookeeper 运维管理手册
  20. 索尼电视怎么安装奈飞,详细的图文教程分享

热门文章

  1. javafx 教程_集成JavaFX和Swing
  2. 【源码】二进制非洲秃鹫优化算法
  3. 车牌归属地 API数据接口
  4. 【Linux入门】一文看懂 Linux man 手册
  5. 大象装进冰箱要几步?Python 来解答
  6. 第三方软件测试报告 CMA CNAS标识的区别
  7. 零代码也能玩转指标系列:通过界面也能实现指标的四则运算
  8. 如何看计算机cpu的好坏,cpu主要的性能参数有哪些、怎么看?教你几招轻松看懂CPU性能好坏...
  9. 解决Windows server 2003不认U盘
  10. 计算机电源的功能,电源屏主要功能及工作原理