Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一-使定时通电_C#_Unity3d - Fatal编程技术网

C# 统一-使定时通电

C# 统一-使定时通电,c#,unity3d,C#,Unity3d,你能帮我做一个定时通电,在一定时间内有效吗 这是我的密码 public int jumpTrig = 0; public int speed = 0; public int health = 0; public float duration = 0; public float timer = 0; void OnTriggerEnter2D(Collider2D coli) { if (coli.gameObject.tag == "Player") { co

你能帮我做一个定时通电,在一定时间内有效吗

这是我的密码

public int jumpTrig = 0;
public int speed = 0;
public int health = 0;

public float duration = 0;
public float timer = 0;
void OnTriggerEnter2D(Collider2D coli)
{
    if (coli.gameObject.tag == "Player")

    {
        coli.gameObject.GetComponent<PlayerMove>().jumpForce += jumpTrig;
        coli.gameObject.GetComponent<PlayerMove>().speed += speed;
        coli.gameObject.GetComponent<Health>().health += health;

        Destroy(this.gameObject);
    }
}
public int jumpTrig=0;
公共int速度=0;
公共卫生=0;
公共浮动持续时间=0;
公共浮点计时器=0;
无效OnTiggerEnter2D(碰撞的R2D大肠杆菌)
{
如果(coli.gameObject.tag==“玩家”)
{
coli.gameObject.GetComponent().jumpForce+=jumpTrig;
coli.gameObject.GetComponent().speed+=speed;
coli.gameObject.GetComponent().health+=health;
摧毁(这个游戏对象);
}
}

实际上,我不建议在
更新中使用计时器,因为它会妨碍您至少停用相应的
游戏对象。这同样适用于Corotuine

在这两种情况下,您都不能
销毁
设置活动(false)
会困扰我的通电项目


但是你可以用这个

当然,如果对象被销毁,它仍然会崩溃,但是它在一个非活动的游戏对象上工作

因此,先禁用它,然后再销毁它

还有几点:

  • 一般来说,您应该尽可能少地使用
    GetComponent
    ,因为它非常昂贵。而是存储引用并重用它

  • 您应该使用而不是直接使用
    ==
    CompareTag
    的速度(稍微)更快,但更重要的一点是:如果提供的标记拼写错误/不存在,则会引发异常。
    =
    隐藏了这样一个“bug”,而只是失败了,这可能会花费您一些开发时间和精力;)

  • 请注意,我也会为您的字段提供更好的名称

因此,您的代码可能看起来像

public int jumpBonus = 0;
public int speedBonus = 0;
public int healthBonus = 0;

public float duration = 0;

private PlayerMove playerMove;
private Health playerHealth;

private void OnTriggerEnter2D(Collider2D coli)
{
    if (!coli.CompareTag("Player")) return;

    playerMove = coli.gameObject.GetComponent<PlayerMove>();
    playerHealth = coli.gameObject.GetComponent<Health>();

    playerMove.jumpForce += jumpBonus;
    playerMove.speed += speedBonus;
    playerHealth.health += healthBonus;

    gameObject.SetActive(false);

    // Calls ResetEffect after "duration" seconds even if gameObject is inactive
    Invoke(nameof(ResetEffect), duration);
}

private void ResetEffect()
{
    playerMove.jumpForce -= jumpBonus;
    playerMove.speed -= speedBonus;
    playerHealth.health -= healthBonus;

    Destroy(gameObject);
}
public int jumpBonus=0;
公共积分speedBonus=0;
公共健康红利=0;
公共浮动持续时间=0;
私人玩家移动玩家移动;
私人卫生保健;
private void OnTiggerEnter2D(冲突的R2D coli)
{
如果(!coli.CompareTag(“播放器”))返回;
playerMove=coli.gameObject.GetComponent();
playerHealth=coli.gameObject.GetComponent();
playerMove.jumpForce+=跳跃奖励;
playerMove.speed+=速度奖励;
playerHealth.health+=健康奖金;
gameObject.SetActive(false);
//在“持续时间”秒后调用ResetEffect,即使游戏对象处于非活动状态
调用(名称(重置效果)、持续时间);
}
私有无效重置效果()
{
playerMove.jumpForce-=跳跃奖励;
playerMove.speed-=速度奖励;
playerHealth.health-=健康奖金;
摧毁(游戏对象);
}

您可以使用Update和DeltaTime执行单个计时器,在所需时间的浮动范围内工作

public float powerTime = 0.0f
private bool poweredUp = false;

void OnTriggerEnter2D(Collider2D coli)
{
    if (coli.gameObject.tag == "Player")

    {
        powerTime = 10.0f;
    }

}

Update()
{ 
    powerTime -= Time.deltaTime;

    if (powerTime > 0.0f && !poweredUp)
    {
        poweredUp = true;
        doPowerUp();
    }
    else if (poweredUp)
    {
        doPowerEnd()
    }

void doPowerUp()
{
    coli.gameObject.GetComponent<PlayerMove>().jumpForce += jumpTrig;
    coli.gameObject.GetComponent<PlayerMove>().speed += speed;
    coli.gameObject.GetComponent<Health>().health += health;


}

void doPowerEnd()
{
    poweredUp = false;
    Destroy(this.gameObject);
//reset to your normal values.
}
public float powerTime=0.0f
private bool poweredUp=false;
无效OnTiggerEnter2D(碰撞的R2D大肠杆菌)
{
如果(coli.gameObject.tag==“玩家”)
{
功率时间=10.0f;
}
}
更新()
{ 
powerTime-=Time.deltaTime;
如果(powerTime>0.0f&&!poweredUp)
{
poweredUp=true;
doPowerUp();
}
else if(poweredUp)
{
多波伦德
}
void doPowerUp()
{
coli.gameObject.GetComponent().jumpForce+=jumpTrig;
coli.gameObject.GetComponent().speed+=speed;
coli.gameObject.GetComponent().health+=health;
}
void dopoverend()
{
poweredUp=false;
摧毁(这个游戏对象);
//重置为正常值。
}

现在更新后还有另一个问题:即使已经使用过,通电仍保持可见10秒;)另外,由于
powerTime=0f
在开始时,它会在第一帧立即跳转到
doPowerEnd
。)谢谢您的帮助,输出与我预期的一样