美文网首页
Unity中ScrollRect与OnDrag事件的冲突解决方法

Unity中ScrollRect与OnDrag事件的冲突解决方法

作者: 沉麟 | 来源:发表于2019-10-22 09:47 被阅读0次

    项目需要:一个ScrollView里面的物体既可以点击,也可以整体滑动ScrollView,按住物体两秒还能实现拖拽。

    using Constants;
    using System.Collections;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    using DG.Tweening;
    
    public class DragPlant : BasePlant, IPointerUpHandler, IPointerExitHandler, IDragHandler, IBeginDragHandler, IEndDragHandler, IPointerDownHandler
    {
        //IDragHandler, IBeginDragHandler, IEndDragHandler,
        public int selfId =1;
        public bool useing =false;//使用中  未使用1
        public int selfLv  =1;//自身等级 三种形态   幼儿期/成长期/成熟期
        public long selfProfit = 0;//自身平均收益
        public string selfName = "";//自身平均收益
        public Sprite selfIcon = null;//自身图标
    
        //自身父物体
        private Transform myParent;
    
        //Panel,使拖拽是显示在最上方.
        private Transform tempParent;
        private CanvasGroup cg;
        private RectTransform rt;
        private GameObject targetObj = null;
    
        //记录鼠标位置.
        private Vector3 newPosition;
        DragPlant go;
    
        private bool isPutDown = false;//是否按下
        private float dis = 0.1f;//按下与抬起之间的距离
        private float putDownTime = 2f;//总的按下时间
        private float curDownTime = 0;//当前时间
        private Vector3 curPos;//当前位置
        private Vector3 endPos;//上次位置
        
        //使用中的标志
        [Header("使用中的标志")]
        public GameObject plantUse;
        //点击下降位置
        Vector3 downPos;
        //是否暂停动画
        // bool isStop = false;
        Animator plantAnim;
        //实例化的收益物体
        public UnitPool unit;
        //产生收益的位置
        private Transform startTran;
        private  Vector3 startPos;
        //植物图片
        public  Image plantImage;
    
    
        private void Awake()
        {
            //添加CanvasGroup组件用于在拖拽时忽略自己,从而检测到被交换的图片.
            if (gameObject.GetComponent<CanvasGroup>() == null)
            {
                cg = this.gameObject.AddComponent<CanvasGroup>();
            }
            else
            {
                cg = gameObject.GetComponent<CanvasGroup>();
            }
    
            rt = transform.GetComponent<RectTransform>();
            tempParent = GameObject.Find("UIMgr").transform;
            EventManager.Instance.AddEvent<Vector3>(EventKey.EventFarmPointDown, this.OnFarmPointDown);
        }
    
        void Start()
        {       
            myParent = transform.parent;
            startTran = transform.Find("StartPos");
            startPos = startTran.position;
            plantImage = transform.Find("plantImage").GetComponent<Image>();
            plantAnim = plantImage.transform.GetComponent<Animator>();
    
            transform.GetComponent<Button>().onClick.AddListener(OnPlantClick);
            OnRefreshImg();
        }
    
        void Update()
        {
            if (isPutDown)
            {
                curDownTime += Time.deltaTime * 1;
                if (curDownTime > 0.5f && Vector3.Distance(endPos, curPos) <= dis)
                {
                    //显示圆形读条
                    if (!DynamicData.Instance.isRing)
                    {
                        HomeLayer.Instance.ShowRing();
                        DynamicData.Instance.isRing = true;
                    }
    
                }
    
                if (curDownTime >= putDownTime)
                {
                    if (Vector3.Distance(endPos, curPos) > dis)
                    {
                        curDownTime = 0f;
                        return;
                    }
                    curDownTime = 0f;
                    isPutDown = false;
                    DynamicData.Instance.isDragPlant = true;
                    HomeLayer.Instance.ShowRing();
                    HomeManager.Instance.ShowOpts();
                }
            }
        }
    
        public void OnFarmPointDown(Vector3 pointer) {
            
        }
    
        /// <summary>
        /// 开始拖拽
        /// </summary>
        /// <param name="eventData"></param>
        public void OnBeginDrag(PointerEventData eventData)
        {
    
            if (!DynamicData.Instance.isDragPlant)
            {
                HomeLayer.Instance.farmScroll.OnBeginDrag(eventData);
                return;
            }
            //拖拽开始时记下自己的父物体.
            myParent = transform.parent;
            //拖拽开始时禁用检测.
            cg.blocksRaycasts = false;
            transform.SetParent(tempParent);
            ////创建半透明植物残影
            //go = Instantiate(this, myParent);
            //go.transform.localPosition = Vector3.zero;
            //go.transform.GetComponent<Image>().color = new Color(1f, 1f, 1f, 0.3f);
            //显示选框
            //HomeManager.Instance.ShowIsEmptyOpt();
            //HomeLayer._instance.tempParent.position = myParent.position;
            //if (plantUse.activeInHierarchy)
            //{
            //    plantUse.transform.SetParent(transform);
            //    plantUse.SetActive(false);
            //}
            //transform.SetParent(HomeLayer._instance.tempParent);
            //LayoutFream._instance.ShowFreamAll(); //显示选框
            //显示可回收标识
            //Debug.LogError("开始拖拽植物");
        }
      
        /// <summary>
        /// 拖拽中
        /// </summary>
        /// <param name="eventData"></param>
        public void OnDrag(PointerEventData eventData)
        {
    
            curPos = eventData.position;
    
            if (!DynamicData.Instance.isDragPlant)
            {
                HomeLayer.Instance.farmScroll.OnDrag(eventData);
                return;
            }
            //if (HomeLayer.Instance.BGImage.raycastTarget)
            //{
            //    return;
            //}
    
            GameObject target = eventData.pointerEnter;
    
            //被选中的图片压暗
            //if (target.transform.parent.tag == "Pergola"&& target.tag == "plant")
            //{
            //    if (targetObj != null && targetObj != target)
            //    {
            //        targetObj.GetComponent<Image>().color = Color.white;
            //    }
            //    target.transform.GetComponent<Image>().color = new Color(0.8f, 0.8f, 0.8f, 1f);
            //    targetObj = target;
            //}
    
            //拖拽时图片跟随鼠标移动.
            RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, Input.mousePosition, eventData.enterEventCamera, out newPosition);
            transform.position = newPosition;
            SetDrag(eventData);
            //Debug.LogError("拖拽中");
    
            //if (target.transform.tag == "plant")
            //{
    
            //    //如果有物体
            //    if (target.GetComponent<DragPlant>())
            //    {
            //        //Debug.LogError("交换位置:" + target.name);
            //        Transform t = target.transform.parent;
            //        target.transform.SetParent(myParent);
            //        target.GetComponent<Image>().raycastTarget = false;
            //        target.transform.DOLocalMove(Vector3.zero, 0.35f).OnComplete(() => {
            //            target.GetComponent<Image>().raycastTarget = true;
            //        });
    
            //        myParent = t;
            //        //transform.SetParent(myParent);
    
            //    }
            //}
    
    
        }
    
        /// <summary>
        /// 结束拖拽  判断鼠标下的物体
        /// </summary>
        /// <param name="eventData"></param>
        public void OnEndDrag(PointerEventData eventData)
        {
            if (!DynamicData.Instance.isDragPlant)
            {
                HomeLayer.Instance.farmScroll.OnEndDrag(eventData);
                return;
            }
    
            //隐藏标识
            HomeManager.Instance.HideOpts();
            //获取鼠标下面的物体.
            GameObject target = eventData.pointerEnter;
            if (target == null)
            {
                //Debug.LogError("拖拽位置有误:" + target.name);
                transform.SetParent(myParent);
                transform.localPosition = Vector3.zero;
                //拖拽结束时启用检测.
                cg.blocksRaycasts = true;
                return;
            }
    
            //如果能检测到物体.
            if (target && target.tag == "Pergola" || target.transform.parent.tag == "Pergola")
            {
                //如果是花架
                if (target.tag == "Pergola")
                {
                    //如果花架里没东西
                    if (target.transform.GetComponentInChildren<DragPlant>() == null && target.tag == "Pergola")
                    {
                        //Debug.LogError("空花架:" + target.name);
                        myParent = target.transform;
                        transform.SetParent(myParent);
                        transform.DOLocalMove(Vector3.zero, 0.5f);
    
                    }
                    else
                    {
                        //Debug.LogError("有物体:" + target.transform.GetChild(0).name);
                        transform.SetParent(myParent);
                        transform.DOLocalMove(Vector3.zero, 0.5f);
    
                    }
                }
                else if (target.transform.tag == "plant")
                {
    
                    //如果有物体
                    if (target.GetComponent<DragPlant>())
                    {
                        //Debug.LogError("交换位置:" + target.name);
                        Transform t = target.transform.parent;
                        target.transform.SetParent(myParent);
                        target.transform.DOLocalMove(Vector3.zero, 0.35f);
                        myParent = t;
                        transform.SetParent(myParent);
                        transform.DOLocalMove(Vector3.zero, 0.5f);
                    }
                }
                else
                {
                    //Debug.LogError("有物体:" + target.transform.GetChild(0).name);
                    transform.SetParent(myParent);
                    transform.DOLocalMove(Vector3.zero, 0.5f);
                }
    
            }
            else if (target.tag == "ShowPlantArea")
            {
                //Debug.LogError("展示当前盆栽:" + target.name);
                transform.SetParent(myParent);
                transform.DOLocalMove(Vector3.zero, 0.5f);
                if (selfLv >= 60)
                {
                    AppData.Instance.curPlant = selfId;
                    target.transform.GetComponentInChildren<ShowCurPlant>().Show(AppData.Instance.curPlant);
                }
                
            }
            else
            {
                //Debug.LogError("拖拽位置有误:" + target.name);
                transform.SetParent(myParent);
                transform.DOLocalMove(Vector3.zero, 0.5f);
    
            }
            
            //保存信息
    
            //拖拽结束时启用检测.
            cg.blocksRaycasts = true;
            //HomeLayer.Instance.BGImage.raycastTarget = true;
            DynamicData.Instance.isDragPlant = false;
            DynamicData.Instance.isRing = false;
            //刷新
            //DynamicData.Instance.onEndDragCount++;
            //HomeLayer._instance.text.text = "end:" + target.name + DynamicData.Instance.onEndDragCount.ToString();
            //Debug.LogError("OnEndDrag:" + DynamicData.Instance.onEndDragCount);      
        }
    
        public void OnPointerExit(PointerEventData eventData)
        {
            //GameObject target = eventData.pointerEnter;
            //if (target.transform.parent.tag == "Pergola")
            //{
            //    target.transform.GetComponent<Image>().color = new Color(1f, 1f, 1f, 1f);
            //}
        }
    
        ///// <summary>
        ///// 植物升级 切换精灵
        ///// </summary>
        //public void UpLv(int lv)
        //{
        //    //Debug.Log(AppData.Instance.plantShopDic[AppData.Instance.curPlant].selfId+"升级植物的等级");
        //    if (AppData.Instance.isUp && selfId == AppData.Instance.curPlant && selfLv < 60)
        //    {
        //        selfLv += lv;
        //        //Growth(selfLv);
        //        if (selfLv >= 60)
        //        {
        //            selfLv = 60;
        //            AppData.Instance.isPlantAgain = true;
        //            return;
        //        }
        //        AppData.Instance.isUp = false;
        //    }
        //}
    
        /// <summary>
        /// 各个成长期精灵切换
        /// </summary>
        /// <param name="lv"></param>
        public void Growth()
        {
            if (selfLv >= 60)
            {
                selfLv = 60;
            }
            if (selfLv <= 20)
            {
                StartCoroutine(LoadSprite("younian" + selfId, 1));
            }
            else if (selfLv <= 40)
            {
                StartCoroutine(LoadSprite("chengzhangqi_" + selfId, 2));
            }
            else if(selfLv >= 60)
            {
                StartCoroutine(LoadSprite("zhiwu" + selfId, 3));
            }
            
            transform.Find("GrowthFx").gameObject.SetActive(true);
            transform.Find("GrowthFx").GetComponent<ParticleSystem>().Play();
        }
    
        /// <summary>
        /// 根据植物成长期更换精灵图片
        /// </summary>
        /// <param name="pathName"></param>
        /// <param name="lv"></param>
        IEnumerator LoadSprite(string pathName, int lv)
        {
            yield return null;
            SoundManager.Instance.Play(Enums.SoundId.lv);
            string spritePath = pathName;
            Image image = plantImage;
    
            Sprite sp = Resources.Load<Sprite>(string.Format("UI/Plant/{0}/{1}", lv, spritePath));
            image.sprite = sp;
            yield return new WaitForSeconds(2f);
            transform.Find("GrowthFx").gameObject.SetActive(false);
        }
    
        public void OnRefreshImg()
        {
         
            if (selfLv <= 20)
            {
                string str = "younian" + selfId.ToString();
                plantImage.sprite = Resources.Load<Sprite>(string.Format("UI/Plant/{0}/{1}", 1, str));
            }
            else if (selfLv <= 40)
            {
                string str = "chengzhangqi_" + selfId.ToString();
                plantImage.sprite = Resources.Load<Sprite>(string.Format("UI/Plant/{0}/{1}", 2, str));
            }
            else if (selfLv >= 60)
            {
                string str = "zhiwu" + selfId.ToString();
                plantImage.sprite = Resources.Load<Sprite>(string.Format("UI/Plant/{0}/{1}", 3, str));
            }
        }
    
        /// <summary>
        /// 连续点击产生收益------------???不回收
        /// </summary>
        public void OnPlantClick()
        {
    
            //Debug.Log("OnPlantClick:......");
            curDownTime = 0;
            if (Application.isMobilePlatform)
            {
                for (int i = 0; i < Input.touchCount; ++i)
                {
                    Touch touch = Input.GetTouch(i);
                    transform.GetComponent<UIEffect>().PlayFX(touch.position);
                }
            }
            else
            {
                transform.GetComponent<UIEffect>().PlayFX(Input.mousePosition);
            }
            int dex = Random.Range(20, 29);//随机音效
            SoundManager.Instance.Play((Enums.SoundId)dex);
            plantAnim.speed = 0;
            ContinuousProduce();
            UpDown();
        }
    
    
        /// <summary>
        /// 植物下降升起动画
        /// </summary>
        public void UpDown()
        {
            downPos = transform.GetComponent<RectTransform>().anchoredPosition;
            downPos.y += 10;
            transform.GetComponent<RectTransform>().anchoredPosition = downPos;
            StartCoroutine(PlantDown());
        }
    
        IEnumerator PlantDown()
        {
            yield return new WaitForSeconds(0.1f);
            downPos.y -= 10;
            transform.GetComponent<RectTransform>().anchoredPosition = downPos;
            plantAnim.speed = 1;
        }
    
        /// <summary>
        /// 连续产生收益
        /// </summary>
        public void ContinuousProduce()
        {
            //Debug.Log("------连续产生收益------");
            UnitPool unit1 = PoolManager.Instance.GetUnit(PoolManager.PoolType.PoolEarning, (UnitPool unit) =>
            { return ((EarningPool)unit).Id == 1; });
            unit1.transform.SetParent(startTran);
            //Debug.Log(unit1.transform.parent);
            unit1.transform.position = startPos;
            unit1.transform.localScale = Vector3.one;
            StartCoroutine(WaitClose(unit1));
        }
        //播放动画后连续收益关闭
        IEnumerator WaitClose(UnitPool unit)
        {
            yield return new WaitForSeconds(2f);
            CloseEarning(unit);
    
        }
    
    
        /// <summary>
        /// 正常产生收益
        /// </summary>
        public void ProduceEarning()
        {
            //   Debug.Log("------正常产生收益------");
            unit = PoolManager.Instance.GetUnit(PoolManager.PoolType.PoolEarning, (UnitPool unit) =>
            { return ((EarningPool)unit).Id == 1; });
            unit.transform.SetParent(startTran);
            //    Debug.Log(unit.transform.parent);
            unit.transform.position = startPos;
            unit.transform.localScale = Vector3.one;
        }
    
        /// <summary>
        /// 正常收益关闭
        /// </summary>
        /// <param name="unit"></param>
        public void CloseEarning(UnitPool unit)
        {
            PoolManager.Instance.SetUnit(unit);
            unit.transform.SetParent(startTran);
        }
        
        /// <summary>
        /// 拖拽时的位置
        /// </summary>
        /// <param name="eventData"></param>
        void SetDrag(PointerEventData eventData)
        {
    
            Vector3 pos;
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.enterEventCamera, out pos))
            {
                pos.y += 1f;
                transform.position = pos;
            }
        }
    
        /// <summary>
        /// 点击抬起  
        /// </summary>
        /// <param name="eventData"></param>
        public void OnPointerUp(PointerEventData eventData)
        {
           
            curPos = Vector3.zero;
            endPos = Vector3.zero;
            isPutDown = false;
        }
       
        /// <summary>
        /// 在回收栏实例化  转换信息 
        /// </summary>
        void CollectMessage()
        {
           GameObject gb  = Instantiate(Resources.Load("Prefab/RecoverItem/PlantRecover"), UIMgr.Instance.recoverParent) as GameObject;
            RescoverItem rt = gb.GetComponent<RescoverItem>();
           // AppData.Instance.returnPlants.Add(selfId, this);
             AppData.Instance.reList.Add(this);
            AppData.Instance.isSignRecover = true;
            rt.reID = selfId;
            rt.reLv = selfLv;
            rt.plantName = selfName;
            rt.earning = selfProfit;
            rt.reIcon = Resources.Load<Sprite>(string.Format("UI/PlantIcon/icon{0}", selfId));
            AppData.Instance.list_reItem.Add(rt);
        }  
    
        /// <summary>
        /// 展示台刷新
        /// </summary>
        private void OnFreash()
        {
            if (transform.parent.tag == "showPlank")
            {
                AppData.Instance.curPlayID = selfId;//把在使用中的植物赋到游戏场景中
            }
        }
    
        //是否触碰到回收标志
        bool istrigger = false;
        //private void OnTriggerEnter2D(Collider2D collision)
        //{
        //    //触碰选框 播放动画
        //    if (collision.gameObject.tag == "chooseFream"&& collision.transform.parent!=transform.parent)
        //    {
        //        Debug.Log(collision.gameObject.tag);
        //        LayoutFream._instance.ShowFreamOne(collision.transform);//显示选框
    
        //    }
        //    //触碰回收标志 
        //    if (collision.gameObject.tag=="recover")
        //    {
        //        collision.transform.localScale = Vector3.one * 2f;
        //        istrigger = true;
    
        //    }
        //}
    
    
        //private void OnTriggerExit2D(Collider2D collision)
        //{
        //    if (collision.gameObject.tag == "chooseFream"&& collision.transform.parent != transform.parent)
        //    {
        //        Debug.Log(collision.gameObject.tag);
        //        LayoutFream._instance.CloseFreamOne(collision.transform);//关闭选框
        //    }
        //    if (collision.gameObject.tag == "recover")
        //    {
        //        collision.transform.localScale = Vector3.one;
              
        //    }
        //}
    
    
        /// <summary>
        /// 植物的数据  记录数据使用
        /// </summary>
        /// <returns></returns>
        public PlantData GetPlantData() {
            return new PlantData()
            {
                selfId = selfId,
                useing = useing,
                selfLv = selfLv,
               selfProfit = selfProfit
    
            };
        }
    
        public void OnPointerDown(PointerEventData eventData)
        {
            //DynamicData.Instance.isDragPlant = false;
            //throw new System.NotImplementedException();
            //StartCoroutine(Timer());
    
            endPos = Input.mousePosition;
            curPos = Input.mousePosition;
            isPutDown = true;
    
        }
    
        IEnumerator Timer()
        {
            yield return new WaitForSeconds(2f);
            DynamicData.Instance.isDragPlant = true;
            //endPos = Input.mousePosition;
            //if (Vector3.Distance(endPos, startPos) < 0.1f)
            //{
            //    DynamicData.Instance.isDragPlant = true;
    
            //    GetComponent<Image>().raycastTarget = false;
            //    HomeManager.Instance.ShowOpts();
            //}
            //Debug.LogError("Vector3.Distance(endPos,startPos)" + Vector3.Distance(endPos, startPos));
        }
    }
    

    将脚本挂到物体上做成预制物,既可以拖拽,滑动,也能点击。

    相关文章

      网友评论

          本文标题:Unity中ScrollRect与OnDrag事件的冲突解决方法

          本文链接:https://www.haomeiwen.com/subject/vjwfvctx.html