UniversalViewer/Assets/DanMachi/Scripts/DanMachiModelBuilder.cs

72 lines
2.5 KiB
C#
Raw Permalink Normal View History

2024-04-22 06:00:51 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class DanMachiModelBuilder : ModelBuilder
{
public static DanMachiModelBuilder Instance => GetInstance<DanMachiModelBuilder>();
public override IEnumerator SpawnSerializedCoroutine(ObjectContainerSerializable oc, Action<ObjectContainer> callback = null)
2024-04-22 06:00:51 +08:00
{
yield return base.SpawnSerializedCoroutine(oc);
switch (oc)
{
case DanMachiCharacterSerializable character:
{
var chara = SpawnAsset(AssetTypes.Character, character.AssetName);
chara.DeserializeFrames(character);
break;
}
default:
{
Error.Log(Color.red, "Data not recognized: " + oc.Filename + " " + oc.GUID);
break;
}
}
yield break;
}
public override ObjectContainer SpawnAsset(Enum assetType, string assetPath)
{
base.SpawnAsset(assetType, assetPath);
2024-04-22 06:00:51 +08:00
switch (assetType)
{
case AssetTypes.Unknown:
throw new NotImplementedException();
case AssetTypes.Character:
var asset = DanMachiAssetLibrary.Instance.Characters.First(c=>c.AssetName == assetPath);
return SpawnCharacter(asset);
2024-04-22 06:00:51 +08:00
default:
throw new NotImplementedException();
}
}
private DanMachiCharacterContainer SpawnCharacter(CharacterAsset asset)
2024-04-22 06:00:51 +08:00
{
var container = ObjectContainer.Create<DanMachiCharacterContainer>("Character");
var handle = UIHandle.CreateAsChild<UIHandleMain>(container.transform).Init(container);
container.Build(asset);
var animationSets = DanMachiAssetLibrary.Instance.Animations.Where(a => a.Category == asset.Category && a.Id == asset.Id);
var defaultAnimSet = animationSets.FirstOrDefault(a => a.Costume == "common");
defaultAnimSet ??= animationSets.FirstOrDefault();
if (defaultAnimSet != null)
{
var animSetDropdown = container.CharacterPanel.AnimationSetDropdown;
var option = animSetDropdown.options.FindIndex(d => d.text == defaultAnimSet.Costume);
if (option != -1)
{
animSetDropdown.value = option;
container.CharacterPanel.AnimationDropdown.value = 1;
}
}
DanMachiMain.Instance.SelectObject(container);
2024-04-22 06:00:51 +08:00
return container;
}
}