飞道的博客

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

201人阅读  评论(0)


用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://blog.csdn.net/qq_33789001/article/details/113599262
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场