在我的代码中,当玩家进入触发器时我正在调用慢动作功能,但我希望此功能在1秒后停止,我尝试了下面的代码,但慢动作不起作用 . 你有什么主意吗?
Player Script:
public Rigidbody Ball;
public float Speed = 50f;
public TimeManager timeManager;
bool SlowOn;
bool ClickDone = false;
// Use this for initialization
void Start () {
StartCoroutine(SlowOff());
}
// Update is called once per frame
void FixedUpdate () {
if (!ClickDone){
if (Input.GetMouseButton (0)) {
ClickDone = true;
Ball.velocity = transform.forward * Speed;
}
}
}
private void OnTriggerEnter (Collider other) {
if(other.gameObject.CompareTag ("SlowMotionArea")) {
if (SlowOn) {
timeManager.DoSlowMotion();
}
}
}
IEnumerator SlowOff () {
yield return new WaitForSeconds(2.0f);
SlowOn = false;
}
TimeManager Script:
public float SlowDownFactor = 0.05f;
public float SlowdownLength = 2f;
public void DoSlowMotion () {
Time.timeScale = SlowDownFactor;
Time.fixedDeltaTime = 0.02f * Time.timeScale ;
}
1 回答
您的代码存在一些问题
SlowOn
设置为true
所以你的行从未被执行过 . 您应该在代码中的某处调用
我猜,但似乎你想使用那个bool来防止多次调用
timeManager.DoSlowMotion()
?在这种情况下,它应该是类似的东西Start()
方法中调用StartCoroutine(SlowOff());
?我想你应该删除该行并将其放置
所以每当SlowMotion开始时,Coroutine就会启动 .
SlowOn = false
是不够的 .在
TimeManager
中,您应该存储原始TimeScale并在第二种方法中重置它们:而且你还必须从玩家那里调用
ResetTimeScales
方法也将受到更改的时间刻度的影响,因此您的SlowMotion当前将比预期的
2
秒更长,即2 / SlowDownFactor
=40
!您可以通过使用
Time.unscaledDeltaTime
作为倒计时来避免这种情况