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
。)谢谢您的帮助,输出与我预期的一样