打地鼠

游戏试玩

游玩方法:

  1. 点击 StartGame
  2. 等1s或者几秒的,加载一下游戏框架
  3. 再次点击 StartGame
  4. 再等几秒钟,加载一下游戏内容
  5. 游戏就开了

           

游戏实现要点

  1. 洞孔位置的存储结构和计算
  2. 地鼠出现频率的控制
  3. 地鼠的随机生成和销毁
  4. 游戏时间和分数

流程图

使用的脚本如下:

  • GameController:用于洞口生成以及判断游戏进程
  • Mole:用于控制地鼠的消失以及判断地鼠是否被打到,和积分
  • Beaten:用于地鼠被打到后的销毁工作
  • Timer:用于计时
  • Restart:用于游戏重启
  • ChangeCursor:用于锤子的击打反馈动画

洞孔位置的存储

用二维数组来实现,具体的值为:

当然我们压缩一下:

SharedScreenshot.jpg

我们再设置一下每个的距离,不妨得到:

地鼠出现频率的控制

使用InvokeRepeating()Instantiate()Destory()函数

InvokeRepeating()

可以定时重复做一个函数

三个参数:

  1. (string)methodname
  2. (float)time
  3. (float)repeatRate

解释:先延迟 time 秒,然后按 repeatRate 执行 methodname

Instantiate()

生成一个obj

三个参数:

  1. obj
  2. (Vector3)pos
  3. rotation

解释:生成一个obj,在pos(2D游戏最后一维设置成0),面向rotation(可以设置成Quaternion.identity

返回值:生成的obj对象

Destory()

删除一个obj

两个参数:

  1. object
  2. (float)time

解释:先延迟time秒,然后销毁object

当前脚本的操控对象是 gameObject,或者是this

地鼠销毁并替换图片

  1. Mole上添加Polygon Collider 2D属性
  2. Mole脚本中,添加id公开变量
  3. 使用GameController脚本生成Mole时候,添加Mole脚本的id

    holes[id].mole = Instantiate(moleObj,new Vector3(holes[id].holeX,holes[id].holeY,0),Quaternion.identity);
    holes[id].mole.GetComponent<Mole>().id = id;
  4. Mole脚本的,添加一个GameController对象,并在Start()中对接游戏的GameController对象

    public GameController gameController = GameObject.FindObjectsOfType<GameController>()[0];
  5. Mole脚本中,实现OnMouseDown()函数

    • 替换当前id上的obj
    • 销毁当前的obj
    gameController.holes[id].mole = Instantiate(beatenMole,gameObject.transform.position,Quaternion.identity);
    Destroy(gameObject);
VScode 技巧

想要大批量的修改变量名称时,选中任意一个变量名,按下F2,就可以全部替换

在unity中,一个Instance上,承载多个obj

所以我们需要在创建时通过GetComponent<Mole>()来修改id

所以我们才需要在销毁时先找到GameController,将其holes修改,然后实现

游戏时间

  • 利用Update函数
  • 变量 Time.daltaTime (两针键的时间差)

Time类

通过对Time.deltaTime的累加,就可以得到时间了

然后在游戏结束时,调用CancelInvoke()就可以实现游戏的停止

游戏分数

开一个static变量score

Mole上当出发onMouseDown时,增加score

游戏结束

  • 在GameController中监听时间是否为负,如果为负数,使用CancelInvoke();函数取消当前脚本中的生成,同时Destory()所有的Mole

修改游戏鼠标图案

  1. 在场景中新建一个Image
  2. 创建一个脚本,使用如下函数

    Start()

    Cursor.visible = false;

    同时在更新函数中,通过监听Input.GetMouseButton(0)来查看是否按下鼠标左键,同时修改当前的图片位置为鼠标位置

    hummarImage.rectTransform.position = Input.mousePosition;

重新开始游戏

开一个Button,实现重新加载场景就好了

SceneManager.LoadScene("WhacAMole");
Last modification:March 19th, 2020 at 12:43 am
Compared with money, your comment could inspire me more.
相较于钱财,你的留言更能激发我创作的灵感