因为最初计时器写在使用计时器的类里。共用计时器造成,开始新的修炼之前的修炼计时终止。所以单独把计时器作为组件加入到每一个克隆体,解决相互之间的影响。(还存在问题,关闭当前界面会使计时显示终止,还未解决,此处做记录)
使用计时器的类
/// <summary>
/// 初始化修炼列表
/// </summary>
private void InitTrainList()
{
int length = table["XiuLianZongConfig"].Tabel.GetDataCount();
GameObject train = Resources.Load("Prop/Train_Prop") as GameObject;
for (int i = 0; i < length; i++)
{
GameObject trainObj = Instantiate(train);
trainObj.transform.parent = parent.transform;
trainObj.transform.localScale = Vector3.one;
trainObj.name = (i + 1).ToString();
GameObject goTrain = trainObj.transform.FindChild("Train").gameObject;
goTrain.GetComponent<Button>().onClick.AddListener(delegate () { GoTrainOnClick(goTrain); });
trainObj.AddComponent<TrainItem>();
SetTrainData(trainObj);
}
}
/// <summary>
/// 初始化修炼列表数据
/// </summary>
private void SetTrainData(GameObject obj)
{
string trainId = table["XiuLianZongConfig"].Tabel.GetData(obj.name, "now_id")[0].ToString();
Text name = obj.transform.FindChild("NameBg/Name").GetComponent<Text>();
Text time = obj.transform.FindChild("Time").GetComponent<Text>();
Text reward = obj.transform.FindChild("Reward").GetComponent<Text>();
name.text = table["TiZhiConfig"].Tabel.GetData(trainId, "name")[0].ToString();
time.text = "时间:" + 3 + "秒";
reward.text ="提升:生命+" + 10;
}
/// <summary>
/// 点击修炼
/// </summary>
int time;
private void GoTrainOnClick(GameObject sender)
{
sender.SetActive(false);
GameObject sign = sender.transform.parent.FindChild("Sign").gameObject;
sign.transform.GetComponent<Text>().text = "冷却中...";
sign.SetActive(true);
......//项目代码中间省略了
//重点是这里把计时器组件加入并开启
TrainItem item = sender.transform.parent.GetComponent<TrainItem>();
item.SetData(time);
item.StartTrain();
}
TrainItem计时器类
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class TrainItem : MonoBehaviour {
/// <summary>
/// 定时器
/// </summary>
private class Clock
{
/// <summary>
/// 定的时间
/// </summary>
public int time;
/// <summary>
/// 委托的事件
/// </summary>
public delegate void Evn();
/// <summary>
/// 委托
/// </summary>
public Evn evn;
/// <summary>
/// 时间最大值
/// </summary>
public float maxTime;
/// <summary>
/// 定时器的ID
/// </summary>
public int id;
}
/// <summary>
/// 修练定时器
/// </summary>
private Clock train_clock;
private GameObject time;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void SetData(int time)
{
train_clock = new Clock();
train_clock.time = time;
}
/// <summary>
/// 开始修炼
/// </summary>
public void StartTrain()
{
StopCoroutine("TrainTime");
StartCoroutine("TrainTime", train_clock);
transform.FindChild("Sign/Time").GetComponent<Text>().text = "00:00:00";
train_clock.evn = delegate ()
{
transform.FindChild("Sign").gameObject.SetActive(false);
transform.FindChild("Train").gameObject.SetActive(true);
};
}
IEnumerator TrainTime(Clock clock)
{
Text theTime = transform.FindChild("Sign/Time").GetComponent<Text>();
int hour = 0;
int minute = 0;
int second = 0;
while (clock.time > 0)
{
yield return new WaitForSeconds(1);
clock.time--;
hour = clock.time / 3600;
minute = (int)clock.time / 60;
second = clock.time - (minute * 60);
theTime.text = ShowTimeTxt(hour) + ":" + ShowTimeTxt(minute) + ":" + ShowTimeTxt(second);
}
clock.evn();
}
/// <summary>
/// 格式化时间显示
/// </summary>
private string ShowTimeTxt(int num)
{
if (num <= 9)
{
return string.Format("0{0}", num);
}
else
{
return num.ToString();
}
}
}