protected override void OnAttach() { base.OnAttach(); // Create the UI for the wizard. this.Slot.Name = "MeshCollider Management Wizard"; base.Slot.Tag = "Developer"; NeosCanvasPanel neosCanvasPanel = base.Slot.AttachComponent <NeosCanvasPanel>(); neosCanvasPanel.Panel.AddCloseButton(); neosCanvasPanel.Panel.AddParentButton(); neosCanvasPanel.Panel.Title = "MeshCollider Management Wizard"; neosCanvasPanel.CanvasSize = new float2(800f, 900f); UIBuilder uIBuilder = new UIBuilder(neosCanvasPanel.Canvas); List <RectTransform> rectList = uIBuilder.SplitHorizontally(0.5f, 0.5f); // Build left hand side UI - options and buttons. UIBuilder uIBuilder2 = new UIBuilder(rectList[0].Slot); Slot _layoutRoot = uIBuilder2.VerticalLayout(4f, 0f, new Alignment()).Slot; uIBuilder2.FitContent(SizeFit.Disabled, SizeFit.MinSize); uIBuilder2.Style.Height = 24f; UIBuilder uIBuilder3 = uIBuilder2; // Slot reference to which changes will be applied. _text = "Process root slot:"; uIBuilder3.Text(in _text); uIBuilder3.Next("Root"); uIBuilder3.Current.AttachComponent <RefEditor>().Setup(ProcessRoot); uIBuilder3.Spacer(24f); // Basic filtering settings for which MeshColliders are accepted for changes or listing. _text = "Ignore inactive:"; uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(IgnoreInactive)); _text = "Ignore disabled:"; uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(IgnoreDisabled)); _text = "Ignore non-persistent:"; uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(IgnoreNonPersistent)); _text = "Ignore user hierarchies:"; uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(IgnoreUserHierarchies)); _text = "Tag:"; tag.Target = uIBuilder3.HorizontalElementWithLabel(in _text, 0.2f, () => uIBuilder3.TextField()); _text = "Tag handling mode:"; uIBuilder3.Text(in _text); uIBuilder3.EnumMemberEditor(useTagMode); uIBuilder3.Spacer(24f); // Settings for highlighing individual colliders. _text = "Highlight duration:"; uIBuilder3.HorizontalElementWithLabel(in _text, 0.8f, () => uIBuilder3.PrimitiveMemberEditor(HighlightDuration)); _text = "Highlight color:"; uIBuilder3.Text(in _text); uIBuilder3.ColorMemberEditor(HighlightColor); uIBuilder3.Spacer(24f); // Controls for specific replacement collider settings. _text = "Replacement collider component:"; uIBuilder3.Text(in _text); uIBuilder3.EnumMemberEditor(replacementColliderComponent); _text = "Replacement setup action:"; uIBuilder3.Text(in _text); uIBuilder3.EnumMemberEditor(setupBoundsType); uIBuilder3.Spacer(24f); _text = "Preserve existing collider settings:"; uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(PreserveColliderSettings)); _text = "Set collision Type:"; uIBuilder3.Text(in _text); Slot _hideTextSlot = _layoutRoot.GetAllChildren().Last(); uIBuilder3.EnumMemberEditor(setColliderType); Slot _hideEnumSlot = _layoutRoot.GetAllChildren().Last().Parent.Parent; _text = "Collider Mass:"; Slot _hideFloatSlot = uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.PrimitiveMemberEditor(Mass)).Slot.Parent; _text = "Set CharacterCollider:"; Slot _hideBoolSlot1 = uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(SetCharacterCollider)).Slot.Parent; _text = "Set IgnoreRaycasts:"; Slot _hideBoolSlot2 = uIBuilder3.HorizontalElementWithLabel(in _text, 0.9f, () => uIBuilder3.BooleanMemberEditor(SetIgnoreRaycasts)).Slot.Parent; uIBuilder3.Spacer(24f); // Hide some options if preserving existing settings. var _valCopy = _layoutRoot.AttachComponent <ValueCopy <bool> >(); var _boolValDriver = _layoutRoot.AttachComponent <BooleanValueDriver <bool> >(); var _valMultiDriver = _layoutRoot.AttachComponent <ValueMultiDriver <bool> >(); _valCopy.Source.Target = PreserveColliderSettings; _valCopy.Target.Target = _boolValDriver.State; _boolValDriver.TrueValue.Value = false; _boolValDriver.FalseValue.Value = true; _boolValDriver.TargetField.Target = _valMultiDriver.Value; for (int i = 0; i < 5; i++) { _valMultiDriver.Drives.Add(); } _valMultiDriver.Drives[0].Target = _hideTextSlot.ActiveSelf_Field; _valMultiDriver.Drives[1].Target = _hideEnumSlot.ActiveSelf_Field; _valMultiDriver.Drives[2].Target = _hideBoolSlot1.ActiveSelf_Field; _valMultiDriver.Drives[3].Target = _hideBoolSlot2.ActiveSelf_Field; _valMultiDriver.Drives[4].Target = _hideFloatSlot.ActiveSelf_Field; // Buttons for batch actions. _text = "List matching MeshColliders"; uIBuilder3.Button(in _text, PopulateList); _text = "Replace all matching MeshColliders"; uIBuilder3.Button(in _text, ReplaceAll); _text = "Remove all matching MeshColliders"; uIBuilder3.Button(in _text, RemoveAll); uIBuilder3.Spacer(24f); _text = "------"; resultsText.Target = uIBuilder3.Text(in _text); // Build right hand side UI - list of found MeshColliders. UIBuilder uIBuilder4 = new UIBuilder(rectList[1].Slot); uIBuilder4.ScrollArea(); uIBuilder4.VerticalLayout(10f, 4f); _scrollAreaRoot = uIBuilder4.FitContent(SizeFit.Disabled, SizeFit.MinSize).Slot; // Prepare UIBuilder for addding elements to MeshCollider list. _listBuilder = uIBuilder4; _listBuilder.Style.MinHeight = 40f; }