前几天突然翻到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的使用,两者兼得,不错不错。(*^▽^*)