用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();
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();
if (tc != null)
EndTime = Time.time;
}
void OnTriggerStay2D(Collider2D collision)
{
ItemCtrl tc = collision.GetComponent();
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().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(ItemMod);
go.transform.SetParent(ItemsParent);
go.transform.localPosition = new Vector3(0, ItemPosY, 0);
go.transform.localScale = Vector3.one * Items[idx].Scale;
go.GetComponent().mass = Items[idx].Mass;
go.GetComponent().color = Items[idx].color;
ItemCtrl itmctrl = go.AddComponent();
itmctrl.lv = idx;
NextItem = go;
}
public void GenerateItem(Vector3 pos,int lv)
{
GameObject go = GameObject.Instantiate(ItemMod);
go.transform.SetParent(ItemsParent);
go.transform.localPosition = pos;
go.transform.localScale = Vector3.one * Items[lv].Scale;
go.GetComponent().mass = Items[lv].Mass;
go.GetComponent().simulated = true;
go.GetComponent().color = Items[lv].color;
ItemCtrl itmctrl = go.AddComponent();
itmctrl.lv = lv;
score += lv;
GNum.text = score.ToString() ;
}
public void Play() {
gaming = true;
score = 0;
GNum.text = "0";
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?