unity3d实现水果机(随机)跑马灯效果
初次发文,多多谅解。美工没做,都是网上的图片。
思路!
一、随机产生不等页面布局【跑马灯】(目前可实现22个和18个…)
二、随机在跑马灯上产生不一样的图片【不同于现实中固定的大奖】
三、图片会逐步变大变小变色
四、随机产生跑马效果时长
五、结算分值。
图一
整体效果
第一步解决生成图片
注意每个grid的位置 做到上下左右对其的标准,因为生成的图片会用grid自动排序所以要摆放好位置才能起到连贯性。
图二添加ugui ,用grid的形式存储图片
导入需要变换的图片
图四、grid的参数设置
图五、制作预制图片(因为这个图片是生成的所以要预制)
**实现的效果:**运行脚本每个预制体增加脚本(运行时产生大、变色的效果)
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
}
第三步、制作投注效果
图六、制作投注按钮
**实现效果:**点一下加一分、总分减少一分。
购买积分按钮、对总分增加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.不能做假。想实现这个功能,初步的想法是增加随机旋转的时长来跳过大奖