Unity EasyToutch5X 实现一个简单的手指跑马灯游戏

前几天突然翻到14年高中上体育课时的一张合照,人数不多,却占据了我几乎占据了我高中的三年时光。满满的思绪乱飞。因为高中毕业之后就没再联系过,一直静静地躺在列表中,所以就联系了高中时期的一部分同学准备聚一聚,老同学不愧是老同学,几乎第一句就是问:”老黑,泥白了没。(由于高中时期比较偏黑,所以人送外号老黑,然后一直沿用至今,后无期限)”,其实我特想统一回复一下,“白了,白了,谢谢大家的热心关爱。(然后又开始叫我老白了,总少不了被黑)”,所以为了这个饭局的娱乐性,我就抽空写了几个喝酒的小游戏(掷骰子,单挑,比三张,手指炫舞(都是自己瞎起的)),只为玩的开心。 然后觉得这个手指炫舞值得记录一下,所以就做做笔记。

  基本玩法就是手指放在手机屏幕上,然后等待倒计时结束点击开始,开始循环所有已经存在在手机屏幕上的手指(跑马灯效果),等待循环结束被抽中的手指会一直闪烁(也是最后的幸运玩家,罚酒多少自己喽(*^▽^*)),然后点击清理开始下一句游戏。

  下面就是实现的脚本,只需一个脚本,所以新建一个脚本。然后编写实现代码。

 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;

public class LoopGame : MonoBehaviour
{
    public Text ShowText;
    private Button BtnClear;
    private Button BtnReturn;
    class MyFinger
    {
        public int id = -1;
        public Touch touch;

        // 手指集合
        static List<MyFinger> fingers = new List<MyFinger>();
        
        static public List<MyFinger> Fingers
        {
            get
            {
                if (fingers.Count == 0)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        MyFinger mf = new MyFinger();
                        mf.id = -1;
                        fingers.Add(mf);
                    }
                }
                return fingers;
            }
        }
    }

    private Button BtnStart;
    //手指点击后生成的预设集合
    GameObject[] marks = new GameObject[8];
    //预设
    public GameObject markPrefas = null;

 
    void Start()
    {
        BtnStart = transform.Find("BtnStart").GetComponent<Button>();
        BtnStart.onClick.AddListener(OnClick);
        BtnClear = transform.Find("BtnClear").GetComponent<Button>();
        BtnClear.onClick.AddListener(OnClear);

        BtnReturn = transform.Find("BtnReturn").GetComponent<Button>();
        BtnReturn.onClick.AddListener(BtnReturnClick);

        //先生成全部手指预设
        for (int i = 0; i < MyFinger.Fingers.Count; i++)
        {
            GameObject mark = Instantiate(markPrefas, Vector3.zero, Quaternion.identity) as GameObject;
            mark.transform.parent = this.transform;
            mark.SetActive(false);
            marks[i] = mark;
        }

        ShowText.text = "已就绪,放上手指开始";
        BtnStart.gameObject.SetActive(false);
        BtnClear.gameObject.SetActive(false);
        BtnReturn.gameObject.SetActive(true);
    }
    private void BtnReturnClick()
    {
        Application.LoadLevel("Main");
    }
    //清理按钮
    private void OnClear()
    {
        isBreak = true;
        StartCoroutine(startTimer("清理战场", 3));
    }

    Touch[] touches;
    bool isTimer = true;
    void Update()
    {
        if (isGoOn)
        {
            //获取手指数量
            touches = Input.touches;
            if (touches.Length > 0)
            {
                if (isTimer)
                {
                    isTimer = false;
                    BtnReturn.gameObject.SetActive(false);
                    StartCoroutine(startTimer("倒计时", 7));
                }
                //遍历全部手指
                foreach (MyFinger mf in MyFinger.Fingers)
                {
                    if (mf.id == -1)
                    {
                        continue;
                    }
                    bool isSign = false;
                    //一直更新是否有手指点击
                    foreach (Touch t in touches)
                    {
                        Debug.Log(t.fingerId + "手指ID");
                        if (mf.id == t.fingerId)
                        {
                            isSign = true;
                        }
                    }
                    //没有则标记
                    if (isSign == false)
                    {
                        mf.id = -1;
                    }
                }

                //遍历已经存在的手指
                foreach (Touch t in touches)
                {
                    bool isSign = false;
                    //存在   更新手指
                    foreach (MyFinger mf in MyFinger.Fingers)
                    {
                        if (t.fingerId == mf.id)
                        {
                            isSign = true;
                            mf.touch = t;
                            break;
                        }
                    }

                    //不存在  添加手指
                    if (!isSign)
                    {
                        foreach (MyFinger mf in MyFinger.Fingers)
                        {
                            if (mf.id == -1)
                            {
                                mf.id = t.fingerId;
                                mf.touch = t;
                                break;
                            }
                        }
                    }
                }

                //手指存储完毕 响应对应的手指状态
                for (int i = 0; i < MyFinger.Fingers.Count; i++)
                {
                    MyFinger mf = MyFinger.Fingers[i];
                    if (mf.id != -1)
                    {
                        //得到手指的状态

                        if (mf.touch.phase == TouchPhase.Began)
                        {
                            marks[i].SetActive(true);
                            marks[i].transform.position = GetWorlfPos(mf.touch.position);

                        }
                        else if (mf.touch.phase == TouchPhase.Moved)
                        {
                            marks[i].transform.position = GetWorlfPos(mf.touch.position);

                        }
                        else if (mf.touch.phase == TouchPhase.Ended)
                        {
                            marks[i].SetActive(false);
                            marks[i].transform.position = GetWorlfPos(mf.touch.position);
                        }
                        else if (mf.touch.phase == TouchPhase.Stationary)//静止状态
                        {
                        }
                        else if (mf.touch.phase == TouchPhase.Canceled)
                        {
                            marks[i].gameObject.SetActive(false);
                        }
                    }
                    else
                    {

                    }
                }
            }
        }
    }

    //开始计时
    IEnumerator startTimer(string str, float t)
    {
        BtnClear.gameObject.SetActive(false);
        BtnStart.gameObject.SetActive(false);
        while (true)
        {
            t -= 1;
            ShowText.text = str + t.ToString();
            Debug.Log(Time.deltaTime + "倒计时" + t);
            yield return new WaitForSeconds(1f);
            if (t <= 0)
            {
                switch (str)
                {
                    case "倒计时":
                        BtnStart.gameObject.SetActive(true);
                        isGoOn = false;
                        ShowText.text = "";
                        break;
                    case "清理战场":
                        isGoOn = true;
                        isTimer = true;
                        isBreak = false;
                        isStartLoop = false;
                        marks[loopIndex].gameObject.SetActive(false);
                        ShowText.text = "已就绪,放上手指等待开始";
                        BtnReturn.gameObject.SetActive(true);
                        break;
                    default:
                        break;
                }
                break;
            }
        }
    }


    //局数
    int randomNum;
    //速度
    int timer = 0;
    //结果下标
    int loopIndex;
    //结果
    int result;
    //统计
    int total = 0;

    bool isGoOn = true;
    //开始点击事件
    public void OnClick()
    {

        BtnReturn.gameObject.SetActive(false);
        timer = 0;
        total = 0;
        randomNum = UnityEngine.Random.Range((marks.Length / 2), marks.Length);
        result = UnityEngine.Random.Range(((marks.Length / 2) * (randomNum / 2)), marks.Length * (randomNum / 2));
        loopIndex = result % touches.Length;
        StartCoroutine(startLoop());
        Debug.Log(randomNum + "点击开始按钮" + result + "下标 " + loopIndex);
        BtnStart.gameObject.SetActive(false);

    }

    bool isStartLoop = false;
    //开始跑马灯
    IEnumerator startLoop()
    {
        for (int j = 0; j < result; j++)
        {
            for (int i = 0; i < touches.Length; i++)
            {
                if (total == result)
                {
                    Debug.Log(result + "Total" + total);
                    ShowResult();
                    StopCoroutine(startLoop());
                    isStartLoop = true;
                    break;
                }
                total += 1;
                Debug.Log(result + "循环" + total);
                marks[i].gameObject.SetActive(false);
                yield return new WaitForSeconds(0.21f * (timer + 1));
                marks[i].gameObject.SetActive(true);
            }
            if (isStartLoop)

                break;

            timer += 1;
            if (timer >= 4)
            {
                timer = 4;
            }
        }
    }
    //展示结果
    void ShowResult()
    {
        Debug.Log("展示结果");
        //遍历当前的touches
        foreach (Touch t in touches)
        {
            //存在   更新手指
            foreach (MyFinger mf in MyFinger.Fingers)
            {
                if (t.fingerId == mf.id)
                {
                    marks[t.fingerId].gameObject.SetActive(false);
                    Debug.Log("隐藏");
                    break;
                }
            }
            if (t.fingerId == loopIndex)
            {
                StartCoroutine(Shine());
                Debug.Log("显示");
                BtnClear.gameObject.SetActive(true);
            }
        }

    }

    bool isBreak = false;
    //结果闪烁状态
    IEnumerator Shine()
    {
        while (true)
        {
            marks[loopIndex].SetActive(!marks[loopIndex].activeSelf);
            yield return new WaitForSeconds(0.5f);
            if (isBreak)
            {
                break;
            }
        }
    }


    //转换坐标
    private Vector3 GetWorlfPos(Vector2 pos)
    {
        return Camera.main.ScreenToWorldPoint(new Vector3(pos.x, pos.y, Camera.main.nearClipPlane + 10));
    }

    void OnDestroy()
    {

        BtnStart.onClick.RemoveListener(OnClick);
        BtnClear.onClick.RemoveListener(OnClear);
        BtnReturn.onClick.RemoveListener(BtnReturnClick);
    }


}

然后打包放在手机上,最后效果是实现了,

这个游戏虽然编写玩了,毕竟时间仓促,也没怎么分类整理,所以还是存在一些BUG的(手指数不能少于两个)然后呢,我也没修改,这个还是需要改进的,比如加点特效,音效,动画等的什么的,想想还是比较炫酷的。这个游戏用来练习一下EasyTouch的使用,两者兼得,不错不错。(*^▽^*)

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值