我开发了一款2d菜单重型手机游戏,它使用了大量的画布,面板,弹出窗口等。一开始我的所有菜单都处于活动状态,但只有用户可以使用的菜单才能使用在平截头体内(即其他人刚刚翻译出来)。然后我切换到停用用户无法看到的菜单,只是为了提高游戏性能。然而,这给我带来许多不便,例如取消和重新激活GameObject时Animator组件中的状态变量重置。
那么最好的方法是什么?暂时未使用的画布的停用是否值得,或者Unity是否会自动删除位于平截头体外的UI,因此基本上没有性能成本?
答案 0 :(得分:3)
正如你所说的游戏菜单很重,即使禁用/启用也会导致开销。这是我过去在我的一个项目中遇到的问题。
建议是在菜单对象上使用Canvas Group并更改其alpha(0 =已关闭,1 =已打开),Interactable和BlockRaycasts参数。
如果每个菜单/面板上都有菜单脚本,只需在打开/关闭时禁用/启用它。
<强>更新强>
Canvas Group的典型用途是:
其他参考资料:
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,禁用画布(不停用其游戏对象!)是隐藏它的最佳方法。
禁用和重新启用画布很便宜。