2017-05-29 10 views
0

私はユニティで開始しています、と私は(ゲームが一時停止中前)AVENTを誘発する必要があります。 Time.timeScaleが0に変更されたときに何らかのイベントを引き起こす方法はありますか?ような何か:Time.timeScale.onBeforeChange() ...ハンドルはTime.timeScale onChangeイベント

どうもありがとうございました。

+0

void Update()に入れてみましたか? – Universus

+0

正直なところ、私は 'Time.timeScale'を一時停止するのは嫌です。私の主なゲームクラスで真であれば、' Update() 'の間にすべてのゲームロジックをスキップします。メニューのトゥイーンなどの処理を行うための意味のあるdeltaTime値。 – Draco18s

+0

ありがとう、draco18s、しかし私はまた、ユーザーがアプリケーションを突然終了する場合にも手渡す必要があります。 –

答えて

3

時間スケールにコントローラを変更する事を確認し、そのコントローラーがイベントを発生させる作ります。

[System.Serializable] 
public class BeforeTimeChangedData 
{ 
    public bool canceled; 
    public float oldValue; 
    public float newValue; 
} 


[System.Serializable] 
public class BeforeTimeChangedEvent : UnityEvent<BeforeTimeChangedData> 
{ 
} 

//Attach this to a game object that gets loaded in your pre-load scene with the tag "Singletons" 
public class TimeController : MonoBehaviour 
{ 
    void Awake() 
    { 
     DontDestroyOnLoad(gameObject); 

     if(BeforeTimeChanged == null) 
      BeforeTimeChanged = new BeforeTimeChangedEvent(); 
    } 

    public BeforeTimeChangedEvent BeforeTimeChanged; 

    public bool ChangeTimeScale(float newValue) 
    { 
     var args = new BeforeTimeChangedData(); 
     args.oldValue = Time.timeScale; 
     args.newValue = Time.timeScale; 
     BeforeTimeChanged.Invoke(args); 
     if(!args.canceled) 
     { 
      Time.timeScale = newValue; 
     } 
     return args.canceled; 
    } 
} 

他の場所であなたは

public class TimeSlower : MonoBehaviour 
{ 
    private TimeController _timeController; 
    public Text TimeChanged; 

    void Start() 
    { 
     var singletons = GameObject.FindWithTag("Singletons"); 
     _timeController = singletons.GetComponent<TimeController>(); 
     if(_timeController == null) 
      throw new System.ArgumentNullException("Could not find a TimeController on the Singletons object"); 
    } 

    void Update() 
    { 
     if(Input.GetButton("SlowTime")) 
     { 
      var changed = _timeController.ChangeTimeScale(0.5f); 
      if(changed) 
      { 
       TimeChanged.text = "Time Changed!"; 
      } 
     } 
    } 
} 

を行うことで、タイムスケールを変更して、ここでの変更を待機し、変更があまりにも最近起こった場合、変更をキャンセルし、別のコンポーネントであることができます。

public class TimeChangeLimiter : MonoBehaviour 
{ 
    private float lastTimeChange = 0; 
    private TimeController _timeController; 
    public Text TimeChanged; 

    [Range(0, float.MaxValue)] 
    public float Cooldown; 

    void Start() 
    { 
     var singletons = GameObject.FindWithTag("Singletons"); 
     _timeController = singletons.GetComponent<TimeController>(); 
     if(_timeController == null) 
      throw new System.ArgumentNullException("Could not find a TimeController on the Singletons object"); 

     _timeController.BeforeTimeChanged.AddListener(OnBeforeTimeChanged); 
    } 

    void OnDestroy() 
    { 
     _timeController.BeforeTimeChanged.RemoveListener(OnBeforeTimeChanged); 
    } 


    void OnBeforeTimeChanged(BeforeTimeChangedData args) 
    { 
     if(Time.time - lastTimeChange < Cooldown) 
     { 
      args.canceled = true; 
      return; 
     } 
     lastTimeChange = Time.time; 
    } 
}