随着时间的推移造成的伤害正在破坏我的帧率,统一c#

时间:2014-08-06 10:20:27

标签: c# unity3d

好的大家好。 我对脚本非常陌生,而且我正在通过制作游戏来学习。 我试图随着时间的推移对我的玩家施加伤害。虽然我有一些有用的东西,但是当计时器启动时,我的帧速率从60以上降到10以下。所以我希望有人可以帮助解释为什么会这样,如果我的方法可行并且我能做什么更好。这是我的代码。

public class AllDamage : MonoBehaviour 
{
//Type of Damage to be applied when attatched to a game object
public bool isFire;
public bool isIce;
public bool isElectric;
public bool isWind;
public bool isBlunt;
public bool isSharp;
public bool isToxic;
public bool isPoisen;

public bool isTicking; // is this damage over time

public int ticks = 0;
public int DotDuration;

// Ammount or initial damage
public float ammountHealthDmg = 10f;
public float ammountPhysicalDmg = 10f;
public float ammountMentalDmg = 10f;
// ammount of damage over time
public float tickHealthDmg = 1f;
public float tickPhysicalDmg = 1f;
public float tickMentalDmg = 1f;



void Update()
{
    if(isTicking == true)
    {
        applyDoT ();
        StartCoroutine("CountSeconds");
    }
}

IEnumerator CountSeconds()
{
    int DoTDuration = 0;
    while(true)
    {
        for (float timer = 0; timer < 1; timer += Time.deltaTime)
        yield return 0;
        DoTDuration++;
        Debug.Log(DoTDuration + " seconds have passed since the Coroutine started.");

        if(DoTDuration == 10)
        {
            StopCoroutine("CountSeconds");
            isTicking = false;
        }
    }
}
void applyDoT()
{
    // ticks increments 60 times per second, as an example
    ticks++;
    // Condition is true once every second
    if(ticks % 60 == 0)
    {
        decrementStats(tickHealthDmg, tickPhysicalDmg, tickMentalDmg);
    }
}

// is this the player?... what am i?...apply my inital damage...do i have damage over time
void OnTriggerEnter(Collider other)
{
    if(other.tag == "Player")
    {
        if(isFire)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
            isTicking = true;
        }
        if(isIce)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
            isTicking = true;
        }
        if(isElectric)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
        }
        if(isWind)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
        }
        if(isBlunt)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
        }
        if(isSharp)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
            isTicking = true;
        }
        if(isToxic)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
            isTicking = true;
        }
        if(isPoisen)
        {
            decrementStats(ammountHealthDmg, ammountPhysicalDmg, ammountMentalDmg);
            isTicking = true;
        }
    }
}
// - stat values
void decrementStats(float health, float physical, float mental)
{
    Stats.health -= health;
    Stats.physical -= physical;
    Stats.mental -= mental;
    Stats.CheckAllStats();
}

}

1 个答案:

答案 0 :(得分:4)

通过在StartCoroutine()回调中调用Update(),您可以多次启动协程,每帧一次。 您应该做什么,当您想要启动协程然后立即将其设置为shouldStartTicking时,将isTicking(代码中称为true)标记设置为false在协程中。 但更清晰的解决方案是从注册命中的代码开始直接执行协程。 我还建议您从协程中调用decrementStats方法,而不是使用外部反变量来传达DoT效果的状态。