保证赛车常速不变

保证赛车常速不变(获取道具的变速效果持续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); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值