您当前的位置: 首页 >  游戏

用Unity3d仿制前几日爆红的“合成大西瓜”小游戏源码

发布时间:2021-02-03 13:24:02 ,浏览量:5

用Unity3d仿制前几日爆红的“合成大西瓜”小游戏源码
  • 前言
  • 运行效果
  • 实现构思
  • 实现过程
    • 编写脚本
      • 水果类
      • 水果控制类
      • 结束线类
      • 中心类
    • 配置工程
      • 配置“水果”
      • 配置脚本的节点
  • 工程源码
  • 结语
用Unity3d仿制前几日爆红的“合成大西瓜”小游戏源码) 前言

前几天这个大西瓜游戏特别火,同时微信小游戏也迅速冒出各种同类产品,玩了几局感觉是不错的,觉得这个玩意肯定没那么难,昨晚就想着使用Unity3d实现一下试试。整个编写过程花了将近4个小时。 没有制作任何的特效、UI和动画等,基本都是系统默认组件实现。 但是功能基本完善,大厅、计分、结束检测等都实现了。 代码量将近150行,编写起来较快,就是制作场景和测试花些时间。

运行效果

先看看效果吧: 在这里插入图片描述

实现构思

定义水果类型,主要便于同类碰撞合并判断,以及合成的下一级生成使用。 使用2d实现,即UGUI,同时通过2d圆形碰撞体和 2d钢体作为碰撞检测,同类的就要发生合成。

通过鼠标左键进行扔下水果的操作,按下拖拽上部水果跟随左右移动,释放左键放下水果。

基本思路就是上面这些!

实现过程

## 搭场景 左右下方分别用一根带碰撞的image线围起来,这样水果不会往下掉了。 上部用根红色的image线,带碰撞使用触发器,主要判断结束。 制作水果,用一个圆形图,2d圆形碰撞体和 2d钢体。 其他UI无非按钮和文字,看图便知不再赘述。 大厅场景: 在这里插入图片描述

游戏场景: 在这里插入图片描述

结束场景:

在这里插入图片描述

编写脚本 水果类

定义每个“水果”的参数,等级、重量、颜色和大小等。

using UnityEngine; [System.Serializable] public class Item { public int Lv; public int Mass; public Color color; public float Scale; } 
水果控制类

只有一个碰撞检测判断功能

using UnityEngine; public class ItemCtrl : MonoBehaviour { public int lv; public bool Coled = false; //已碰撞 void OnCollisionEnter2D(Collision2D collision) { ItemCtrl otherItm = collision.collider.gameObject.GetComponent<ItemCtrl>(); if (otherItm == null) return; if (!Coled && otherItm != null && otherItm.lv == lv) { if (Center.instance != null && Center.instance.Items.Length > lv +1) { otherItm.Coled = true; this.Coled = true; Vector3 pos = (this.transform.localPosition + collision.collider.transform.localPosition) / 2; Center.instance.GenerateItem(pos, lv + 1); Destroy(this.gameObject); Destroy(collision.collider.gameObject); } } } } 
结束线类

结束判定的触发类

using UnityEngine; public class EndLine : MonoBehaviour { float EndTime = 0; void OnTriggerEnter2D(Collider2D collision) { ItemCtrl tc = collision.GetComponent<ItemCtrl>(); if (tc != null) EndTime = Time.time; } void OnTriggerStay2D(Collider2D collision) { ItemCtrl tc = collision.GetComponent<ItemCtrl>(); if (tc != null && Time.time - EndTime >= 3 && Center.instance != null) Center.instance.GameOver(); } } 
中心类

核心逻辑,计分、UI控制,UI按钮事件等都在这里实现

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Center : MonoBehaviour { public Transform ItemsParent; public Item[] Items; public Text GNum, Enum; public GameObject ItemMod,StartCanvas,GameCanvas,OverCanvas; float ItemPosY = 470; GameObject NextItem = null; bool gaming = false; public static Center instance = null; int score = 0; void Start() { GameCanvas.SetActive(false); OverCanvas.SetActive(false); instance = this; ShowNextItem(); } void Update() { if (gaming && NextItem != null) { if (Input.GetMouseButtonUp(0)) { NextItem.GetComponent<Rigidbody2D>().simulated = true; NextItem = null; ShowNextItem(); } if (Input.GetMouseButton(0)) { float x = Input.mousePosition.x - Screen.width / 2f; NextItem.transform.localPosition = new Vector3(x, ItemPosY, 0); } } } void ShowNextItem() { int idx = Random.Range(0, 4); GameObject go = GameObject.Instantiate<GameObject>(ItemMod); go.transform.SetParent(ItemsParent); go.transform.localPosition = new Vector3(0, ItemPosY, 0); go.transform.localScale = Vector3.one * Items[idx].Scale; go.GetComponent<Rigidbody2D>().mass = Items[idx].Mass; go.GetComponent<Image>().color = Items[idx].color; ItemCtrl itmctrl = go.AddComponent<ItemCtrl>(); itmctrl.lv = idx; NextItem = go; } public void GenerateItem(Vector3 pos,int lv) { GameObject go = GameObject.Instantiate<GameObject>(ItemMod); go.transform.SetParent(ItemsParent); go.transform.localPosition = pos; go.transform.localScale = Vector3.one * Items[lv].Scale; go.GetComponent<Rigidbody2D>().mass = Items[lv].Mass; go.GetComponent<Rigidbody2D>().simulated = true; go.GetComponent<Image>().color = Items[lv].color; ItemCtrl itmctrl = go.AddComponent<ItemCtrl>(); itmctrl.lv = lv; score += lv; GNum.text = score.ToString() ; } public void Play() { gaming = true; score = 0; GNum.text = "0"; for (int i = 0; i < ItemsParent.childCount; i++) Destroy(ItemsParent.GetChild(i).gameObject); ShowNextItem(); StartCanvas.SetActive(false); GameCanvas.SetActive(true); OverCanvas.SetActive(false); } public void BackHall() { StartCanvas.SetActive(true); GameCanvas.SetActive(false); OverCanvas.SetActive(false); } public void GameOver() { gaming = false; Enum.text = score.ToString(); OverCanvas.SetActive(true); } } 
配置工程

将脚本挂接在节点上后,就可以进行最后一步,配置这些参数、事件等。

配置“水果”

这个容量和参数自行修改,这里配置了12个,你也可以随意配置,可以改的很变态。 在这里插入图片描述

只不过这里要注意一下顺序和lv最好别有跳跃的情况。

配置脚本的节点

公用变量节点就是拖拖拽拽的,也没啥了。

按钮事件也是拖拖拽拽,再选一下,也不说了。

工程源码

CSDN下载:https://download.csdn.net/download/qq_33789001/14999163 GitHub:https://github.com/LeeLexHong/ShuiGuoHeCheng/tree/master 方便的话留下你们的小星星!!

结语

功能较为简单,工程压缩包也仅有27KB,整个过程比较快,基本完成了核心功能。

关注
打赏
1688896170
查看更多评论

暂无认证

  • 5浏览

    0关注

    115984博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0501s