使用NGUI制作简易的老虎机

老虎机制作流程其实很简单,首先我们需要了解NGUI的各种组件,对NGUI有一定了解的人一定清楚NGUI有一个组件UIWrap,通过这个组件可以将在ScrollView中的滚动项循环,那么我们的老虎机就是基于NGUI这种好的基础上进行制作的。
我们首先理清思路,制作老虎机必须解决的两个问题:
1.如何让老虎机的图片恰好转到准确的位置:
    我们见到的老虎机都是正好是一张完整的图片出现在老虎机的显示区域,不可能两张图片各占一半的时候就停止了,那么我们就需要解决这个问题。
2.如何记录当前转到的图片:
    我们每转一次老虎机,停止时停止的图片如何获取到,或者图片对应的ID(序号)如何获取到,这对于老虎机的实用性很重要。我们制作老虎机如果不能记录当前转到哪个图片是无法判断老虎机每一列的图片是否一致。

解决这两个问题之前,首先声明一下,我们使用的是UIScrollView组件中的MoveRelative方法,这个方法可以让滑动列表中的项进行滑动,我们的滑动列表制作就调用了这个方法,所以也感谢NGUI开源出来并且公开出了这个方法。

综合以上两个问题,我们有了一种思路,就是将老虎机的图片大小以及老虎机转动显示的栏的大小进行准确设置,我们通过准确的距离判断,来进行图片项的准确停止,那么我们如何判断当前停下的是哪个图片就是我们该考虑的问题了,我曾经想过通过射线碰撞检测图片名来获取图片对应的实体对象进行后续操作,但是后来想到老虎机本质上就是几个随机数,所以我们不妨先随机出和老虎机列数相等数量的随机数,然后每一列都有一个随机数目标,当转到这个数值时,就停止。那么要做到这点,我们就必须给每个图片对应的序列号,当我们随机到某个图片的序列号以后,我们就可以根据序列号来转动老虎机,让老虎机准确的停到对应的序列号。
    
思路有了,具体就是实现了。我们每一列的ScrollView都会挂载一个脚本,用来转动操作和计数。(我的图片长宽都是100)
因为我们的老虎机是逐列停止,所以会有isReturnTo这个属性
//**********************************
//用户:#USERNAME#     QQ:798757741
//时间:#DATATIME#     TEL:15235637384
//**********************************
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScrollColumn : MonoBehaviour
{
    //每次随机到的数
    public int scrollIndex;
    //是否在移动
    public bool isMove = true ;
    //是否轮流到了本滑动列表停止了
    public bool isReturnTo = false ;
    UIScrollView scroll;
    // Use this for initialization
    void Start()
    {
        scroll = GetComponent();
    }
   
   //当前图片索引
    private int m_CurrSprIndex=0;
    //已经走过图片的数量
    private int m_MoveNum = 0;
    //已经走过的距离
    private int m_MoveDis = 0;
    // Update is called once per frame
    void Update()
    {
        if (isMove)
        {
            scroll.MoveRelative( new Vector3(0, 10, 0));
            m_MoveDis += 10;
            if (m_MoveDis % 100 == 0)
            {
                m_MoveNum++;
                m_CurrSprIndex = m_MoveNum % 6;
            }
            if (MechineCtrl.isBeginStop&&isReturnTo)
            {
                //如果当前图标
                if (m_CurrSprIndex == scrollIndex)
                {
                    scroll.MoveRelative( new Vector3(0,-(m_MoveDis%100),0));
                    m_MoveDis -= m_MoveDis % 100;
                    isMove = false ;
                    isReturnTo = false ;
                }
            }
        }
       
    }
}
然后就是在UIROOT上挂载控制全局的脚本
//**********************************
//用户:#USERNAME#     QQ:798757741
//时间:#DATATIME#     TEL:15235637384
//**********************************
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MechineCtrl : MonoBehaviour
{
    ///
    /// 滑动列表数组
    ///
    [SerializeField]
    private UIScrollView[] m_ScrollArr;
    public static bool isBeginStop = false ;
    //避免多次操作造成混乱
    public static bool isBusy = false ;
    void Start()
    {
        Init();
    }
    ///
    /// 初始化随机数
    ///
    private void Init()
    {
        for ( int i = 0; i < m_ScrollArr.Length; i++)
        {
            m_ScrollArr[i].transform.GetComponent().scrollIndex = Random.Range(0, 6);
            Debug.Log(m_ScrollArr[i].transform.GetComponent().scrollIndex);
        }
    }
   //轮流停止
    private IEnumerator ReturnToStop()
    {
        isBusy = true ;
        for ( int i = 0; i < m_ScrollArr.Length; i++)
        {
            yield return new WaitForSeconds(0.2f);
            m_ScrollArr[i].transform.GetComponent().isReturnTo = true ;
        }
        isBusy = false ;
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)&&!isBusy)
        {
            Debug.Log( "点击左键" );
            isBeginStop = true ;
            StartCoroutine(ReturnToStop());
        }
        if (Input.GetMouseButtonDown(1)&&!isBusy)
        {
            isBeginStop = false ;
            for ( int i = 0; i < m_ScrollArr.Length; i++)
            {
                m_ScrollArr[i].transform.GetComponent().isMove = true ;
            }
            Init();
        }
    }
}
这样,一个简易的老虎机就做好了,我们可以将随机到的数字进行一系列操作,比如随机到的数字都相等,就可以获得某些奖励,或者加一些shader特效之类的等等都可以,本文主要介绍一下主要逻辑,如有问题欢迎讨论!

你可能感兴趣的:(unity)