我將Unity5.5.5 p1升級到Unity5.6.5 p3版本。
游戲中戰斗部分有改變TimeScale的地方。
在匯出的IOS包中,進入游戲后,TimeScale改變的地方都沒有引起時間的縮放,卻使得人物影片無法正常跳轉到下一個影片,隔很長時間后才會跳轉(UI表現正常),查看log也沒有發現報錯。
經過進一步的排查,發現協程中的while回圈退出后沒有立即向下執行,代碼如下:
IEnumerator STATE()
{
//示意代碼
while(_instate)
{
Debug.Log("1");
yield return null;
}
Debug.Log("2");
}
發現問題是當在改變了timeScale后,將_instate置為false,Debug.Log("2");在卡很長一段時間后才會執行,求問這是什么原因。
Unity5.5.5 版本沒有出現過這種問題,5.6.5匯出Android包也正常,只有5.6.5匯出的IOS有這個問題。
求問各位大佬是什么原因引起的,該如何解決?
uj5u.com熱心網友回復:
造成的原因:(1)Debug.Log本身就很耗時;
(2)Update的其他部分影響了協程的執行;
提供一些建議:
(1)洗掉清空Update
(2)在Debug.Log前后輸出時間看下,具體影響了多久;
uj5u.com熱心網友回復:
你好,謝謝你的解答~這個是在我們專案中升級Unity發現的,之前的版本(Unity5.5.5)沒有這個問題。
(1)log只是個示意,本身工程中是沒有的。
(2)自己寫了一個很簡單的demo,Update里沒有內容,但是還是發現了問題。
目前發下的具體問題是:
Unity5.6.5匯出的IOS包中,設定timeScale會導致協程中的while回圈卡住,卡住的時間不固定。
Unity2017匯出的IOS包中,設定timeScale不生效,但是不會再卡住了。
目前問題只發生在IOS中,Android和Unity里都看不到這個現象。
Demo很簡單,應該不會涉及性能的問題,感覺像是IOS中timeScale的機制出了問題,是不是這種直接賦值的方式有問題啊。
Demo如下:
1、CubeMoveAgent.cs:
private bool _instate=false;
private float _timer=0f;
[SerializeField] float speed=1.5f;
public void StartMove()
{
_timer=0f;
StartCoroutine(MOVEINCOROUTINE());
}
public void StopMove()
{
_instate=false;
}
IEnumerator MOVEINCOROUTINE()
{
_instate = true;
while(_instate)
{
this.transform.position=new Vector3(-10f+_timer*speed,1f,10f);
_timer+=Time.deltaTime;
yield return null;
}
this.transform.localPosition=new Vector3 (0f,-5f,10f);
}
2、ButtonMessage.cs:
[SerializeField]CubeMoveAgent _cube;
void OnGUI()
{
if (GUILayout.Button ("TimeScale=4", GUILayout.Width (150.0f), GUILayout.Height (75.0f)))
{
Time.timeScale = 4f;
}
if (GUI.Button (new Rect(Screen.width-150.0f,10f,150f,75f),"Start Move"))//, GUILayout.Width (150.0f), GUILayout.Height (75.0f)))
{
_cube.StartMove();
}
if (GUI.Button (new Rect(Screen.width-150.0f,90f,150f,75f),"Stop Move"))
{
_cube.StopMove();
}
}
uj5u.com熱心網友回復:
換一個unity3d 的版本重新生產包 估計就解決了轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/49028.html
標籤:Unity3D
上一篇:Oculus打不開,上來就報錯
下一篇:荒野行動pc版游戲音效
