Action Bar Weapon Group Binding

Selecting a weapon now displays weapon group toggles
Added global drag and drop handling in game manager
Weapon group toggles can be dragged to action bar to bind them
This commit is contained in:
Reinier Vens 2021-04-19 03:46:35 +01:00
commit 9779afb1bb
24 changed files with 1213 additions and 27 deletions

View file

@ -0,0 +1,40 @@
using UnityEditor;
using UnityEditor.SceneManagement;
[InitializeOnLoad]
public class PlayScenePlusPlus
{
static PlayScenePlusPlus()
{
if(EditorPrefs.HasKey("PlayScene"))
{
EditorSceneManager.playModeStartScene = AssetDatabase.LoadAssetAtPath<SceneAsset>(EditorPrefs.GetString("PlayScene"));
}
}
[MenuItem("Edit/Play Scene/Set Static", false)]
private static void SelectPlayScene()
{
EditorSceneManager.playModeStartScene = Selection.activeObject as SceneAsset;
EditorPrefs.SetString("PlayScene", AssetDatabase.GetAssetPath(EditorSceneManager.playModeStartScene));
}
[MenuItem("Edit/Play Scene/Set Static", true)]
private static bool SelectPlaySceneValidate()
{
return Selection.objects.Length == 1 && Selection.activeObject is SceneAsset;
}
[MenuItem("Edit/Play Scene/Clear", false)]
private static void ClearPlayScene()
{
EditorSceneManager.playModeStartScene = null;
EditorPrefs.DeleteKey("PlayScene");
}
[MenuItem("Edit/Play Scene/Clear", true)]
private static bool ClearPlaySceneValidate()
{
return EditorSceneManager.playModeStartScene;
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e7f42430a0ad52b46a18c43afbb72406
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -4,6 +4,7 @@ using JsonKnownTypes;
using MessagePack;
using Newtonsoft.Json;
using TMPro;
using UniRx.Triggers;
using UnityEngine;
using UnityEngine.UI;
@ -15,6 +16,8 @@ public class ActionBarSlot : MonoBehaviour
public Image InputIcon;
public TextMeshProUGUI QuantityRemaining;
public Image Fill;
public ObservablePointerEnterTrigger PointerEnterTrigger;
public ObservablePointerExitTrigger PointerExitTrigger;
private ActionBarBinding binding;
public Entity Entity { get; set; }
@ -27,6 +30,8 @@ public class ActionBarSlot : MonoBehaviour
binding = value;
if (binding == null)
{
Fill.fillAmount = 0;
Label.gameObject.SetActive(false);
QuantityRemaining.gameObject.SetActive(false);
Icon.gameObject.SetActive(false);
}
@ -179,7 +184,8 @@ public class ActionBarWeaponGroupBinding : ActionBarBinding
public ActionBarWeaponGroupBinding(Entity entity, ActionBarSlot slot, int group) : base(entity, slot)
{
Group = group;
slot.Label.text = $"G{Group}";
slot.Label.gameObject.SetActive(true);
slot.Label.text = $"G{Group+1}";
Slot.Icon.gameObject.SetActive(false);
}

View file

@ -81,6 +81,7 @@ public class ActionGameManager : MonoBehaviour
[Header("Input Icons")]
public Sprite ShiftIcon;
public Sprite MouseLeftIcon;
public Sprite MouseRightIcon;
public Sprite MouseMiddleIcon;
[Header("Scene Links")]
@ -161,6 +162,9 @@ public class ActionGameManager : MonoBehaviour
(float2(0, -1), "Rear")
};
private DragAction _dragAction;
private Action<DragAction> _endDragCallback;
public EntitySettings NewEntitySettings
{
get => MessagePackSerializer.Deserialize<EntitySettings>(MessagePackSerializer.Serialize(Settings.GameplaySettings.DefaultEntitySettings));
@ -325,9 +329,36 @@ public class ActionGameManager : MonoBehaviour
var action = new InputAction(binding: controlPath);
_actionBarActions.Add(action);
var slot = Instantiate(ActionBarSlot, ActionBar);
slot.Binding = null;
_actionBarSlots.Add(slot);
action.started += context => slot.Binding?.Activate();
action.canceled += context => slot.Binding?.Deactivate();
slot.PointerEnterTrigger.OnPointerEnterAsObservable().Subscribe(_ =>
{
//Debug.Log($"Pointer entered action bar slot {controlPath}");
RegisterDragTarget(dragAction =>
{
//Debug.Log("Registering binding!");
switch (dragAction)
{
case EquippedItemDragAction equippedItemDragAction:
break;
case ItemInstanceDragAction itemInstanceDragAction:
break;
case WeaponGroupDragAction weaponGroupDragAction:
slot.Binding = new ActionBarWeaponGroupBinding(CurrentEntity, slot, weaponGroupDragAction.Group);
break;
default:
throw new ArgumentOutOfRangeException(nameof(dragAction));
}
});
});
slot.PointerExitTrigger.OnPointerExitAsObservable().Subscribe(_ =>
{
//Debug.Log($"Pointer exited action bar slot {controlPath}");
UnregisterDragTarget();
});
return slot;
}
@ -340,8 +371,7 @@ public class ActionGameManager : MonoBehaviour
left.InputLabel.gameObject.SetActive(false);
var right = createBinding("<Mouse>/rightButton");
right.InputIcon.sprite = MouseLeftIcon;
right.InputIcon.transform.localScale = new Vector3(-1, 1, 1);
right.InputIcon.sprite = MouseRightIcon;
right.InputLabel.gameObject.SetActive(false);
var middle = createBinding("<Mouse>/middleButton");
@ -467,6 +497,27 @@ public class ActionGameManager : MonoBehaviour
});
}
public void BeginDrag(DragAction dragAction)
{
_dragAction = dragAction;
}
public void RegisterDragTarget(Action<DragAction> onEndDrag)
{
_endDragCallback = onEndDrag;
}
public void UnregisterDragTarget()
{
_endDragCallback = null;
}
public void EndDrag()
{
_endDragCallback?.Invoke(_dragAction);
_dragAction = null;
}
public void EnablePlayerInput()
{
Input.Player.Enable();
@ -1015,4 +1066,36 @@ public class ActionGameManager : MonoBehaviour
}
}
}
}
public abstract class DragAction{}
public class WeaponGroupDragAction : DragAction
{
public WeaponGroupDragAction(int group)
{
Group = group;
}
public int Group { get; }
}
public class ItemInstanceDragAction : DragAction
{
public ItemInstanceDragAction(ItemInstance item)
{
Item = item;
}
public ItemInstance Item { get; }
}
public class EquippedItemDragAction : DragAction
{
public EquippedItemDragAction(EquippedItem item)
{
Item = item;
}
public EquippedItem Item { get; }
}

View file

@ -36,7 +36,10 @@ public class PropertiesPanel : MonoBehaviour
public IncrementField IncrementField;
public StatSheet StatSheet;
public CurveField CurveField;
public WeaponGroupAssignment WeaponGroupAssignment;
public RectTransform Content;
public RectTransform DragParent;
[HideInInspector] public FlatFlatButton SelectedChild;
[HideInInspector] public ActionGameManager GameManager;
@ -45,6 +48,9 @@ public class PropertiesPanel : MonoBehaviour
protected event Action RefreshPropertyValues;
protected bool RadioSelection = false;
private RectTransform _dragObject;
protected event Action<GameObject> OnPropertyAdded;
protected Action OnPropertiesChanged;
@ -462,6 +468,33 @@ public class PropertiesPanel : MonoBehaviour
AddItemProperties(item.EquippableItem);
AddSpacer();
if (item.GetBehavior<Weapon>() != null)
{
var weaponGroups = Instantiate(WeaponGroupAssignment, Content ?? transform);
weaponGroups.Inspect(item);
var dragOffset = Vector2.zero;
Transform dragObject = null;
weaponGroups.OnBeginDragAsObservable().Subscribe(x =>
{
//Debug.Log($"Began dragging weapon group {x.group}");
GameManager.BeginDrag(new WeaponGroupDragAction(x.group));
dragObject = Instantiate(weaponGroups.Groups[x.group], DragParent, true).transform;
dragOffset = (Vector2)dragObject.position - x.pointerEventData.position;
});
weaponGroups.OnDragAsObservable().Subscribe(x =>
{
dragObject.position = x.pointerEventData.position + dragOffset;
});
weaponGroups.OnEndDragAsObservable().Subscribe(x =>
{
//Debug.Log($"Ended dragging weapon group {x.group}");
GameManager.EndDrag();
Destroy(dragObject.gameObject);
});
Properties.Add(weaponGroups.gameObject);
OnPropertyAdded?.Invoke(weaponGroups.gameObject);
}
var gearData = GameManager.ItemManager.GetData(item.EquippableItem);
var statusSheet = AddStatSheet();

View file

@ -0,0 +1,65 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UniRx;
using UnityEngine;
using UnityEngine.EventSystems;
public class WeaponGroupAssignment : MonoBehaviour
{
public RectTransform Container;
public WeaponGroupElement GroupPrefab;
public Color ActiveColor;
public Color InactiveColor;
Subject<(PointerEventData pointerEventData, int group)> _onBeginDrag;
Subject<(PointerEventData pointerEventData, int group)> _onDrag;
Subject<(PointerEventData pointerEventData, int group)> _onEndDrag;
public List<WeaponGroupElement> Groups { get; } = new List<WeaponGroupElement>();
public void Inspect(EquippedItem item)
{
var weapon = item.GetBehavior<Weapon>();
if (weapon == null) throw new ArgumentException($"Attempted to inspect weapon groups on item \"{item.Data.Name}\" but no weapon is present!");
var groupCount = ActionGameManager.Instance.Settings.GameplaySettings.TriggerGroupCount;
for (int i = 0; i < groupCount; i++)
{
var i1 = i;
bool groupContainsItem() => item.Entity.TriggerGroups[i1].items.Contains(item);
var group = Instantiate(GroupPrefab, Container);
Groups.Add(group);
group.Label.text = $"G{i+1}";
group.Label.color = groupContainsItem() ? ActiveColor : InactiveColor;
group.Button.onClick.AddListener(() =>
{
if (groupContainsItem())
{
item.Entity.TriggerGroups[i1].items.Remove(item);
item.Entity.TriggerGroups[i1].weapons.Remove(weapon);
group.Label.color = InactiveColor;
}
else
{
item.Entity.TriggerGroups[i1].items.Add(item);
item.Entity.TriggerGroups[i1].weapons.Add(weapon);
group.Label.color = ActiveColor;
}
});
group.BeginDragTrigger.OnBeginDragAsObservable()
.Subscribe(data => _onBeginDrag?.OnNext((data, i1)));
group.DragTrigger.OnDragAsObservable()
.Subscribe(data => _onDrag?.OnNext((data, i1)));
group.EndDragTrigger.OnEndDragAsObservable()
.Subscribe(data => _onEndDrag?.OnNext((data, i1)));
}
}
public UniRx.IObservable<(PointerEventData pointerEventData, int group)> OnBeginDragAsObservable() =>
_onBeginDrag ?? (_onBeginDrag = new Subject<(PointerEventData pointerEventData, int group)>());
public UniRx.IObservable<(PointerEventData pointerEventData, int group)> OnDragAsObservable() =>
_onDrag ?? (_onDrag = new Subject<(PointerEventData pointerEventData, int group)>());
public UniRx.IObservable<(PointerEventData pointerEventData, int group)> OnEndDragAsObservable() =>
_onEndDrag ?? (_onEndDrag = new Subject<(PointerEventData pointerEventData, int group)>());
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b9b213fc96d20d848819b8159412680c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,15 @@
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UniRx.Triggers;
using UnityEngine;
using UnityEngine.UI;
public class WeaponGroupElement : MonoBehaviour
{
public TextMeshProUGUI Label;
public Button Button;
public ObservableBeginDragTrigger BeginDragTrigger;
public ObservableDragTrigger DragTrigger;
public ObservableEndDragTrigger EndDragTrigger;
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 27f5673ad060b834489cad765159cb84
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: