UGUI之ScrollRect添加响应事件后不能滑动

今天发现个问题UGUI的ScrollRect组件会和放在它上面的button或者toggle等组件有事件响应的冲突,具体体现为上面的组件会遮挡下面的响应,button或者toggle等组件上出现只能点击不能滑动的效果要想滑动必须点旁边才行。这样的用户体验是绝对不可以的,所以必须解决掉!

具体实例:

下面是项目中要送礼物的列表,我的GiftImage是整个黑色的背景,同时上面加了ScrollRect和toggle group(也就是ScrollRect)。因为Grid下面我用的都是Toggle。但是我用的是一个框架中的OnClick事件来响应Toggle的点击事件(和button的OnClick事件类似)。所以当鼠标和手指放到图片(也就是toggle)上时是不能实现滑动效果的。因为被toggle挡住了响应事件。



那么如何解决:网上大多资料说的都是button与ScrollRect的冲突而不是toggle。于是我把我的toggle换成了button做测试。----结果是网上的说法可以解决,具体如下:

把下面第一句代码放到start()里调用下面代码的方法就可以了(详细解释看下面):

第一句代码中的UIinit.flowergift是一个button(我这里是框架方法,实际就是一个button),然后直接用监听调用下面,最后可以解决与ScrollRect的冲突,也就是说既可以点击button实现点击功能又可以滑动。


 UIinit.flowergift.onClick.AddListener(delegate () { choosegiftflower(UIinit.flowergift.gameObject); });
 public void choosegiftflower(GameObject go)//花
    {
        //安卓选择花朵方法
       
        mSelectedGiftIndex = 1;
        matchgifts = allgiftslist[1];//本地图片和id匹配
        Debug.Log("flower" + matchgifts.name);
        // Debug.Log();
    }


button与ScrollRect的冲突解决了。下面看Toggle的了,我试了几次框架中方法(也就是用toggle来使用OnClick方法,在我的框架里是可行的,但是放到这个冲突里就不能用了)不可行最后只能放弃框架的用了isOn的方法。

把下面第一段代码放到update里,然后调用下面的方法,一样是可以解决与ScrollRect的冲突,也就是说既可以点击Toggle进行选择又可以滑动。


if (UIinit.flowergift != null)//花  
       {  
           if (UIinit.flowergift.isOn)  
           {  
               choosegiftflower();  
           }  
            
       }  

public void choosegiftflower()//花  
    {  
        //安卓选择花朵方法  
          
        mSelectedGiftIndex = 1;  
        matchgifts = allgiftslist[1];//本地图片和id匹配  
        Debug.Log("flower" + matchgifts.name);  
          
    }  


-----------------------------------------------------------------------------------------------------------------------------------------


今天后补一下我上面项目中那个ison的方法有时并不灵敏,应该是我项目里有其他的代码干扰。但这个方法确实可行,为此我又做了测试:

在这个测试项目里,我直接有四个toggle做成一个group放到grid里(和上个项目一样),image是一个滑动的列表,如下图2,同时添加一个mask;之后给canvas加一个脚本测试:

图2:

添加脚本测试:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class testtoggle : MonoBehaviour
{
    public GameObject[] fourtoggel;
 
    void Update()
    {
        if (fourtoggel[0].GetComponent<Toggle>().isOn == true)
        {

            Debug.Log("出现log1");
        }
        if (fourtoggel[1].GetComponent<Toggle>().isOn == true)
        {

            Debug.Log("出现log2");
        }
        if (fourtoggel[2].GetComponent<Toggle>().isOn == true)
        {

            Debug.Log("出现log3");
        }
        if (fourtoggel[3].GetComponent<Toggle>().isOn == true)
        {

            Debug.Log("出现log4");
        }

    }
}

最后log结果:


所以这个方法是可行的。但如果项目其他代码会对这里进行干扰建议使用button的方法。上述button的onclick方法没有任何问题。只是如果要有toggle的选中的对勾标志就得手动再去写代码了。

------------------------------------------关于button和toggle以及ScrollRect之间的冲突完毕---------------------------------------

下面讲关于手动写选中标志方法:

在我项目里,每个礼物都是一个button,都有一个对号标志的黄颜色图片,我给Grid里加一个脚本,对应把每个礼物旁边的黄颜色对号图片对应放进去(要按顺序放,顺序跟下面代码的顺序有关,为了方便建议依次放入)。


然后看看grid上的脚本:

using UnityEngine;
using System.Collections;

public class Showchoice : MonoBehaviour {
    public GameObject[] choices_ofbuttons;//多少个按钮的就有多少个选项  
    public int show_numburs;
    // Use this for initialization

    public void selectshow()
    {
        switch (show_numburs)
        {
            case 0:
                showed(show_numburs);
                break;
            case 1:
                showed(show_numburs);
                break;
            case 2:
                showed(show_numburs);
                break;
            case 3:
                showed(show_numburs);
                break;
            case 4:
                showed(show_numburs);
                break;
            case 5:
                showed(show_numburs);
                break;
            case 6:
                showed(show_numburs);
                break;
            case 7:
                showed(show_numburs);
                break;
        }

    }
    private void showed(int j)
    {

        choices_ofbuttons[0].SetActive(false);
        choices_ofbuttons[1].SetActive(false);
        choices_ofbuttons[2].SetActive(false);
        choices_ofbuttons[3].SetActive(false);
        choices_ofbuttons[4].SetActive(false);
        choices_ofbuttons[5].SetActive(false);
        choices_ofbuttons[6].SetActive(false);
        choices_ofbuttons[7].SetActive(false);
        choices_ofbuttons[j].SetActive(true);  //首先将所有的都置为false然后把传入的按个设置为真
    }
    void Start () {
        choices_ofbuttons[0].SetActive(false);
        choices_ofbuttons[1].SetActive(false);
        choices_ofbuttons[2].SetActive(false);
        choices_ofbuttons[3].SetActive(false);
        choices_ofbuttons[4].SetActive(false);
        choices_ofbuttons[5].SetActive(false);
        choices_ofbuttons[6].SetActive(false);
        choices_ofbuttons[7].SetActive(false);
    }
	
	// Update is called once per frame
	void Update () {
	
	}
}

上述方法的思路就是在start()里面让所以图标都不显示,然后选择了哪个就让哪个显示同时让其他的都重新不显示。这样就搞定了显示的方法!只要在调用这个代码的时候给show_numburs赋值和调用selectshow()就OK。每个button都赋值不同并且调用。如下:


这样就搞定了所有了!!!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Unity中使用UGUI实现居中放大滑动效果,可以按照以下步骤进行操作: 1. 创建一个新的Canvas对象,确保其Render Mode设置为Screen Space - Overlay。 2. 在Canvas下创建一个Panel作为容器,用于放置要滑动放大的内容。 3. 在Panel下创建一个Image或者其他UI组件,作为滑动放大的目标对象。 4. 为Panel添加一个Scroll Rect组件,用于实现滑动功能。在Scroll Rect的Content属性中指定目标对象。 5. 在Panel下创建一个空的GameObject,命名为Center,并将目标对象移动到Center下,确保目标对象的Pivot点位于(0.5, 0.5)。 6. 创建一个新的脚本,用于控制滑动放大的逻辑。可以将脚本挂载到Panel上。 7. 在脚本中添加以下代码: ``` using UnityEngine; using UnityEngine.UI; public class ScaleAndScroll : MonoBehaviour { public float minScale = 1.0f; public float maxScale = 2.0f; public float scrollSpeed = 0.1f; private ScrollRect scrollRect; private RectTransform centerRect; private void Start() { scrollRect = GetComponent<ScrollRect>(); centerRect = transform.Find("Center").GetComponent<RectTransform>(); } private void Update() { float scale = Mathf.Lerp(maxScale, minScale, scrollRect.normalizedPosition.y); centerRect.localScale = new Vector3(scale, scale, 1); } } ``` 8. 在脚本中的Inspector视图中,调整minScale和maxScale的值以控制目标对象的最小和最大放大倍数。 9. 运行场景,就能够看到滑动屏幕时目标对象会以中心为轴进行放大缩小的效果。 通过上述步骤,可以实现在Unity中使用UGUI实现居中放大滑动的效果。通过调整脚本中的参数,可以灵活调节滑动和放大的速度和比例。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值