unity에서 scrollview 밑에 불러오는 방법

6647 단어 unity3DC#UIScrollView
먼저 NGUI 도구 인터페이스를 제공합니다.
/// 
    ///  Panel
    /// 
    ///  
    ///  
    ///  
    /// Panel 
    public static GameObject createPanel(GameObject parent, string panelName, Vector3 pos)
    {
        if (parent == null) return null;
        int depth = UIPanel.nextUnusedDepth;
        UIPanel panel = NGUITools.AddChild(parent);
        panel.depth = depth;
        panel.gameObject.name = panelName;
        panel.transform.localPosition = pos;
        panel.gameObject.layer = parent.layer;
        return panel.gameObject;
    }

 /// 
    ///  
    /// 
    ///  Panel
    ///  
    ///  
    ///  
    ///  
    /// UIScrollView 
    public static UIScrollView createClipAndDrag(GameObject dragPanel, Vector4 DragCenterAndRange, UIScrollView.Movement moveDiract,
        UIWidget.Pivot piovt, Vector2 clipSoftness)
    {
        UIPanel panel = dragPanel.GetComponent();
        panel.clipping = UIDrawCall.Clipping.SoftClip;      // //
        panel.baseClipRegion = DragCenterAndRange;      // //
        panel.clipSoftness = clipSoftness;      // //
        UIScrollView scrollPanel = dragPanel.AddComponent();
        scrollPanel.movement = moveDiract;  // //
        scrollPanel.contentPivot = piovt;   // //
        scrollPanel.disableDragIfFits = true;
        return scrollPanel;
    }

그리고 NGUI의 UIScroll View를 개조해 보세요.cs 스크립트, onDrag 호스팅 추가 및 Drag()에 호출
public OnDragNotification onDrag;

/// 
	/// Drag the object along the plane.
	/// 

	public void Drag ()
	{
		if (UICamera.currentScheme == UICamera.ControlScheme.Controller) return;

		if (enabled && NGUITools.GetActive(gameObject) && mShouldMove)
		{
			if (mDragID == -10) mDragID = UICamera.currentTouchID;
			UICamera.currentTouch.clickNotification = UICamera.ClickNotification.BasedOnDelta;

			// Prevents the drag "jump". Contributed by 'mixd' from the Tasharen forums.
			if (smoothDragStart && !mDragStarted)
			{
				mDragStarted = true;
				mDragStartOffset = UICamera.currentTouch.totalDelta;
				if (onDragStarted != null) onDragStarted();
			}

			Ray ray = smoothDragStart ?
				UICamera.currentCamera.ScreenPointToRay(UICamera.currentTouch.pos - mDragStartOffset) :
				UICamera.currentCamera.ScreenPointToRay(UICamera.currentTouch.pos);

			float dist = 0f;

			if (mPlane.Raycast(ray, out dist))
			{
				Vector3 currentPos = ray.GetPoint(dist);
				Vector3 offset = currentPos - mLastPos;
				mLastPos = currentPos;

				if (offset.x != 0f || offset.y != 0f || offset.z != 0f)
				{
					offset = mTrans.InverseTransformDirection(offset);

					if (movement == Movement.Horizontal)
					{
						offset.y = 0f;
						offset.z = 0f;
					}
					else if (movement == Movement.Vertical)
					{
						offset.x = 0f;
						offset.z = 0f;
					}
					else if (movement == Movement.Unrestricted)
					{
						offset.z = 0f;
					}
					else
					{
						offset.Scale((Vector3)customMovement);
					}
					offset = mTrans.TransformDirection(offset);
				}

				// Adjust the momentum
				if (dragEffect == DragEffect.None) mMomentum = Vector3.zero;
				else mMomentum = Vector3.Lerp(mMomentum, mMomentum + offset * (0.01f * momentumAmount), 0.67f);

				// Move the scroll view
				if (!iOSDragEmulation || dragEffect != DragEffect.MomentumAndSpring)
				{
					MoveAbsolute(offset);
				}
				else
				{
					Vector3 constraint = mPanel.CalculateConstrainOffset(bounds.min, bounds.max);

					if (constraint.magnitude > 1f)
					{
						MoveAbsolute(offset * 0.5f);
						mMomentum *= 0.5f;
					}
					else
					{
						MoveAbsolute(offset);
					}
				}

				// We want to constrain the UI to be within bounds
				if (restrictWithinPanel &&
					mPanel.clipping != UIDrawCall.Clipping.None &&
					dragEffect != DragEffect.MomentumAndSpring)
				{
					RestrictWithinBounds(true, canMoveHorizontally, canMoveVertically);
				}

                if (null != onDrag)
                    onDrag();
			}
		}
	}

자, 목록 만들기
private GameObject m_dragPanel;
    private UIScrollView m_scrollView;

    /// 
    ///  
    /// 
    private void createDragList()
    {
         m_dragPanel = NGUIComponentFactory.createPanel(m_gamePanel, "dragPanel", Vector3.zero);
         m_scrollView = NGUIComponentFactory.createClipAndDrag(m_dragPanel, new Vector4(0, 29.5f, 500, 360),
            UIScrollView.Movement.Vertical, UIWidget.Pivot.Top, Vector2.one);
        m_scrollView.onDragFinished = onPanelDragFinished;
        m_scrollView.onDrag = onPanelOnDrag;

        // //

    }

그리고 트랜잭션 리셋 함수를 정의합니다
private UILabel m_loadMoreTips;
    private int m_curDisplayNum;

    private void onPanelDragFinished()
    {
        if (null != m_loadMoreTips)
        {
            // //
        }
    }

    private void onPanelOnDrag()
    {
        if (null == m_dragPanel || null == m_scrollView) return;
        Vector3 constraint = m_dragPanel.GetComponent().CalculateConstrainOffset(m_scrollView.bounds.min, m_scrollView.bounds.max);
        if (null == m_loadMoreTips && constraint.y < 0)
        {
            m_loadMoreTips = NGUIComponentFactory.createLabel(m_dragPanel, "tipsLoadMore", ResourceManager.instance.myFont,
                new Vector3(0, 250f - 102f * m_curDisplayNum - 85f, 0), 30);
            m_loadMoreTips.overflowMethod = UILabel.Overflow.ResizeFreely;
            m_loadMoreTips.text = " ";
        }
    }

레이블을 만드는 인터페이스는 다음과 같습니다.
/// 
    ///  Label
    /// 
    ///  
    ///  
    ///  
    ///  
    ///  
    /// UILabel 
    public static UILabel createLabel(GameObject parent, string labelName, UIFont font, Vector3 pos, int fontSize)
    {
        UILabel lbl = NGUITools.AddWidget(parent);
        lbl.gameObject.name = labelName;
        lbl.bitmapFont = font;
        lbl.fontSize = fontSize;
        Transform transform = lbl.gameObject.transform;
        transform.localPosition = pos;
        return lbl;
    }

자, 다른 논리는 스스로 뇌보합시다

좋은 웹페이지 즐겨찾기