【问题标题】:Touch on scroll UI Text interfering with the background map触摸滚动 UI 文本干扰背景地图
【发布时间】:2018-05-24 01:35:51
【问题描述】:

我正在开发一款可以用手指移动地图的手机游戏。当我点击屏幕的某些对象时,它会显示一个带有信息的 UI 文本滚动,但是当我触摸屏幕以滚动文本时,放置在背景中的地图会移动。当我在信息文本中滚动时,如何让地图不移动?

这是截图:

这是移动背景图的代码:

if(dragToPan){
        if(!mapping && ready){

            if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved) {

                if(Input.GetTouch(0).position.y > screenY/12){
                    Vector2 touchDeltaPosition  = Input.GetTouch(0).deltaPosition;

                    //Check if any of the tile borders has been reached
                    CheckBorders();
                    //Translate the camera
                    cam.Translate(-touchDeltaPosition.x*dragSpeed*Time.deltaTime, -touchDeltaPosition.y*dragSpeed*Time.deltaTime, 0);

                    //Clamp the camera position to avoid displaying any off the map areas
                    ClampCam();
                }
            }
        }   
    }           

这就是我启用滚动文本的方式:

public class SeleccionarTesoro_LIST : MonoBehaviour {

void Start()
{
    GameObject[] hitObject = GameObject.FindGameObjectsWithTag("TESOROS");
}

public void SetHitObjectToActive(GameObject hitObject)
{
    hitObject.transform.GetChild(0).GetChild(0).gameObject.SetActive (true);
    hitObject.transform.GetChild(0).GetChild(2).gameObject.SetActive (true);

}

void Update() {

    if (Input.GetMouseButtonDown (0)) 
    {
        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);


            if (Physics.Raycast (ray, out hit)) {
                SetHitObjectToActive (hit.collider.gameObject);
            }

        }
}
}

更新 1:我在第一个脚本中添加了这一行,它可以在 Unity 编辑器中运行,但不适用于 Android 和 iOS 设备。我该如何解决?

if (EventSystem.current.IsPointerOverGameObject() ||
        EventSystem.current.currentSelectedGameObject != null) {
        return;
    }

【问题讨论】:

  • 你也有 UI 文本的代码吗?每当用户在文本上拖动时,您可以禁用背景拖动吗?
  • @iamJP 我只是用我如何启用滚动文本的代码来更新我的问题。如何禁用背景拖动?
  • 这个问题对你有帮助吗? stackoverflow.com/questions/35529940/…?
  • @iamJP 我已经阅读了这篇文章并将这段代码添加到滚动文本所在的 UI 面板中,但我不知道我应该写什么代码才能工作: public class BlockUIelement : MonoBehaviour, IPointerDownHandler { public void OnPointerDown(PointerEventData eventData) { //code } }
  • 抱歉,我帮不上忙。但是,我建议您将所有输入处理代码放入一个 MonoBehaviour 类中。也许称它为“PlayerInput”。这样,您的代码可以在给定任何玩家输入的情况下对要做什么做出单一决定。在我看来,让多个对象处理触摸屏只是自找麻烦。

标签: c# unity3d


【解决方案1】:

如果您希望以这种方式继续,您可以尝试在后台移动脚本中使用布尔变量 isUIActive,该变量可以在您的其他脚本中设置为 false 或 true,并且无论何时您的文本获取active 将其设置为 true,并且每当 UI 被禁用时将其设置为 false。 在检查背景移动的输入之前,还要检查 isUIActive

类似这样的:

if (!isUIActive){
    if(dragToPan){
        if(!mapping && ready){
            ...

还有一个设置变量的函数:

public void SetUIActive (bool setTo){
     isUIActive = setTo;
}

你可以在需要的地方调用这个函数并设置它。 请注意,要使其正常工作,您需要在其他脚本中引用此脚本。 让我知道这是否有帮助。

【讨论】:

  • 感谢您的回答!如何在第二个脚本中实现这个变量?
  • 引用您的第一个脚本。所以在公共类 SeleccionarTesoro_LIST : MonoBehaviour { ... public YourFirstScriptClassName firstScript; public void Start(){ ... firstScript= GameObject.FindWithTag("GameObjectWithFirstScript").GetComponent();并在您使文本处于活动状态的更新函数中也添加这一行:firstScript.SetUIActive(true);在您使文本不活动的地方也一样,只需使用 false 调用该函数。让我知道这是否有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 2020-02-27
  • 1970-01-01
  • 2013-05-12
  • 2018-04-26
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多