This commit is contained in:
2024-04-22 00:00:51 +02:00
parent cf04700131
commit 11fd1a3d92
54 changed files with 11144 additions and 1416 deletions

View File

@@ -0,0 +1,140 @@
using TMPro;
using System.Linq;
using UnityEngine;
using UnityEngine.Events;
using System.Collections.Generic;
using System;
public class CharacterDropdown : MonoBehaviour
{
[SerializeField] private TMP_Dropdown MainDropdown;
[SerializeField] private TMP_InputField MainLabel;
public List<string> DropdownLabels = new List<string>() { "Character", "Costume" };
public List<TMP_Dropdown> Dropdowns = new List<TMP_Dropdown>();
public List<TMP_InputField> Labels = new List<TMP_InputField>();
private bool _awake;
private void Awake()
{
if (_awake) return;
_awake = true;
Rebuild();
}
private void Rebuild()
{
var labelParent = MainLabel.transform.parent;
var dropdownParent = MainDropdown.transform.parent;
MainDropdown.ClearOptions();
Dropdowns.Clear();
Dropdowns.Add(MainDropdown);
foreach (var child in dropdownParent.GetComponentsInChildren<TMP_Dropdown>())
{
if (child != MainDropdown) Destroy(child);
}
foreach (var child in labelParent.GetComponentsInChildren<TMP_Dropdown>())
{
if (child != MainLabel) Destroy(child);
}
MainDropdown.name = DropdownLabels[0];
MainLabel.text = DropdownLabels[0];
foreach (var label in DropdownLabels.Skip(1))
{
var dd = Instantiate(MainDropdown, dropdownParent);
dd.name = "dropdown_" + label;
var ll = Instantiate(MainLabel, labelParent);
ll.name = label + " (TMP)";
ll.text = label;
Dropdowns.Add(dd);
}
}
public void SetData(List<CharacterAsset> characters)
{
Awake();
SetDropdownData(0, characters.Select(c => c.Category).Distinct().ToList(), true, true);
UnityAction<int> groupCallback = (index) =>
{
if (index == 0) return;
var category = GetOption(0);
SetDropdownData(1, characters.Where(c => c.Category == category).Select(c => c.Id).Distinct().ToList(), true, true);
//SetDropdownData(2, new List<string>(), true, true);
};
UnityAction<int> charaCallback = (index) =>
{
if (index == 0) return;
var category = GetOption(0);
var id = GetOption(1);
var costumes = characters.Where(c => c.Category == category && c.Id == id);
var costume = costumes.FirstOrDefault(c => c.Costume == "common");
costume ??= costumes.First();
DanMachiModelBuilder.Instance.SpawnCharacter(costume);
//SetDropdownData(2, characters.Where(c => c.Category == category && c.Id == id).Select(c => c.Costume).ToList(), true, true);
};
//UnityAction<int> costumeCallback = (index) =>
//{
// var chara = DanMachiAssetLibrary.Instance.GetCharacter(GetOption(0), GetOption(1), GetOption(2));
// StartCoroutine(DanMachiModelBuilder.Instance.SpawnAsset(AssetTypes.Character, chara));
//};
SetCallbacks(new List<UnityAction<int>>()
{
groupCallback,
charaCallback
});
}
public void SetCallbacks(List<UnityAction<int>> callbacks)
{
if (callbacks.Count < Dropdowns.Count)
{
Error.Log(Color.red, $"Incorrect number of callbacks for dropdowns. Got {callbacks.Count}, required {Dropdowns.Count}");
}
for (int i = 0; i < Dropdowns.Count; i++)
{
Dropdowns[i].onValueChanged.RemoveAllListeners();
Dropdowns[i].onValueChanged.AddListener(callbacks[i]);
}
}
public void OnDropdownSelected(int selection)
{
if (selection == 0)
{
Debug.LogError("Delete Current");
}
StartCoroutine(ModelBuilder.GetInstance().SpawnAsset(AssetTypes.Character, MainDropdown.options[selection].text));
}
public void SetDropdownData(string label, List<string> options, bool nullValue = false, bool sortValues = false)
{
var depth = DropdownLabels.IndexOf(label);
SetDropdownData(depth, options, nullValue, sortValues);
}
public string GetOption(int depth)
{
if (Dropdowns[depth].value == 0) return null;
return Dropdowns[depth].options[Dropdowns[depth].value].text;
}
public void SetDropdownData(int depth, List<string> options, bool nullValue = false, bool sortValues = false)
{
if (depth >= Dropdowns.Count || depth < 0)
{
Error.Log(Color.red, $"Dropdown {depth} out of range");
return;
}
ModelViewerInterface.SetDropdownData(Dropdowns[depth], options, nullValue, sortValues);
}
}

View File

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

View File

@@ -0,0 +1,63 @@
using System;
using System.Linq;
using UnityEngine;
public class CharacterPanel : MonoBehaviour
{
public ExtendedDropdown AnimationSetDropdown;
public ExtendedDropdown AnimationDropdown;
public ExtendedDropdown CostumeDropdown;
private DanMachiCharacterContainer _selectedChara;
public static CharacterPanel Create(DanMachiCharacterContainer chara)
{
var panel = Instantiate(DanMachiAssetLibrary.Instance.CharacterPanel, ModelViewerInterface.GetInstance().DynamicPanels.transform);
panel.Init(chara);
return panel;
}
public void Init(DanMachiCharacterContainer chara)
{
_selectedChara = chara;
CostumeDropdown.SetOptions(DanMachiAssetLibrary.Instance.Characters.Where(a => a.Category == chara.Data.Category && a.Id == chara.Data.Id).Select(a => a.Costume).ToList());
CostumeDropdown.SetValueWithoutNotify(chara.Data.Costume);
AnimationSetDropdown.SetOptions(DanMachiAssetLibrary.Instance.Animations.Where(a => a.Category == chara.Data.Category && a.Id == chara.Data.Id).Select(a => a.Costume).ToList(), true);
}
public void SelectCostume(int value)
{
var pose = _selectedChara.SerializeFrame();
var data = _selectedChara.Data;
var newData = DanMachiAssetLibrary.Instance.Characters.First(c => c.Category == data.Category && c.Id == data.Id && c.Costume == CostumeDropdown.options[value].text);
var chara = DanMachiModelBuilder.Instance.SpawnCharacter(newData);
chara.PastePose(pose, PoseLoadOptions.All());
}
public void SelectAnimationSet(int value)
{
if(value == 0)
{
AnimationDropdown.SetOptions(null);
return;
}
var data = _selectedChara.Data;
var animSet = DanMachiAssetLibrary.Instance.Animations.First(a => a.Category == data.Category && a.Id == data.Id && a.Costume == AnimationSetDropdown.options[value].text);
_selectedChara.LoadAnimationSet(animSet);
AnimationDropdown.SetOptions(_selectedChara.Animations.Select(a=>a.name).ToList(), true);
}
public void SelectAnimation(int value)
{
if (value == 0)
{
_selectedChara.PlayAnimation((AnimationClip)null);
return;
}
else
{
_selectedChara.PlayAnimation(_selectedChara.Animations[value-1]);
}
}
}

View File

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