unity3d实现水果机(随机)跑马灯效果

unity3d实现水果机(随机)跑马灯效果
初次发文,多多谅解。美工没做,都是网上的图片。
思路!
一、随机产生不等页面布局【跑马灯】(目前可实现22个和18个…)
二、随机在跑马灯上产生不一样的图片【不同于现实中固定的大奖】
三、图片会逐步变大变小变色
四、随机产生跑马效果时长
五、结算分值。
图一
整体效果
unity3d实现水果机(随机)跑马灯效果_第1张图片
第一步解决生成图片
unity3d实现水果机(随机)跑马灯效果_第2张图片
注意每个grid的位置 做到上下左右对其的标准,因为生成的图片会用grid自动排序所以要摆放好位置才能起到连贯性。
图二添加ugui ,用grid的形式存储图片
导入需要变换的图片
unity3d实现水果机(随机)跑马灯效果_第3张图片

unity3d实现水果机(随机)跑马灯效果_第4张图片
图四、grid的参数设置
unity3d实现水果机(随机)跑马灯效果_第5张图片
图五、制作预制图片(因为这个图片是生成的所以要预制)
**实现的效果:**运行脚本每个预制体增加脚本(运行时产生大、变色的效果)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class tu_jiaoben : MonoBehaviour {
Vector2 tu_daxiao;
// Use this for initialization
void Start () {
tu_daxiao = this.gameObject.transform.localScale;
}
public bool ji_huo=false;
public float TimeA;
float DTime = 0;
// Update is called once per frame
void Update () {

    if (ji_huo)
    {
        this.gameObject.transform.localScale = new Vector2(tu_daxiao.x * 1.2f, tu_daxiao.y * 1.2f);
        this.GetComponent().color = Color.red;
        DTime += Time.deltaTime;
        if (DTime > TimeA)
        {
            DTime = 0;
            this.gameObject.transform.localScale = tu_daxiao;
            this.GetComponent().color = Color.white;//赢得积分
            ji_huo = false;
        }
    }
}
public string wen_ben="";
/// 
/// 变大的操作
/// 
public void da()
{
    this.gameObject.transform.localScale = new Vector2(tu_daxiao.x * 1.2f, tu_daxiao.y * 1.2f);
    this.GetComponent().color = Color.red;
    wen_ben = this.GetComponentInChildren().text;
}

}
第二步、脚本生成页面布局
有了预制图片、页面布局Grid那么就要生成布局了
以下代码中包含生成布局、点击旋转(跑马)、投注、得分显示、总分显示、投注button、计算…我就不一一分开了 因为这是一个脚本。
实现的效果:
点击下方跑【投注按钮】、点击中间【水果转转】运行。
图片会变大、变色、恢复,进行到下一个图片…然后依次,直到停止旋转。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
///
/// 转盘
///
public class ZhuanPan : MonoBehaviour {
///
/// 脚本单例模式
///
public static ZhuanPan _insert;
///
/// 用于保存 图片的大小
///
Vector2 tu_daxiao;
///
/// 存储 4个模块
///
public GridLayoutGroup []Grid;
///
/// 预制体(图片)
///
public Image Tu;

void Start () {
    _insert = this;
    PanDuan();
}
void Update () {
}
/// 
/// 总共是四组
/// 
int diji_zu=0;
/// 
/// 随机产生滚动的的时间长短
/// 
float suiji_shijian;

/// 
/// 生成横的格子数
/// 
int heng_shu;
/// 
/// 生成竖的格子数
/// 
int Shu_Shu;
/// 
/// 用于变换 【难易度】多少格子
/// 
int Gao_Di=1;
/// 
/// 时停止还是运行
/// 
bool S_P = false;

/// 
/// 中奖得分
/// 
public Text D_JiFenText;
/// 
/// 点击后  将 获得的积分 跳到 总积分中
/// 
public void GouMaiJiFen()
{
    Z_jifen_value = 10;
    Z_jifen_value += DeFenValue;
    DeFenValue = 0;
    D_JiFenText.text = "0";
    Z_JiFenText.text = Z_jifen_value.ToString();
}
/// 
/// 投注 多少
/// 
int LingV = 0;
int MangV = 0;
int PingV = 0;
int XiV = 0;
int XingV = 0;
int ChengV = 0;
/// 
/// 点击谁 投注的text 传过来
/// 
Text LingT;
Text MangT;
Text PingT;
Text XiT;
Text XingT;
Text ChengT;

/// 
/// 押注的函数(点击哪个button 就现将  button名称,点击的值,button下的显示文本)
/// 
public void YaZhu(string aaa,int value,Text txt)
{
    ///通过判断将点击的button中的值类型重新赋予
    switch (aaa)
    { 
        case "Button (0)":
            LingV=value;
            LingT = txt;
            break;
        case "Button (1)":
            MangV = value;
            MangT = txt;
            break;
        case "Button (2)":
            PingV = value;
            PingT = txt;
            break;
        case "Button (3)":
            XiV = value;
            XiT = txt;
            break;
        case "Button (4)":
            XingV = value;
            XingT = txt;
            break;
        default:
            ChengV = value;
            ChengT = txt;
            break;
    }
}
/// 
/// 得分值
/// 
int DeFenValue;
/// 
/// 得分
/// 
/// 
public void GetJiang(string ii)
{
    print(ii);
    int aa = int.Parse(ii);
    int deFen = 0;
    switch (ii)
    {
        case "1":
            deFen = ChengV * aa;
            break;
        case "2":
            deFen = MangV * aa;
            break;
        case "10":
            deFen = PingV * aa;
            break;
        case "30":
            deFen = LingV * aa;
            break;
        case "50":
            deFen = XingV * aa;
            break;
        case "100":
            deFen = XiV * aa;
            break;
        default:
            deFen = 0;
            break;

    }

    DeFenValue += deFen;
    print(DeFenValue);
    D_JiFenText.text = DeFenValue.ToString();

    XingV = 0;
    LingV = 0;
    MangV = 0;
    PingV = 0;
    XiV = 0;
    ChengV = 0;
    if (LingT != null)
    {
        LingT.gameObject.transform.parent.gameObject.GetComponent().textV = 0;
        LingT.text = "0";
    }
    if (MangT != null)
    {
        MangT.gameObject.transform.parent.gameObject.GetComponent().textV = 0;
        MangT.text = "0";
    }
    if (PingT != null)
    {
        PingT.gameObject.transform.parent.gameObject.GetComponent().textV = 0;
        PingT.text = "0";
    } if (XiT != null)
    {
        XiT.gameObject.transform.parent.gameObject.GetComponent().textV = 0;
        XiT.text = "0";
    } if (XingT != null)
    {
        XingT.gameObject.transform.parent.gameObject.GetComponent().textV = 0;
        XingT.text = "0";
    } if (ChengT != null)
    {
        ChengT.gameObject.transform.parent.gameObject.GetComponent().textV = 0;
        ChengT.text = "0";
    }

}


#region 生成
/// 
/// 生成图片  这里决定生成多少格子,布局的大小
/// 
public void PanDuan()
{
    if (Gao_Di == 1)
    {
        ShengCheng(6, 0, 0.8f);
        ShengCheng(6, 2, 0.8f);
        ShengCheng(5, 1, 0.8f);
        ShengCheng(5, 3, 0.8f);
    }
    else
    {
        ShengCheng(5, 0,1f);
        ShengCheng(5, 2, 1);
        ShengCheng(4, 1, 1);
        ShengCheng(4, 3, 1);
    }
    LiPin();
}
/// 
/// 所有图片
/// 
public List All_Tu;
/// 
/// 循环生成
/// 
/// 
/// 
public void ShengCheng(int a,int b,float c)
{
    for (int i = 0; i < a; i++)
    {
        GameObject IGa = Instantiate(Tu.gameObject);///生成图片
        IGa.gameObject.transform.parent = Grid[b].gameObject.transform;///图片位置
        IGa.gameObject.transform.localScale = new Vector3(c, c, c);//图片大小
        All_Tu.Add(IGa);
    }
}
/// 
/// 存储 图片(这些图片用于 生成随机的图片显示)
/// 
public Sprite Xing;
public Sprite Ling;
public Sprite Ping;
public Sprite Mang;
public Sprite Xi;
public Sprite Knob;
public Sprite Cheng;

/// 
/// 积分
/// 
public Text Z_JiFenText;
/// 
/// 总积分
/// 
public int Z_jifen_value;
/// 
/// 判断积分
/// 
/// 
public bool JiFen()
{
    Z_jifen_value = int.Parse(Z_JiFenText.text);
    if (Z_jifen_value > 0)
    {
        Z_jifen_value--;
        Z_JiFenText.text = Z_jifen_value.ToString();
        return true;
    }
    else
    {
        TiShi_Txt.gameObject.transform.parent.gameObject.SetActive(true);
        TiShi_Txt.text = "已经没有积分";
        Invoke("TiShi_Cang", 2f);
        return false;
    }
    
}
/// 
/// 判断是否 投注
///  购买积分
/// 
public bool Pan_YaZhu()
{
    if(LingV>0||MangV>0||PingV>0||XiV>0||XingV>0||ChengV>0)
    {
        return true;
    }
    return false;
}
/// 
/// 生成礼品图标
/// 
public void LiPin()
{
    DaLuan_shuzi();

    for (int i = 0; i < luan_value.Count; i++)
    {
        switch (luan_value[i])
        { 
            case 1:
                All_Tu[i].GetComponentInChildren().text = "50";
                All_Tu[i].GetComponent().sprite = Xing;
                break;
            case 2:
                All_Tu[i].GetComponentInChildren().text = "30";
                All_Tu[i].GetComponent().sprite = Ling;
                break;
            case 3:
                All_Tu[i].GetComponentInChildren().text = "10";
                All_Tu[i].GetComponent().sprite = Ping;
                break;
            case 4:
                All_Tu[i].GetComponentInChildren().text = "2";
                All_Tu[i].GetComponent().sprite = Mang;
                break;
            case 5:
                All_Tu[i].GetComponentInChildren().text = "100";
                All_Tu[i].GetComponent().sprite = Xi;
                break;

            case 6:
                YiBanJiang(i);
                break;
            case 7:
                YiBanJiang(i);
                break;
            case 8:
                YiBanJiang(i);
                break;
            case 9:
                YiBanJiang(i);
                break;
            case 10:
                YiBanJiang(i);
                break;
            default:
                 All_Tu[i].GetComponentInChildren().text = "0";
                 All_Tu[i].GetComponent().sprite = Knob;
                break;
        }
    }
   
}
void YiBanJiang(int aa)
{
    All_Tu[aa].GetComponentInChildren().text = "1";
    All_Tu[aa].GetComponent().sprite = Cheng;
}
List luan_value;
/// 
/// 随机判断数字重复
/// 
public void DaLuan_shuzi()
{
    luan_value = new List();

    while (luan_value.Count < All_Tu.Count)
    {
        int aa = Random.Range(0, All_Tu.Count);
        if (!luan_value.Contains(aa))
        {
            luan_value.Add(aa);
        }
        
    }
    
}

#endregion
#region 点击
/// 
/// 提示 文本
/// 
public Text TiShi_Txt;
/// 
/// 点击开始
/// 
public void PlayerButton()
{
    if (Pan_YaZhu())
    {

        if (S_P == false)
        {
            //Z_jifen_value--;
            //Z_JiFenText.text = Z_jifen_value.ToString();
            suiji_shijian = Random.Range(0.3f, 0.6f);//随机生成滚动的时长
            diji_zu = 0;//确定是第几组图片
            sudu = 0.1f;//起始速度
            S_P = true;//运行跑状态
            FenPei();
        }
    }
    else
    {
        TiShi_Txt.gameObject.transform.parent.gameObject.SetActive(true);
        TiShi_Txt.text = "没有进行投注";
        Invoke("TiShi_Cang", 2f);
    }
   
}
/// 
/// 提示隐藏
/// 
public void TiShi_Cang()
{
    TiShi_Txt.gameObject.transform.parent.gameObject.SetActive(false);
}
/// 
/// 开始跑 到每一个照片组内一次奔跑
/// 
public void FenPei()
{
    if (S_P)
    {
        switch (diji_zu)
        {
            case 0:
                StartCoroutine(showA(Grid[0], true));
                break;
            case 1:
                StartCoroutine(showA(Grid[1], true));
                break;
            case 2:
                StartCoroutine(showA(Grid[2], false));
                break;
            case 3:
                StartCoroutine(showA(Grid[3], false));
                break;

        }
        diji_zu++;//跑完一个这里增加一个 转回来就到下一组

        if (diji_zu >= 4)//如果大于4 就是跑完了  那么就是0要重头跑
        {
            diji_zu = 0;
        }

    }
    
}
/// 
/// 中奖的图片
/// 
public tu_jiaoben zhong_obj;
/// 
/// 跑的起始速度 会慢慢增加,也会慢慢慢下来
/// 
float sudu = 0.2f;
/// 
/// 携程  父对象Grid  正排序还是反排序
/// 
/// 
IEnumerator showA(GridLayoutGroup gas,bool oo)
{
    if (oo)
    {
        for (int i = 0; i < gas.transform.childCount; i++)
        {
            //gas.transform.GetChild(i).gameObject.GetComponent().TingLiu = false;
            gas.transform.GetChild(i).gameObject.GetComponent().TimeA = sudu;
            gas.transform.GetChild(i).gameObject.GetComponent().ji_huo = true;
            //gas[i].gameObject.GetComponent().ji_huo = true;
            sudu += 0.005f;
            //内部循环计算
            //在这里的yield会让改内部循环计算每帧执行一次,而不会等待10000次循环结束后再跳出
            yield return new WaitForSeconds(sudu);
            if (sudu >= suiji_shijian)
            {
                gas.transform.GetChild(i).gameObject.GetComponent().da();
                zhong_obj = gas.transform.GetChild(i).gameObject.GetComponent();
                sudu = 0;
                GetJiang(gas.transform.GetChild(i).gameObject.GetComponent().wen_ben);
                S_P = false;

            }
        }
    }
    else
    {
        int jiji = gas.transform.childCount;
       
        for (int i = jiji-1; i >=0; i--)
        {
            //gas.transform.GetChild(i).gameObject.GetComponent().TingLiu = false;
            gas.transform.GetChild(i).gameObject.GetComponent().TimeA = sudu;
            gas.transform.GetChild(i).gameObject.GetComponent().ji_huo = true;
            //gas[i].gameObject.GetComponent().ji_huo = true;
            sudu += 0.005f;
            //内部循环计算
            //在这里的yield会让改内部循环计算每帧执行一次,而不会等待10000次循环结束后再跳出
            yield return new WaitForSeconds(sudu);
            if (sudu >= suiji_shijian)
            {
                gas.transform.GetChild(i).gameObject.GetComponent().da();
                zhong_obj = gas.transform.GetChild(i).gameObject.GetComponent();
                sudu = 0;
                GetJiang(gas.transform.GetChild(i).gameObject.GetComponent().wen_ben);
                S_P = false;
            }
        }
    }
    
    FenPei();
    //如果取消内部的yield操作,仅在for循环外边写yield操作,则会执行完10000次循环后再结束,相当于直接调用了一个函数,而非协程。

}
#endregion

}
第三步、制作投注效果
unity3d实现水果机(随机)跑马灯效果_第6张图片
图六、制作投注按钮
**实现效果:**点一下加一分、总分减少一分。
购买积分按钮、对总分增加10分、得分转移到总分。
以下脚本挂在 下注button上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class YaZhu_JiaoBen : MonoBehaviour {

// Use this for initialization
void Start () {
    transform.gameObject.GetComponentInChildren().text = textV.ToString();
}

// Update is called once per frame
void Update () {
	
}
public int textV = 0;
/// 
/// 点击压住
/// 
public void DianJi()
{
    if (ZhuanPan._insert.JiFen())
    {
        textV++;
        transform.gameObject.GetComponentInChildren().text = textV.ToString();

        ZhuanPan._insert.YaZhu(transform.gameObject.name, textV, transform.gameObject.GetComponentInChildren());
    }
}

}
未完善的功能
1.背景音乐没有
2.在运转中依然可以点击【水果转转】和【下注button】,不过这两个很好解决。
3.充值界面需要服务器,这里服务器功能脚本就不展示了。
4.不能做假。想实现这个功能,初步的想法是增加随机旋转的时长来跳过大奖

你可能感兴趣的:(unity3d,游戏)