【问题标题】:Unity3D Detecting the Edge of the Screen - Object is Flickering when movedUnity3D检测屏幕边缘 - 移动时对象闪烁
【发布时间】:2014-02-28 15:48:57
【问题描述】:

您好,我正在开发一个简单的 Space Shooter 风格的 2D 游戏,但我卡在了对象应该限制自己移动到屏幕左右边缘之外的地方。

我在 Unity Answers 中的一个答案中实现了@Waz 解决方案,如果对象不是刚体,它会很好用。但是,如果将其应用于刚体,则对象开始闪烁。下面是我从@Waz 使用的代码

    float speed = 0.1f;
    Vector3 viewPos = Camera.main.WorldToViewportPoint(transform.position);
    viewPos.x = Mathf.Clamp01(viewPos.x);
    viewPos.y = Mathf.Clamp01(viewPos.y);
    transform.position = Camera.main.ViewportToWorldPoint(viewPos);

这是@Waz 提到他的一段代码的链接: http://answers.unity3d.com/questions/148790/detecting-the-edge-of-the-screen.html

这是一个链接,上面说要为刚体使用替代解决方案,但此代码对我不起作用: http://answers.unity3d.com/questions/62189/detect-edge-of-screen.html

我不知道如何修改上面的代码,使我触摸和移动的对象不会闪烁。任何帮助都会很棒。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    您正在从任意浮点坐标转换到范围 [0,1] 并再次转换回来。当您的世界位置远离 0 时,您遇到的问题可能是由于浮点不准确造成的。

    有多种解决方法:

    1. 在您的上述脚本中,仅当它们实际接触到屏幕边缘时才执行转换。
    2. 处理OnBecameVisible()OnBecameInvisible() 消息。如果会导致玩家“隐身”,请不要让玩家离开屏幕。
    3. 使用来自this wiki 文章的IsVisibleFrom() 回调。 Some people 更喜欢这个,因为他们声称 OnBecameVisible()/OnBecameInvisible() 坏了。”
      我不知道他们是如何/为什么认为自己坏掉了。

    【讨论】:

    • 谢谢,我从另一篇帖子中得到建议,要求我使用 FixedUpdate 而不是 Update,这解决了闪烁问题。这是一个可行的解决方案吗?
    【解决方案2】:

    您是否尝试过使用 Screen.width 和 Screen.height 来检测屏幕边缘?也许它可以帮助防止闪烁。

    【讨论】:

    • 是的,我这样做了,这对我没有多大帮助。屏幕宽度和高度解决方案适用于 Web 和 PC,但不适用于 Android。闪烁问题现在已通过从 Update 移至 FixedUpdate 方法的相同代码得到修复
    • 我可以有另一个解决方案,我可以在屏幕的两个角放置两个带有碰撞器的不可见对象。所以,当我的宇宙飞船撞到这些角落时,这些物体会挡住飞船走出屏幕。但我不确定这个解决方案是否值得。
    • 但至少现在闪烁的问题得到了解决。嗯,我仍在研究使用 Unity 在 Android 设备上获取屏幕尺寸的方法,如果这似乎是一个更有价值的解决方案,我会将它们转发给你。顺便说一句,如果您只是在代码中设置尺寸怎么办?这样您就可以轻松获得边缘...哦,但是如果设备具有更高的分辨率,那么游戏输出将有黑色空间。
    • 对,我也尝试设置尺寸,但这在不同的分辨率下无法正常工作。
    • 感谢 Unity3Dstudent.com unity3dstudent.com/2010/11/…,我得到了一个非常简单的解决方案,这适用于 C#:transform.position = new Vector3(Mathf.Clamp(transform.position.x, -110, 10)、transform.position.y、transform.position.z);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多