用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,整個程序比較快,基本完成了核心功能,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256693.html
標籤:其他
