1. 程式人生 > >Unity3D-ScrollView中使用Layout佈局後用程式碼如何控制ScrollView移動到指定位置

Unity3D-ScrollView中使用Layout佈局後用程式碼如何控制ScrollView移動到指定位置

最近在做專案的時候,發現了一個好用的玩意,那就是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的最頂端,一直往下就是遞減。