【问题标题】:How to fix a Unity 2d object to the edge of a screen?如何将 Unity 2d 对象固定到屏幕边缘?
【发布时间】:2020-04-03 18:48:09
【问题描述】:

我正在 Unity 中制作游戏,其中对象在唤醒状态下生成为网格类型模式。我希望第一个对象生成在屏幕的左边缘,其他对象紧随其后。 当我在统一的内置游戏测试器中进行测试时,我已经或多或少地正常工作了。我什至尝试了不同的分辨率,但看起来还不错。
但是,当我构建项目然后对其进行测试时,所有对象都在镜头外,看起来与预览构建完全不同。
我已经尝试了许多可以在 google 上找到的各种建议,但它们似乎并没有更好

我实例化第一个对象的方式是首先使用

int ix = -(Camera.main.scaledPixelWidth / 2) 获取屏幕边缘的 X 值

然后我将添加对象的一半宽度,使用

var renderer = clone.GetComponent<Renderer>();
float width = renderer.bounds.size.x / 2f;
ix += (int) width;

我也尝试过使用 screen.width 和 Camera.main.PixelWidth 值,它们都是相同的......它们在 Unity 的内置游戏预览中的所有纵横比看起来都很好,但是当我这样做时Windows 或 WebGL 的构建对象在屏幕外开始,只有最后几个对象会在屏幕上呈现。
无论分辨率如何,是否有人对让对象精确呈现在边缘的方法有任何建议?

我意识到如果手动布置对象可能会更好,但是对象需要在关卡开始时渲染,因为想法是重用一个场景并根据解析的 xml 文件加载资产,因为这是一个难题游戏,我希望用户最终也能够创建自己的谜题。

【问题讨论】:

  • 您在使用画布吗?您知道此值将在像素空间中,不一定在世界空间单位中
  • 是的,我正在使用画布,它被设置为主摄像头并随屏幕大小缩放。 UI 元素正在正确呈现。那么对于世界空间单位,我是否需要以某种方式使用相机 ViewportToWorldPoint 函数?
  • 如果您需要世界空间中的坐标,那么它将是 ScreenToWorldPoint .. 否则:只是使用 HorizontalLayoutGroup 并将您的对象作为它的子对象生成选项?有了这个,您根本不需要脚本,只需在 RectTransforms 中正确配置内容
  • 好的,我会看看我是否能弄清楚如何使用 ScreenToWorldPoint。我想过一个布局组,但问题是元素的数量会变化,对象的大小可能会变化,所以看起来很奇怪。但是,如果我不能正确使用屏幕到世界点功能,我会尝试使用组。感谢您的提示。
  • 刚刚尝试了该组,它破坏了我需要的拖放元素的能力,所以它必须是我认为的 screentoworldpoint 选项,或类似的东西

标签: c# unity3d


【解决方案1】:

既然您已经谈到 Canvas 内的 UI 元素,所有您需要做的就是正确设置锚点和枢轴点。

在你的预制件中已经这样做了

或以后通过代码,例如

var rectTransform = clone.GetComponent<RectTransform>();
var anchorsVector = new Vector2(0,0.5f);
rectTransform.pivot = anchorsVector;
rectTransform.anchorMin = anchorsVector;
rectTransform.acnhorMax = anchorsVector;

现在您需要做的就是将此对象设置到位置x=0 以将其“附加”到左边缘。使用此当前设置y=0 表示垂直居中。您当然可以根据自己的需要进行更改。

rectTransform.anchoredPosition = new Vector2(0, 0);

在这个小演示中

public class Example : MonoBehaviour
{
    [ContextMenu("Test")]
    private void Test()
    {
        var rectTransform = GetComponent<RectTransform>();
        var anchorsVector = new Vector2(0,0.5f);
        rectTransform.pivot = anchorsVector;
        rectTransform.anchorMin = anchorsVector;
        rectTransform.anchorMax = anchorsVector;

        rectTransform.anchoredPosition = new Vector2(0, 0);
    }
}

【讨论】:

  • 好的,我认为这适用于文本和其他 UI 元素。如果没有 RectTransform,它将如何处理普通的游戏对象?
  • 如果它们在画布中,只需将 RectTransform 添加到它们并执行相同操作
  • OK 效果不太对,盒子碰撞器被移开。我确信它可以很容易地修复,但我发现使用 Screen to WorldPoint 似乎可以做我想做的事,因为左下角总是 0,0,我可以将我的起始 X 位置设置为零并以这种方式工作.无论如何,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 2017-04-23
  • 2021-10-12
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多