Unity3D-ScrollView中使用Layout佈局後用程式碼如何控制ScrollView移動到指定位置
阿新 • • 發佈:2019-02-08
最近在做專案的時候,發現了一個好用的玩意,那就是Unity自帶的LayoutGroup。
如果不用關心Group裡面子項的Item的座標或者起本身的寬度和座標,這個用起來還是非常好的。
但是因為經常在ScrollView中使用,特別是List中,這就有一個很常用的功能,就是在程式碼裡面控制ScrollView滾動到固定的位置。
一開始我想的是直接拿到子物件的寬高和ScrollView的寬高做處理,後面發現,子物件的寬高始終是原本的設定的高度,也就是說使用layout之後Group的寬高拿不到實際的寬高。
後面想到一個辦法,直接使用group中的子項的座標去做判斷:
float GetListOffset(RectTransform rootRect, GameObject obj){ float temp = 1; Vector2 screenVec2 = RectTransformUtility.WorldToScreenPoint(Camera.main, obj.transform.position); Vector2 inRootVec2; float offset = 0; RectTransformUtility.ScreenPointToLocalPointInRectangle(rootRect, screenVec2, Camera.main, out inRootVec2); Debug.Log(inRootVec2); if (inRootVec2.y < -(rootRect.sizeDelta.y)/2 - 200){ offset = inRootVec2.y - (-(rootRect.sizeDelta.y)/2 - 200); offset = offset / rootRect.sizeDelta.y; temp = Mathf.Min(0, 0.5f - offset); }else if (inRootVec2.y > -(rootRect.sizeDelta.y)/2 + 200){ offset = inRootVec2.y - (-(rootRect.sizeDelta.y)/2 + 200); offset = offset / rootRect.sizeDelta.y; temp = Mathf.Min(1, 0.5f + offset); }else{ temp = -1; } return temp; }
這裡的rootRect是值ScrollView,這個是固定的寬高,所以可以直接拿到。obj是Srollview最裡面的子項,然後將座標做了一下變換,變成同一個座標系中。
我這裡計算有一定的浮動,就是上下浮動200,如果在這裡裡面,則表示不需要移動ScrollView,如果超出,那麼得到差值進行計算。
注意,我這裡為什麼是負數,是因為子項用了LayoutElement,它會將子項的anchor設定為左上。因此0的位置就是在ScrollView的最頂端,一直往下就是遞減。