2017-01-16 11 views
1

Так Random.Range может вызываться только из основного потока.Как вызвать Random.Range из обработчика System.Timers.Timer?

Каким будет решение для следующего, где мне нужна случайная переменная в обработчике System.Timers.Timer?

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class FooCounter : MonoBehaviour 
{ 
    private int _randomFoo; 
    private System.Timers.Timer _t = new System.Timers.Timer(); 

    // Use this for initialization 
    void Start() 
    { 
     _t.Interval = 1000; 
     _t.Elapsed += TimerUpdate; 
     _t.Start(); 
    } 
    public void TimerUpdate(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     _randomFoo = Random.Range(0, 20); 
    } 
} 

ответ

1

Получить UnityThread класс от this вопроса. Затем вы можете использовать Random.Range Unity в функции UnityThread.executeInUpdate.

private int _randomFoo; 
private System.Timers.Timer _t = new System.Timers.Timer(); 

void Awake() 
{ 
    UnityThread.initUnityThread(); 
} 

// Use this for initialization 
void Start() 
{ 
    _t.Interval = 1000; 
    _t.Elapsed += TimerUpdate; 
    _t.Start(); 
} 


public void TimerUpdate(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    UnityThread.executeInUpdate(() => 
    { 
     _randomFoo = Random.Range(0, 20); 
    }); 
}