public void Init() { _canChangeCenterItem = true; int useItemCount = showItemCountInView * _dataLengthMul; // 乘1万再除以1万的方式,就是为了保留4位小数 _factor = (Mathf.RoundToInt((1f / useItemCount) * 10000f)) * 0.0001f; _totalHorizontalWidth = useItemCount * itemSpacingWidth; _oriListCenterIndex = useItemCount / 2; if (useItemCount % 2 == 0) { _oriListCenterIndex = useItemCount / 2 - 1; } itemTemplate.SetActive(true); for (int i = 0; i < useItemCount; i++) { GameObject go = Instantiate(itemTemplate); go.name = i.ToString(); go.transform.SetParent(_tr); go.transform.localPosition = new Vector3(_factor * i * _totalHorizontalWidth - 0.5f * _totalHorizontalWidth, yFixedPosVal, 0); go.transform.localScale = Vector3.one; LoopScrollViewWithSelectedEffect_Drag drag = go.GetComponent <LoopScrollViewWithSelectedEffect_Drag>(); if (drag == null) { drag = go.AddComponent <LoopScrollViewWithSelectedEffect_Drag>(); } drag.SetScrollView(this); LoopScrollViewWithSelectedEffect_Item item = go.GetComponent <LoopScrollViewWithSelectedEffect_Item>(); if (item == null) { item = go.AddComponent <LoopScrollViewWithSelectedEffect_Item>(); } item.oriListIndex = i; item.dataLength = _dataLength; item.SetScollView(this); item.SetItemDefaultShowCallback(itemDefaultShowCallback); item.SetItemSelectCallback(itemSelectCallback); item.SetItemUnSelectCallback(itemUnSelectCallback); item.SetItemPassBeginCallback(itemPassBeginCallback); item.SetItemPassEndCallback(itemPassEndCallback); _oriItemList.Add(item); } itemTemplate.SetActive(false); #region 修正数据 int index = 0; int centerItemIndex = _startCenterDataIndex % useItemCount; int dataValOffset = _startCenterDataIndex - centerItemIndex; // 必须倒序循环,因为要按“中心卡牌为0,左边为负,右边为正”的位置摆牌(正序循环则会相反) for (int i = useItemCount - 1; i >= 0; i--) { var item = _oriItemList[i]; // 乘上factor就是为了让centerOffSet是个小数 item.centerOffSet = _factor * (_oriListCenterIndex - index); item.SetSelectState(false); index++; } xValSortItemList = new List <LoopScrollViewWithSelectedEffect_Item>(_oriItemList); _curCenterItem = _oriItemList[centerItemIndex]; _totalHorizontalWidth = useItemCount * itemSpacingWidth; // 为了让中心单位出现在视图中心,就得用0.5减(和后面GetXPosValue函数有关) // 为什么不直接用0.5f的原因:如果用0.5f会算出有些牌SiblingIndex重复问题,但在滑动牌组时,应是每一张牌各占一层。 float targetVal = 0.5f + startCenterXOffset - _curCenterItem.centerOffSet; LerpTweenToTarget(0, targetVal, 0, false); SortItemListByXVal(); int indexOffset = _curCenterItem.oriListIndex - _curCenterItem.sortXValListIndex; for (var i = 0; i < xValSortItemList.Count; i++) { var item = xValSortItemList[i]; int dataIndex = (i + indexOffset + dataValOffset) % _dataLength; if (dataIndex < 0) { dataIndex += _dataLength; } item.dataIndex = dataIndex; item.DefaultShow(); } #endregion for (int i = 0; i < xValSortItemList.Count; i++) { var item = xValSortItemList[i]; item.DefaultShow(); } }