Mux provides data binding infrastructure to Unity.
Mux is useful as a powerful UI toolkit on Unity, integrated with Mux.Markup.UI.
- Fully Open-source including dependencies (except Unity itself)
- Hackable
- Text-based representation
- No more clicking and dragging
- Easy to merge
- Fully managed
- Full stacktrace
- High portability
- High stablity
- Compiler-backed
- Less overhead
- uGUI-backed
- Easy to migrate to/from uGUI
- Powers Unity Editor Inspector
- Has rich documentation
- Xamarin.Forms-backed
- Proven data template/data binding infrastructure for UI
- Has rich documentation
- Familiar for Xamarin.Forms/WPF developers
- Minimal
- High maintainability
- Hot Reload
- Fast iteration
Unity Editor must be 2020.2 or possibly newer.
First, add this repository to the Project
manifest as com.pixiv.mux
, a dependency.
You will need Mux.Markup.UI (com.pixiv.mux.markup.ui
) if you would like to integrate Mux with uGUI.
Mux.Markup.Animation (com.pixiv.mux.markup.animation
) is for animation.
The target framework must be ".NET 4.x".
The following APIs are available:
Full APIs of System.Collections.Immutable
System.Collections.Immutable "provides collections that are thread safe and guaranteed to never change their contents, also known as immutable collections."
Xamarin.Forms XAML compiler and markups in MS-XAML-2009 are available. The difference from the original runtime is that it compiles XAML by default.
You can also write your own markup extension
using Xamarin.Forms.Xaml.IMarkupExtension
.
It can be annoted with Xamarin.Forms.AcceptEmptyServiceProviderAttribute
,
just like Xamarin.Forms markup extensions are.
DataTemplate
and
DataTemplateSelector
are available.
In addition to markups in [MS-XAML-2009], a data binding infrastructure is proted from Xamarin.Forms. Specifically, it includes:
Mux APIs provide Unity-specific runtime services and markups for Unity objects. Its documentation can be built with DocFX.
The documentation has a playground and exhibits examples with the component. However, there are something to be noted:
- The playground is built on an interpreter on IL2CPP.
- Managed bytecode stripping is disabled for
Xamarin.Forms.Xaml
and Mux assemblies.
Building documentation requires the following:
- MSBuild
- NPM
- Node.js
The following subprojects must be prepared as well:
- Mux.Markup.Animation at
.build/doc
- Mux.Markup.UI at
.build/doc
- Xamarin.Forms modified for Mux at
.build
Run Build
target of .build/doc/doc.msbuildproj
. PATH
environment variable must be configured so that Unity
,
npm
, and npx
can be resolved.
DocFX template used for the documentation is available at .docfx_template
. It is also used for
VRoid SDK documentation.
You need to merge it with the default template of DocFX to make it functional.
IL2CPP does not provide the constructor arguments of custom attributes. Due to that restriction, important attributes such as Xamarin.Forms.ContentPropertyAttribute will not work with the interpreter.
A workaround is to use the compiler.
Normal data binding relies on reflection, and Unity linker fails to figure out dependencies on a property. You have two options to resolve the problem:
-
Configure Unity Linker accordingly to prevent properties from being stripped.
See an article of Unity describing Unity linker.
Mux conforms to the .NET Core C# Coding Style. Use modified CodeFormatter to format your code when developing Mux.
CodeFormatter /copyright:Copyright.txt CodeFormatter.rsp
Provide documentations for public APIs. Please make sure DocFX does not emit any warnings nor errors.
Provide cross references to Unity with hyperlinks. You should check if the number of unresolved
uid is increased by passing --logLevel Verbose
when building the documentation.
Although modifications of Xamarin.Forms made for Mux is minimal, Mux depends on a number of internal interfaces:
- Xamarin.Forms.Build.Tasks.XamlCTask (Note that Mux uses the task without full MSBuild.)
- Xamarin.Forms.BindableObject.SetValueCore
- Xamarin.Forms.Device.PlatformServices
- Xamarin.Forms.Device.Info
- Xamarin.Forms.Internals.DeviceInfo
- Xamarin.Forms.Internals.IPlatformServices
- Xamarin.Forms.Internals.IResourceDictionary
- Xamarin.Forms.Internals.ISystemResourcesProvider
- Xamarin.Forms.Internals.INameScope.FindByName
- Xamarin.Forms.Internals.NameScope.GetNameScope
- Xamarin.Forms.Internals.ResourceLoader.ResourceProvider2
- Xamarin.Forms.Internals.Ticker
- Xamarin.Forms.ListProxy
- Xamarin.Forms.Xaml.TypeConversionAttribute
- Xamarin.Forms.Xaml.XamlResourceIdAttribute
Changes for those interfaces must be reviewed when altering Xamarin.Forms libraries.
Mux includes external dependencies. You can remove existing dependencies and recreate.
Run Clean
target of .build/Mux.msbuildproj
to clean all dependencies.
Run its Build
target on Mono to recreate.
See Licenses
directory or "Licenses" article of the documentation.