保证赛车常速不变(获取道具的变速效果持续10秒消失) 。
当赛车为最低速度(初始速度)时,获取减速道具不减、10秒后不增;
当赛车为最高速度(100)时,获取加速道具不增、10秒后不减;
一旦赛车当前速度+变速量低于最低速度,或者高于最高速度,其变速后的速度就按照最低或者最高的算。
思路:
当赛车获取加速/减速道具时,它会在当前速度(nowSpeed)的基础上得到一个变量(delspeed),变量为增量还是减量,根据道具的性质决定。
不管道具性质为加速(AddSpeed)还是减速(SlowSpeed):
当前速度(nowSpeed) + 变量(delspeed)= (变速后的)当前速度(nowSpeed)
void ChangeSpeed(bool addSpeed,float diffspeed) //变速方法(addSpeed为真为加速,为假为减速)
{
nowSpeed += diffspeed;
SpaceRacingFSMManager.instance.quad.GetComponent<MeshRenderer>().material.SetVector("_Speed_Denoise", new Vector4(0, nowSpeed, 0, 0));
......
}
当道具性质为加速(AddSpeed)时,会出现变速后的速度可能大于最高限速的情况,因此增加一个条件判断限定:
若 当前速度(nowSpeed) + 变量(delspeed)> 最高限速(speedMax)
则 变量(delspeed)= 限速(speedMax)- 当前速度(nowSpeed);
if (delspeed + nowSpeed > speedMax)
delspeed = speedMax - nowSpeed;
当道具性质为减速(SlowSpeed)时,会出现变速后的速度可能小于最低限速的情况,也增加一个条件判断限定:
若 当前速度(nowSpeed) + 变量(delspeed)< 最低限速(speedMin)
则 变量(delspeed)= 当前速度(nowSpeed)- 最低限速(speedMin);
else if (delspeed + nowSpeed < speedMin)
delspeed = nowSpeed - speedMin;
若是正常情况(变速后的速度在speedMin和speedMax之间),那就根据正常的道具变速量来加减速。变多少速,10秒后再从反向变多少速。
else
delspeed = (addSpeed ? GameLevel : -GameLevel) * 10.0f;
这样能保证:
当变速后的速度大于最高限速时,只让它加速到最高速(10秒后减去一样的量,不多减);
当变速后的速度小于最低限速时,只让它减速到最低速(10秒后加去一样的量,不多加);
只需要将经过以上计算后得出的变量的值传入变速方法,再将其负值传到销毁道具效果方法里即可。
计算 delspeed(速度变量)的完整代码:
/// <summary>
/// 计算当前吃道具后可以增加/减少的速度
/// </summary>
/// <param name="addSpeed"></param>
/// <returns></returns>
float GetChangSpeed(bool addSpeed)
{
// 获取当前的速度
nowSpeed = SpaceRacingFSMManager.instance.quad.GetComponent<MeshRenderer>().material.GetVector("_Speed_Denoise").y;
// delspeed 是获取变速道具时得到的速度变量
var delspeed = (addSpeed ? GameLevel : -GameLevel) * 10.0f; //相当于if (addSpeed){delspeed += 1 * 10;} else{delspeed += -1 * 10;}
// 这里需要将数字写成float型,只写一个10会默认delspeed为Int型
// 最低速度 即赛车初始速度,不可低于赛车初始速度
speedMin = startSpeed;
// 用 nowSpeed + delspeed 和 speedMax、speedMin 进行比对,判断可以加/减多少速度
if (delspeed + nowSpeed > speedMax)
delspeed = speedMax - nowSpeed;
else if (delspeed + nowSpeed < speedMin) //-15 +20 <20
delspeed = nowSpeed - speedMin; // 0 = 20-20
else
delspeed = (addSpeed ? GameLevel : -GameLevel) * 10.0f;
return delspeed; // 将 delspeed的值 传递出去
// nowSpeed = Mathf.Clamp(nowSpeed, speedMin, speedMax);
// 这句不用写了 因为上面的代码已经将nowSpeed限制在 speedMax 和 speedMin 里面了
}
将经过以上计算后得出的变量的值传入变速方法:
case PropType.AddSpeed: // 碰撞到加速道具
......
// 用 adiffspeed 接收传递过来的 delspeed 的值
var adiffspeed = GetChangSpeed(true);
// 把 adiffspeed 传给 ChangeSpeed方法
ChangeSpeed(true, adiffspeed);
......
// 10秒后调用销毁道具效果方法 同样把 adiffspeed 传递过去
propObj.PropCountTime((x)=>DestroyPropChangeSpeed(x, adiffspeed));
break;
case PropType.SlowSpeed: // 碰撞到减速道具
// 用 sdiffspeed 接收传递过来的 delspeed 的值
var sdiffspeed = GetChangSpeed(false);
// 把 sdiffspeed 传给 ChangeSpeed方法
ChangeSpeed(false, sdiffspeed);
......
// 10秒后调用销毁道具效果方法 把 sdiffspeed 传递过去
propObj.PropCountTime((x)=>DestroyPropChangeSpeed(x, sdiffspeed));
break;
销毁道具效果方法:
void DestroyPropChangeSpeed(PropType proptype,float speedchange) //销毁道具效果方法
{
bool isAddSpeedProp = false; // 是否是加速道具,默认值为false
if (proptype == PropType.AddSpeed) // 如果道具类型是加速
{ isAddSpeedProp = true; } // 那么 isAddSpeedProp 为真
else { isAddSpeedProp = false; } // 否则(如果道具类型不是加速) 那么 isAddSpeedProp 为假
bool isAddSpeed = !isAddSpeedProp; // bool值 isAddSpeed 赋值为 取反 isAddSpeedProp.
// 如果道具类型是加速,那么 isAddSpeed 为假; 如果道具类型不是加速,那么 isAddSpeed 为真.
// 将 变速值的负值 传入 变速方法(加多少减多少,减多少加多少)
ChangeSpeed(isAddSpeed, -speedchange);
}