【问题标题】:Positioning gameobject from canvas to a 3D gameobject (Unity 3D)将游戏对象从画布定位到 3D 游戏对象(Unity 3D)
【发布时间】:2016-12-21 11:33:30
【问题描述】:

我是 Unity 的新手,我不知道如何获取 3D GameObject 相对于相机或画布的位置。

我知道Camera.main.ScreenPointToRay(target) 可以用来获取GameObject 的位置。有没有办法在相机视图或画布上获取GameObject 的位置?

我已经做了一个替代解决方案

  • 将图像移到画布之外。

  • 创建定位在目标 3D 上的盲图像 GameObject

但我不喜欢两者。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    我最近花了一些时间来解决这个问题。我的意图是在 3D 世界对象上放置一个 2D 箭头,并发现使用 Camera.WorldToViewportPoint()RectTransform.anchorMin/Max 是最好的解决方案。

    请注意,视点是标准化的 (0.0 - 1.0),而不是绝对像素位置:

    Vector3 screenPos = Camera.main.WorldToViewportPoint(someObject.transform.position);
    arrowImage.rectTransform.anchorMin = screenPos;
    arrowImage.rectTransform.anchorMax = screenPos;
    

    【讨论】:

      【解决方案2】:

      如果您想将游戏对象的位置投影到画布上,请使用以下代码:

      var pos = gameObject.transform.position;
      var vec2 = RectTransformUtility.WorldToScreenPoint(camera, pos);
      Debug.Log(vec2);
      

      在另一种情况下,如果您想获取 UI 游戏对象的屏幕坐标,请尝试以下操作:

      public static List<Vector2> GetScreenCoordinateOfUIRect(RectTransform rt)
      {
          Vector3[] corners = new Vector3[4];
          rt.GetWorldCorners(corners);
      
          var output = new List<Vector2>();
          foreach (Vector3 item in corners)
          {
              var pos = RectTransformUtility.WorldToScreenPoint(null, item);
              output.Add(pos);
          }
          return output;      
      }
      

      这样就可以得到一个UI游戏对象(有一个RectTransform组件)的屏幕点,以左下角为原点。注意这个屏幕点是独立于锚点的,在所有的锚点设置中,这个功能都有效!

      【讨论】:

      • 您还没有展示如何定位 2D 对象,当您这样做时,您可能会发现它不起作用。我知道,因为我自己也经历过。
      • 如何定位二维对象?介意澄清一下你的意思吗?
      • 好吧,我假设 OP 想要 UI 上的位置,以便他可以在该位置放置 2d 精灵。这部分问题并非微不足道。
      • 这取决于 OP 中所谓的“游戏对象”的性质。如果 this 指的是 UI 游戏对象,当然这是另一回事了,但我认为 OP 是指非 UI(3D)游戏对象。
      • MyObj.transform.position = Camera.main.WorldToScreenPoint(NonUIGameObj.transform.position); “WorldToScreenPoint”正是我所需要的。谢谢你。
      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多