Unity3D隐形画布表现

时间:2017-10-31 12:13:28

标签: android ios performance unity3d

我开发了一款2d菜单重型手机游戏,它使用了大量的画布,面板,弹出窗口等。一开始我的所有菜单都处于活动状态,但只有用户可以使用的菜单才能使用在平截头体内(即其他人刚刚翻译出来)。然后我切换到停用用户无法看到的菜单,只是为了提高游戏性能。然而,这给我带来许多不便,例如取消和重新激活GameObject时Animator组件中的状态变量重置。

那么最好的方法是什么?暂时未使用的画布的停用是否值得,或者Unity是否会自动删除位于平截头体外的UI,因此基本上没有性能成本?

3 个答案:

答案 0 :(得分:3)

正如你所说的游戏菜单很重,即使禁用/启用也会导致开销。这是我过去在我的一个项目中遇到的问题。

建议是在菜单对象上使用Canvas Group并更改其alpha(0 =已关闭,1 =已打开),Interactable和BlockRaycasts参数。

如果每个菜单/面板上都有菜单脚本,只需在打开/关闭时禁用/启用它。

enter image description here

<强>更新

Canvas Group的典型用途是:

  • 通过在Window的GameObject上添加Canvas组并控制其Alpha属性,淡入或淡出整个窗口。
  • 通过将Canvas组添加到父GameObject并将其Interactable属性设置为false,使整组控件不可交互(“变灰”)。
  • 通过在元素或其父元素上放置Canvas Group组件并将其Block Raycasts属性设置为false,使一个或多个UI元素不阻止鼠标事件。

其他参考资料:

https://www.youtube.com/watch?v=wbmjturGbAQ

https://github.com/Unitarian/Unity-Extensions/tree/master/Menus

希望这有帮助

答案 1 :(得分:1)

如何创建

这样的界面
public interface IOpenable
    {

        bool IsClosed { get; set; }

        void OpenWindow();
    }
}

然后让每个元素订阅一些控制器,并且该控制器可以处理所有这样的事情

public class MenuController: MonoBehaviour
{
    public List<IOpenable> MenuList;

    void Awake()
    {
        MenuList = new List<IOpenable>();
    }
    public void TryClose(IOpenable sender)
    {
        foreach (var i in MenuList)
        {
            if (!i.IsClosed && !sender.Equals(i))
                        i.OpenWindow();         
        }
    }
}

通过这种方式,您可以尝试关闭打开新窗口时不需要的所有其他窗口。这只是一个粗略的想法,但对我来说似乎干净而且快。

答案 2 :(得分:0)

根据this Unity optimization document,禁用画布(不停用其游戏对象!)是隐藏它的最佳方法。

禁用和重新启用画布很便宜。