首页 > 其他分享 >Unity 判断UI对象是否在屏幕内,并且把对象移进屏幕

Unity 判断UI对象是否在屏幕内,并且把对象移进屏幕

时间:2022-11-10 19:36:24浏览次数:48  
标签:moveDistance isInScreen 移进 ScreenWidthHalf pos Unity sizeDelta 屏幕 rect

  public static bool JudgmentUiInScreen(GameObject obj)
    {
        RectTransform rect = obj.GetComponent<RectTransform>();
        RectTransform uiRoot = rect.root.GetComponent<RectTransform>();
        Vector2 pivotVec = rect.pivot;
        Vector3 pos = uiRoot.InverseTransformPoint(obj.transform.position); //取得当前UI在屏幕当中的位置
        float upY, downY, leftX, rightX;
        downY = pos.y - rect.sizeDelta.y * pivotVec.y;
        upY = pos.y + rect.sizeDelta.y * (1 - pivotVec.y);
        leftX = pos.x - rect.sizeDelta.x * pivotVec.x;
        rightX = pos.x + rect.sizeDelta.x * (1 - pivotVec.x);
        Vector3 moveDistance = new Vector3(0, 0,0);
        int offset = 50;
        //判断当前的位置 与屏幕坐标的关系
        bool isInScreen = true;
        
        float ScreenWidthHalf = uiRoot.sizeDelta.x /2;
        float ScreenHeightHalf = uiRoot.sizeDelta.y /2;
        if (rightX > ScreenWidthHalf)
        {
            isInScreen = false;
            moveDistance.x = ScreenWidthHalf - rightX - offset;
        }
        else if (leftX < - ScreenWidthHalf)
        {
            isInScreen = false;
            moveDistance.x = -ScreenWidthHalf - leftX + offset;
        }

        if (upY > ScreenHeightHalf)
        {
            isInScreen = false;
            moveDistance.y = ScreenHeightHalf - upY - offset;
        }
        else if (downY < -ScreenHeightHalf)
        {
            isInScreen = false;
            moveDistance.y = -ScreenHeightHalf - downY + offset;
        }
        moveDistance.x = moveDistance.x + pos.x;
        moveDistance.y = moveDistance.y + pos.y;
        RectTransform parentRectTransform = rect.parent.GetComponent<RectTransform>();
        rect.transform.position =  uiRoot.TransformPoint(moveDistance); 
        //GameDebug.Log($"----------JudgmentUiInScreen ,[{isInScreen}],[{moveDistance}] ,[{ScreenWidthHalf}],[{ScreenHeightHalf}]");
        return isInScreen;
    }

  

标签:moveDistance,isInScreen,移进,ScreenWidthHalf,pos,Unity,sizeDelta,屏幕,rect
From: https://www.cnblogs.com/huangzzz/p/16878116.html

相关文章

  • 菜鸡学Unity 之 Unity中对游戏物体的常用操作旋转移动放缩
    LZ-Says:愿时光依旧,美好前方~前言本小节,我们一起来看下Unity中对游戏物体的常用操作旋转移动放缩这些基本骚操作吧~基本骚操作全程都可以简单操纵鼠标完成,当然,直接有效是......
  • unity 获取scene整体的bound包围盒以及center
    如下:多场景的情况也适合参考: https://gamedev.stackexchange.com/questions/134675/unity-bounds-includes-the-center-of-the-scene1privateList<Bounds>......
  • unity 对rotation、 localPosition、 localScale 进行修改
    unity对 rotation、localPosition、localScale进行修改 rotation:1、xxx.transform.localEulerAngles=newVector3(0.0f,0.0f,0.0f); 2、xxx.transform.rotat......
  • Unity描边的几种方式
    参考:在shader中实现五种描边方法从描边方式上来讲,大体可分为两种,一种是对着原模型往外扩大挤出,然后通过某种方式裁剪掉与原模型重合的地方,来实现描边。另一种则是通过算法......
  • Unity版本使用情况统计(更新至2022年10月)
    本期UWA发布的内容是第11期Unity版本使用统计,周期为2022年5月至2022年10月,数据来源于UWA网站(www.uwa4d.com)提测的项目。希望给Unity开发者一个行业参考,了解近半年来哪些Uni......
  • SAP ABAPI ME2N屏幕增强
    增加一个外部合同号  效果如下: ......
  • MvvmLight的接班人CommunityToolkit.Mvvm包使用介绍
    前面在一家军工类企业上班,公司没有网。最近在需要使用MVVM框架的时候才发现MvvmLight作者宣布停止更新了,有点可惜。微软出了一个CommunityToolkit.Mvvm包来接MvvmLight的......
  • unity3D. 移动的几种方式和区别
    Transform 放在Update中transform.Translate();----------------------------------------------------------------------------Rigidbody.物理放在FixedUpdate中......
  • unity游戏开发随记
    今天做一个scrollview下面list的动画,效果大概是:从右侧一个接一个滑倒左侧。因为父节点是用VerticalLayoutGroup做的所以我一开始想的是,scrollview获取子节点列表,然后传......
  • vue共享屏幕功能
    参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getDisplayMedia使用方法:https://developer.mozilla.org/zh-CN/docs/Web/API/Screen_Capture_A......