【问题标题】:Unity3d different screen sizes and limited play areaUnity3d 不同的屏幕尺寸和有限的游戏区域
【发布时间】:2016-10-16 21:05:05
【问题描述】:

我玩 Unity 已经有一段时间了,我在 android 上发布了一两个应用程序,但我还没有弄清楚移动设备上一直困扰我的一件真正重要的事情。

我看过各种教程,比如 unity2d 物理和类似的东西,我也看过一些教程,有人将地面精灵放在地上,然后将边缘碰撞器附加到一侧等等。

现在,我可能对此有误,但在我看来,如果您制作的任何游戏都需要设置任何类型的边界,或者在设定的游戏区域内与您碰撞的物体,您可以几乎从不使用编辑器进行任何类型的关卡设计,一切都必须通过脚本完成,因为您创建的每个对象都必须在启动时通过脚本设置其位置和大小,以适应各种屏幕尺寸。

我错了吗?确实有一种简单的方法来创建关卡,使用编辑器导入精灵并创建形状、边缘和对象,然后让游戏根据屏幕尺寸自动缩放并将对象移动到适当的限制?

对我来说,每次我做过安卓游戏或任何手机游戏。我必须通过脚本生成所有对象,通过脚本添加组件,并且通常通过脚本完成所有操作,直到我的实际编辑器几乎只有相机对象和附加到它的脚本,仅此而已。

有没有更简单的方法?因为到目前为止,我所看到的所有关于 2d 游戏的教程都对移动设备毫无用处,因为它们使用编辑器手动添加精灵和边缘对撞机,在我看来,这在 90% 的情况下看起来都不正确。

任何想法将不胜感激。

【问题讨论】:

    标签: mobile unity3d


    【解决方案1】:

    今天的游戏设计确实必须是被动的。

    非常非常困难,没有简单的或内置的解决方案。

    是的,不幸的是,在我们这个时代,这绝对是游戏设计的基本方面。

    要让 2D 游戏在所有不同的屏幕形状上运行确实非常非常困难。

    考虑说某种风景 2D 街机游戏 - 也许你会在其中互相射击。如果两个人在比赛,一个人的屏幕是 4:3,一个人的屏幕是 16:9,这实际上意味着什么?

    真的应该一个用户飞过屏幕需要更长的时间吗?!?您是否应该调整船的速度,使屏幕行驶时间保持不变?!?

    您是否应该在边缘显示更多内容?但是等等 - 这是否意味着某些玩家会收到更多警告来了解敌人或风景的到来??!

    没有人知道答案——这非常非常困难。

    这在概念上很困难,而且编程真的很痛苦。

    在回答您的问题时,Unity(或任何游戏引擎)中绝对没有内置方法来处理这些麻烦。

    几乎所有团队都有这样的代码......

    /* 
    Call this dynamically, probably from SizeCare or RotationCare
    
    Position something in relation to the dynamic screen edges
    - reactively so to speak
    
    This is critical for (for example) knowing where to launch sprites from,
    knowing where to dispose of them, and so on.
    */
    
    using UnityEngine;
    using System.Collections;
    
    public class KeepAtScreenEdges:MonoBehaviour
        {
        [Header("Left and right...")]
        public bool keepOnLeftEdge;
        public bool keepOnRightEdge;
        
        [Header("Bottom and top...")]
        public bool keepOnBottomEdge;
        public bool keepOnTopEdge;
        
        public void ScreenMaybeChanged()
            {
            if (keepOnLeftEdge) gameObject.ScreenLeft();
            if (keepOnRightEdge) gameObject.ScreenRight();
            
            if (keepOnBottomEdge) gameObject.ScreenBottom();
            if (keepOnTopEdge) gameObject.ScreenTop();
            }
        
        }
    

    你只要把它贴在一个标记上(标记:空游戏对象)

    有一个“左上角”...

    确实,您将拥有像这样的“反应性标记”的整个星座。

    然后,你在游戏中所做的每一件事,都与这些相关。

    因此,例如,您将有一个标记,用于“屏幕外敌人出现的地方,就在屏幕右边缘之外”。你会广泛地使用它来发射敌人,或者其他什么。

    您在编辑器中无能为力:一切都是反应式的。 (嗯,确实,你必须编写编辑器代码,使其也完全反应,因为在开发过程中:你

    请注意 - 谢天谢地 - Unity 令人敬畏的 .UI 系统当然是反应式的,谢天谢地,它负责“现代 frickin 反应式游戏布局”的 UI 方面。 (话说回来,要成为 .UI 方面的专家并不是那么容易,而且你必须做到。与“游戏布局反应性”相比,这绝对是微不足道的:/)

    再次 - 只是从根本上 - 忘记在技术上执行它! - 您是否会寻求“屏幕上的速度相等”或“始终在顶部显示更多树”之类的解决方案 - 或其他什么?太难了。

    【讨论】:

    • 谢谢,知道基于屏幕宽度和高度(如大小和速度)和基于边缘标记的位置做所有事情是一种有点准确的方法,我一直认为我错过了一些东西。基于所有教程总是在编辑器中轻松完成的事实,我一直认为我缺少一些魔法。
    • 是的,您实际上是 100% 正确的。你没有错过任何东西。您完全一针见血:不幸的是,“使用 Unity 制作游戏”是多么容易的“hello, world”示例完全没有抓住重点。你的发现是完全正确的!这是你从未见过的关于 Unity 的那些奇怪的“房间里的大象”。
    • 我猜想:Unity 已经有了他们(很棒的)反应式 UI 系统。并且 Unity 的“新”游戏 2D 系统(过去几年的)相当不错。我怀疑他们最终会为游戏 2D 系统引入“反应式”概念。目前,每个团队都有自己的解决方案 - 就像上面的示例代码一样,它是您知道的“我们的”解决方案代码库的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多