写在最前面:Jay 是我花了五天左右时间开发的同名游戏,基础机制借鉴了涂鸦跳跃,具体的参考视频可以点击以下链接
用周杰伦的第一张专辑Jay做了个游戏(祝杰伦118生日快乐)_单机游戏热门视频
这篇日志将记录时间和分数该如何实现。
(一)时间
1) 创建一个新的 Text, 在 Timer 脚本中写入如下代码:
// 已经花费的时间
public float timeSpend = 0.0f;
public GameObject Player;
int hour;
int minute;
int second;
int millisecond;
// 显示时间区域的文本
Text text_timeSpend;
// Use this for initialization
void Start()
{
text_timeSpend = GetComponent<Text>();
}
// Update is called once per frame
void Update()
{
if (!Player.GetComponent<Player>().End)
{
timeSpend += Time.deltaTime;
}
hour = (int)timeSpend / 3600;
minute = ((int)timeSpend - hour * 3600) / 60;
second = (int)timeSpend - hour * 3600 - minute * 60;
millisecond = (int)((timeSpend - (int)timeSpend) * 10);
text_timeSpend.text = string.Format("时间: {0:D2}:{1:D2}:{2:D2}", minute, second, millisecond);
}
其中的参数 End 在上一节的角色死亡中有定义。
2) 为了解决字号大显示丢失的问题,需要为 Text 添加 Content Size Fitter 组件,两个 Fit 选项均改为 Preferred Size 。
3) 在 “反方向的钟” 这一关卡中,触碰到道具时钟将 timeSpend 的值减去5。
(二)分数
1) 这里采取了比较简单的计分方式,即分数和仅与人物达到的高度有关。但是因为人物是不断在跳跃中的,位置会在一定范围内上下波动,故采用只会上升的相机位置代替,这样能避免分数下降的情况。脚本 Score 中的主要部分如下:
public GameObject Player;
public int scoreGet = 0;
float Pos1;
Camera Cam;
Text text_scoreGet;
// Start is called before the first frame update
void Start()
{
text_scoreGet = GetComponent<Text>();
Cam = Camera.main;
Pos1 = Cam.transform.position.y;
}
// Update is called once per frame
void Update()
{
float Pos2 = Cam.transform.position.y;
if (!Player.GetComponent<SpecialEffect>().isPause)
{
int Delta = (int)((Pos2 - Pos1) * 10000);
scoreGet += Delta /100;
}
Pos1 = Pos2;
text_scoreGet.text = string.Format("分数: {0}", scoreGet/10);
}
这里不断更新两个位置,Pos2代表现在的位置,Pos1代表之前的位置,使用两个位置的差值作为分数的增量。这么做的目的是为了方便在碰到特定道具时暂停分数的上涨(在关卡 “斗牛” 中道具篮球可以停止分数上涨8秒)。更多关于分数暂停的细节将在之后提到 Special Effect 脚本时解析。
2) 因为分数是整型,而高度是浮点型,在转换时需要一定的倍数变化。
3) 同样是在 “斗牛” 这一关卡中,碰到道具方便面则会在 Special Effect 脚本中为 ScoreGet 增加10000。