Unity3D ScrollView滚动范围

时间:2012-07-18 16:58:13

标签: layout position scrollview unity3d

我正在尝试创建一个scrollView,但我不知道如何确定滚动的最大范围(甚至更好,最大滚动位置)。

这是我试图做的,没有任何积极的结果:

void Update()
{
  //get the amount of space that my text is taking
  textSize = gs.CalcHeight(new GUIContent(text), (screenWidth/2));

  if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(0).tapCount==1) 
  {
    var touch = Input.touches[0];

   //check if touch is within the scrollView area
   if(touch.position.x >= (screenWidth/2) && touch.position.x <= (screenWidth) && touch.position.y >= 0 && touch.position.y <= (screenHeight))
   {
     if(touch.phase == TouchPhase.Moved)
     {
       scrollPosition[1] += touch.deltaPosition.y;
       if(scrollPosition[1] < 0)
       {
           scrollPosition[1] = 0;
       }

       //I subtracted this cause i read that the scrollbars take 16px
       if(scrollPosition[1] > (textSize-scrollViewRect.yMax-16)) //scrollViewRect is a Rect with the size of my scrollView
       {
          scrollPosition[1] = textSize-scrollViewRect.yMax-16;
       }
     }
   }
  }
}

void OnGUI()
{
 screenWidth = camera.pixelWidth;
 screenHeight = camera.pixelHeight;
 GUILayout.BeginArea(new Rect(screenWidth/2, 0, screenWidth/2, screenHeight));

 GUILayout.BeginScrollView(scrollPosition/*, GUILayout.Width (screenWidth/2), GUILayout.Height (screenHeight/2)*/, "box");

 GUILayout.Label (new GUIContent(text), gs);

 // End the scrollview
 GUILayout.EndScrollView ();
 scrollViewRect = GUILayoutUtility.GetLastRect();
 GUILayout.EndArea();
}

这是假设scrollView位于屏幕的右半部分。

你能帮助我吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

GUI.BeginScrollView的API文档所示,您可以将Vector2分配给BeginScrollView的声明,以跟踪和更新框滚动到的位置。

我举一个例子:

using UnityEngine;
using System.Collections;

public class ScrollSize : MonoBehaviour {

private int screenBoxX  = Screen.width;
private int screenBoxY  = Screen.height;

private int scrollBoxX  = Screen.width  * 2;
private int scrollBoxY  = Screen.height * 3;

public Vector2 scrollPosition = Vector2.zero;

void Awake()
{
    Debug.Log ("box size is " + scrollBoxX + " " + scrollBoxY); 
}

void OnGUI()     
{
    scrollPosition = GUI.BeginScrollView(new Rect(0, 0, screenBoxX, screenBoxY),
                         scrollPosition, new Rect(0, 0, scrollBoxX, scrollBoxY));

    GUI.EndScrollView();

    // showing 4 decimal places
    Debug.Log ("Box scrolled @ " + scrollPosition.ToString("F4"));
}
}

对于此示例的解释,我们假设屏幕分辨率为800 x 600。 因此,屏幕上的可视滚动框将为800宽600高,滚动框的内部区域为1600乘1800。

我们通过将Gui.BeginScrollView()指定为Vector2的值scrollPosition来创建滚动框。当滚动框水平和垂直滚动时,Vector2将使用滚动值进行更新。

如果滚动条滚动到最左上方的位置,则scrollPosition的值将为0,0。

如果滚动条滚动到最右下方位置,则scrollPosition的值将为816,616,屏幕上框的大小加上滚动条的粗细。

答案 1 :(得分:2)

我知道这是3年之后,但也许它也会帮助其他人......

我发现将scrollPosition设置为一个非常高的数字会强制滚动条到底部:

scrollPosition.y = 999.9f;

然后你可以读到这样的位置:

scrollPosition = GUILayout.BeginScrollView(scrollPosition, 
                                           GUILayout.Width(370),  
                                           GUILayout.Height(135)); 

它将被设置为最大值。

希望这有帮助!