You've already forked UniversalViewer
fixes
This commit is contained in:
20
Assets/DanMachi/Scripts/CharacterAsset.cs
Normal file
20
Assets/DanMachi/Scripts/CharacterAsset.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
[System.Serializable]
|
||||
public class CharacterAsset : AssetSpawnData
|
||||
{
|
||||
public string Category;
|
||||
public string Id;
|
||||
public string Costume;
|
||||
public string AssetName;
|
||||
|
||||
public CharacterAsset(string assetName, string filePath)
|
||||
{
|
||||
var split = assetName.Split(new char[] { '_', '.' });
|
||||
|
||||
AssetType = AssetTypes.Character;
|
||||
Category = split[1];
|
||||
Id = split[2];
|
||||
Costume = split[3];
|
||||
AssetName = assetName;
|
||||
FilePath = filePath;
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/CharacterAsset.cs.meta
Normal file
11
Assets/DanMachi/Scripts/CharacterAsset.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 60ff7794a9208e347a9dccb94be34c2c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DanMachi/Scripts/Containers.meta
Normal file
8
Assets/DanMachi/Scripts/Containers.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0ff11836c100a9c4b9ec7f5be413dae0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
265
Assets/DanMachi/Scripts/Containers/DanMachiCharacterContainer.cs
Normal file
265
Assets/DanMachi/Scripts/Containers/DanMachiCharacterContainer.cs
Normal file
@@ -0,0 +1,265 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
|
||||
{
|
||||
public CharacterAsset Data;
|
||||
public string AnimationSet;
|
||||
public string Animation;
|
||||
|
||||
public MorphPanel MorphPanel;
|
||||
public CharacterPanel CharacterPanel;
|
||||
public List<AnimationClip> Animations;
|
||||
private Animator _animator;
|
||||
private AnimatorOverrideController _animatorController;
|
||||
private Dictionary<HumanBodyBones, Transform> _humanBones = new Dictionary<HumanBodyBones, Transform>();
|
||||
|
||||
public override void Select()
|
||||
{
|
||||
if(MorphPanel != null)
|
||||
{
|
||||
MorphPanel.gameObject.SetActive(true);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Deselect()
|
||||
{
|
||||
if (MorphPanel != null)
|
||||
{
|
||||
MorphPanel.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void Build(CharacterAsset model)
|
||||
{
|
||||
Data = model;
|
||||
var characterAsset = AssetBundle.LoadFromFile(model.FilePath);
|
||||
var animationSets = DanMachiAssetLibrary.Instance.Animations.Where(a => a.Category == model.Category && a.Id == model.Id);
|
||||
|
||||
foreach (var go in characterAsset.LoadAllAssets<GameObject>())
|
||||
{
|
||||
Instantiate(go, transform);
|
||||
}
|
||||
characterAsset.Unload(false);
|
||||
|
||||
SetDefaultMaterials(transform);
|
||||
|
||||
Init();
|
||||
|
||||
var defaultAnimSet = animationSets.FirstOrDefault(a => a.Costume == "common");
|
||||
LoadAnimationSet(defaultAnimSet);
|
||||
}
|
||||
|
||||
public void Init()
|
||||
{
|
||||
_animator = GetComponentInChildren<Animator>();
|
||||
_animator.applyRootMotion = false;
|
||||
_animator.runtimeAnimatorController = _animatorController = Instantiate(SharedResources.Instance.GenericAnimatorController);
|
||||
CreateMorphPanel();
|
||||
CreateCharacterPanel();
|
||||
SetBones();
|
||||
}
|
||||
|
||||
public void LoadAnimationSet(CharacterAsset animationSet)
|
||||
{
|
||||
if (animationSet != null)
|
||||
{
|
||||
AnimationSet = animationSet.Costume;
|
||||
Animation = "";
|
||||
var animationAsset = AssetBundle.LoadFromFile(animationSet.FilePath);
|
||||
Animations = animationAsset.LoadAllAssets<AnimationClip>().ToList();
|
||||
animationAsset.Unload(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void PlayAnimation(string clipName)
|
||||
{
|
||||
var anim = Animations.FirstOrDefault(a=>a.name == clipName);
|
||||
PlayAnimation(anim);
|
||||
}
|
||||
|
||||
public void PlayAnimation(AnimationClip anim)
|
||||
{
|
||||
if(anim == null)
|
||||
{
|
||||
Animation = "";
|
||||
_animator.enabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
Animation = anim.name;
|
||||
_animator.enabled = true;
|
||||
_animatorController["Anim"] = anim;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetDefaultMaterials(Transform t)
|
||||
{
|
||||
List<Material> materials = new List<Material>();
|
||||
foreach (var renderer in t.GetComponentsInChildren<Renderer>())
|
||||
{
|
||||
foreach (var material in renderer.sharedMaterials)
|
||||
{
|
||||
if (materials.Contains(material)) continue;
|
||||
materials.Add(material);
|
||||
material.shader = Shader.Find("UniversalStandard");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetBones()
|
||||
{
|
||||
var humanBones = new Dictionary<HumanBodyBones, Transform>();
|
||||
var allBones = _animator.transform.GetComponentsInChildren<Transform>().ToDictionary(b=>b.name, b=>b);
|
||||
humanBones.Add(HumanBodyBones.Hips, TryGet(allBones,"Hips"));
|
||||
humanBones.Add(HumanBodyBones.Spine, TryGet(allBones,"Spine"));
|
||||
humanBones.Add(HumanBodyBones.RightUpperLeg, TryGet(allBones,"RightUpLeg"));
|
||||
humanBones.Add(HumanBodyBones.RightLowerLeg, TryGet(allBones,"RightLeg"));
|
||||
humanBones.Add(HumanBodyBones.RightFoot, TryGet(allBones,"RightFoot"));
|
||||
humanBones.Add(HumanBodyBones.RightToes, TryGet(allBones,"RightToeBase"));
|
||||
humanBones.Add(HumanBodyBones.LeftUpperLeg, TryGet(allBones,"LeftUpLeg"));
|
||||
humanBones.Add(HumanBodyBones.LeftLowerLeg, TryGet(allBones,"LeftLeg"));
|
||||
humanBones.Add(HumanBodyBones.LeftFoot, TryGet(allBones,"LeftFoot"));
|
||||
humanBones.Add(HumanBodyBones.LeftToes, TryGet(allBones,"LeftToeBase"));
|
||||
humanBones.Add(HumanBodyBones.Chest, TryGet(allBones,"Spine1"));
|
||||
humanBones.Add(HumanBodyBones.UpperChest, TryGet(allBones,"Spine2"));
|
||||
humanBones.Add(HumanBodyBones.Neck, TryGet(allBones,"Neck"));
|
||||
humanBones.Add(HumanBodyBones.Head, TryGet(allBones,"Head"));
|
||||
humanBones.Add(HumanBodyBones.RightShoulder, TryGet(allBones,"RightShoulder"));
|
||||
humanBones.Add(HumanBodyBones.RightUpperArm, TryGet(allBones,"RightArm"));
|
||||
humanBones.Add(HumanBodyBones.RightLowerArm, TryGet(allBones,"RightForeArm"));
|
||||
humanBones.Add(HumanBodyBones.RightHand, TryGet(allBones,"RightHand"));
|
||||
humanBones.Add(HumanBodyBones.RightIndexProximal, TryGet(allBones,"RightHandIndex1"));
|
||||
humanBones.Add(HumanBodyBones.RightIndexIntermediate, TryGet(allBones,"RightHandIndex2"));
|
||||
humanBones.Add(HumanBodyBones.RightMiddleProximal, TryGet(allBones,"RightHandMiddle1"));
|
||||
humanBones.Add(HumanBodyBones.RightMiddleIntermediate, TryGet(allBones,"RightHandMiddle2"));
|
||||
humanBones.Add(HumanBodyBones.RightRingProximal, TryGet(allBones,"RightHandRing1"));
|
||||
humanBones.Add(HumanBodyBones.RightRingIntermediate, TryGet(allBones,"RightHandRing2"));
|
||||
humanBones.Add(HumanBodyBones.RightLittleProximal, TryGet(allBones,"RightHandPinky1"));
|
||||
humanBones.Add(HumanBodyBones.RightLittleIntermediate, TryGet(allBones,"RightHandPinky2"));
|
||||
humanBones.Add(HumanBodyBones.RightThumbProximal, TryGet(allBones,"RightHandThumb1"));
|
||||
humanBones.Add(HumanBodyBones.RightThumbIntermediate, TryGet(allBones,"RightHandThumb2"));
|
||||
humanBones.Add(HumanBodyBones.LeftShoulder, TryGet(allBones,"LeftShoulder"));
|
||||
humanBones.Add(HumanBodyBones.LeftUpperArm, TryGet(allBones,"LeftArm"));
|
||||
humanBones.Add(HumanBodyBones.LeftLowerArm, TryGet(allBones,"LeftForeArm"));
|
||||
humanBones.Add(HumanBodyBones.LeftHand, TryGet(allBones,"LeftHand"));
|
||||
humanBones.Add(HumanBodyBones.LeftIndexProximal, TryGet(allBones,"LeftHandIndex1"));
|
||||
humanBones.Add(HumanBodyBones.LeftIndexIntermediate, TryGet(allBones,"LeftHandIndex2"));
|
||||
humanBones.Add(HumanBodyBones.LeftMiddleProximal, TryGet(allBones,"LeftHandMiddle1"));
|
||||
humanBones.Add(HumanBodyBones.LeftMiddleIntermediate, TryGet(allBones,"LeftHandMiddle2"));
|
||||
humanBones.Add(HumanBodyBones.LeftRingProximal, TryGet(allBones,"LeftHandRing1"));
|
||||
humanBones.Add(HumanBodyBones.LeftRingIntermediate, TryGet(allBones,"LeftHandRing2"));
|
||||
humanBones.Add(HumanBodyBones.LeftLittleProximal, TryGet(allBones,"LeftHandPinky1"));
|
||||
humanBones.Add(HumanBodyBones.LeftLittleIntermediate, TryGet(allBones,"LeftHandPinky2"));
|
||||
humanBones.Add(HumanBodyBones.LeftThumbProximal, TryGet(allBones,"LeftHandThumb1"));
|
||||
humanBones.Add(HumanBodyBones.LeftThumbIntermediate, TryGet(allBones,"LeftHandThumb2"));
|
||||
foreach(var bone in humanBones)
|
||||
{
|
||||
if(bone.Value != null)
|
||||
{
|
||||
var tags = new List<SerializableBone.BoneTags>() { SerializableBone.BoneTags.Humanoid };
|
||||
if (bone.Value.name.Contains("Left"))
|
||||
{
|
||||
tags.Add(SerializableBone.BoneTags.Left);
|
||||
}
|
||||
else if (bone.Value.name.Contains("Right"))
|
||||
{
|
||||
tags.Add(SerializableBone.BoneTags.Right);
|
||||
}
|
||||
if((bone.Key >= HumanBodyBones.LeftThumbProximal && bone.Key <= HumanBodyBones.LeftLittleDistal)
|
||||
|| (bone.Key >= HumanBodyBones.RightThumbProximal && bone.Key <= HumanBodyBones.RightLittleDistal))
|
||||
{
|
||||
tags.Add(SerializableBone.BoneTags.Finger);
|
||||
}
|
||||
UIHandle.CreateAsChild<UIHandleBone>(bone.Value).Init(this, tags);
|
||||
}
|
||||
}
|
||||
foreach(var bone in allBones.Values.Except(humanBones.Values))
|
||||
{
|
||||
var tags = new List<SerializableBone.BoneTags>();
|
||||
if (bone.GetComponent<Unity.Animations.SpringBones.SpringBone>() != null)
|
||||
{
|
||||
tags.Add(SerializableBone.BoneTags.Dynamic);
|
||||
}
|
||||
UIHandle.CreateAsChild<UIHandleBone>(bone).Init(this, tags);
|
||||
}
|
||||
|
||||
_humanBones = humanBones;
|
||||
}
|
||||
|
||||
public T TryGet<T>(Dictionary<string, T> dict, string key)
|
||||
{
|
||||
if (dict.ContainsKey(key))
|
||||
{
|
||||
return dict[key];
|
||||
}
|
||||
return default(T);
|
||||
}
|
||||
|
||||
public void CreateMorphPanel()
|
||||
{
|
||||
if(MorphPanel != null)
|
||||
{
|
||||
Destroy(MorphPanel.gameObject);
|
||||
}
|
||||
|
||||
var morphRenderers = new Dictionary<SkinnedMeshRenderer, List<MorphHelper>>();
|
||||
foreach (var rend in gameObject.GetComponentsInChildren<SkinnedMeshRenderer>())
|
||||
{
|
||||
if(rend.sharedMesh.blendShapeCount > 0)
|
||||
{
|
||||
morphRenderers.Add(rend, new List<MorphHelper>());
|
||||
}
|
||||
}
|
||||
|
||||
if (morphRenderers.Count == 0) return;
|
||||
|
||||
MorphPanel = MorphPanel.Create(morphRenderers.Select(mr=>mr.Key.sharedMesh.name).ToList());
|
||||
MorphPanel.name = $"Chr_{Data.Id} Morphs";
|
||||
|
||||
foreach(var rend in morphRenderers)
|
||||
{
|
||||
var mesh = rend.Key.sharedMesh;
|
||||
for(int i = 0; i < mesh.blendShapeCount; i++)
|
||||
{
|
||||
MorphPanel.CreateMorph(mesh.name, this, rend.Key, i, mesh.GetBlendShapeName(i).Replace("blendShape1.",""));
|
||||
}
|
||||
}
|
||||
|
||||
Morphs = morphRenderers;
|
||||
DanMachiModelViewerInterface.Instance.SelectedObjectToolbar.AttachToThis(MorphPanel.GetComponent<UIElementDragger>());
|
||||
}
|
||||
|
||||
public void CreateCharacterPanel()
|
||||
{
|
||||
CharacterPanel = CharacterPanel.Create(this);
|
||||
CharacterPanel.name = $"Chr_{Data.Id} Settings";
|
||||
DanMachiModelViewerInterface.Instance.SelectedObjectToolbar.AttachToThis(CharacterPanel.GetComponent<UIElementDragger>());
|
||||
}
|
||||
|
||||
public override Vector3 GetCenter()
|
||||
{
|
||||
if (_humanBones.ContainsKey(HumanBodyBones.Hips))
|
||||
{
|
||||
return _humanBones[HumanBodyBones.Hips].position;
|
||||
}
|
||||
return base.GetCenter();
|
||||
}
|
||||
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
if (_applicationQuitting) return;
|
||||
if(MorphPanel != null)
|
||||
{
|
||||
Destroy(MorphPanel.gameObject);
|
||||
}
|
||||
Destroy(CharacterPanel.gameObject);
|
||||
base.OnDestroy();
|
||||
}
|
||||
|
||||
public Animator GetAnimator()
|
||||
{
|
||||
return _animator;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d65f01410b3faa44fa172126f630f0c4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,42 @@
|
||||
public class DanMachiObjectContainer : ObjectContainer
|
||||
{
|
||||
protected static DanMachiModelViewerMain Main => DanMachiModelViewerMain.Instance;
|
||||
|
||||
protected override void Start()
|
||||
{
|
||||
if (DoNotSave) return;
|
||||
|
||||
if(Frames.Count == 0)
|
||||
{
|
||||
SetKeyframe();
|
||||
}
|
||||
|
||||
DanMachiModelViewerMain.RegisterObject(this);
|
||||
var selector = UITimelineObjectEntry.Create(this);
|
||||
InstantiatedObjects.Add(selector.gameObject);
|
||||
|
||||
ModelViewerMain.GetInstance<DanMachiModelViewerMain>().SelectObject(this);
|
||||
}
|
||||
|
||||
public override void Select()
|
||||
{
|
||||
}
|
||||
|
||||
public override void Deselect()
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
if(_applicationQuitting) return;
|
||||
|
||||
if (Main.SelectedObject == this)
|
||||
{
|
||||
Main.SelectObject(null);
|
||||
}
|
||||
|
||||
ModelViewerMain.UnregisterObject(this);
|
||||
|
||||
base.OnDestroy();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6ce5c34b04160214b935e3dcefed9ffc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
19
Assets/DanMachi/Scripts/DanMachi.asmdef
Normal file
19
Assets/DanMachi/Scripts/DanMachi.asmdef
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "DanMachi",
|
||||
"rootNamespace": "",
|
||||
"references": [
|
||||
"GUID:1f135e4ce2898524aa1e81c5cd7f1242",
|
||||
"GUID:6055be8ebefd69e48b49212b09b47b2f",
|
||||
"GUID:24ad1c085c49dc34dbe16c3d92c6f299",
|
||||
"GUID:cd3f2222600b41b4ead10f1843a97448"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
7
Assets/DanMachi/Scripts/DanMachi.asmdef.meta
Normal file
7
Assets/DanMachi/Scripts/DanMachi.asmdef.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 41e00cea93be1f14e8994b9c2e214ad2
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
128
Assets/DanMachi/Scripts/DanMachiAssetLibrary.cs
Normal file
128
Assets/DanMachi/Scripts/DanMachiAssetLibrary.cs
Normal file
@@ -0,0 +1,128 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
public class DanMachiAssetLibrary : AssetLibrary
|
||||
{
|
||||
public static DanMachiAssetLibrary Instance => GetInstance<DanMachiAssetLibrary>();
|
||||
|
||||
private List<string> assets = new List<string>();
|
||||
private Dictionary<string, string> hashDirectories = new Dictionary<string, string>();
|
||||
private Dictionary<string, string> hashAssets = new Dictionary<string, string>();
|
||||
private Dictionary<string, string> assetHashes = new Dictionary<string, string>();
|
||||
|
||||
public List<string> CharacterAssets = new List<string>();
|
||||
public List<string> AnimationAssets = new List<string>();
|
||||
public List<CharacterAsset> Characters = new List<CharacterAsset>();
|
||||
public List<CharacterAsset> Animations = new List<CharacterAsset>();
|
||||
|
||||
public CharacterPanel CharacterPanel;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_mainInstance = this;
|
||||
}
|
||||
|
||||
IEnumerator Start()
|
||||
{
|
||||
//string assetListUrl = "https://jp-prd-cdn-danmachi-danchro.akamaized.net/resources/assetbundles/catalogs/Android_En/5c8b4dd0ca65f2751ba243ff773db969/catalog_0.0.0.json";
|
||||
//yield return Downloader.DownloadText(assetListUrl, str =>
|
||||
//{
|
||||
// ParseList(str);
|
||||
//});
|
||||
|
||||
string catalogPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low\\aiming\\DanChro\\com.unity.addressables\\catalog_0.0.0.json";
|
||||
string localFilesPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low\\Unity\\aiming_DanChro\\";
|
||||
|
||||
yield return LoadAddressableCatalog(catalogPath);
|
||||
|
||||
//foreach (var dir in Directory.GetDirectories(localFilesPath))
|
||||
//{
|
||||
// var fullDir = Directory.GetDirectories(dir)[0];
|
||||
// var hash = fullDir.Split('\\').Last();
|
||||
// hashAssets[hash] = "";
|
||||
// hashDirectories[hash] = fullDir;
|
||||
//}
|
||||
|
||||
foreach(var entry in GetAddressableKeys())
|
||||
{
|
||||
if (entry.StartsWith("chara_") && entry.Contains("assets_all") && !entry.Contains("facial") && !entry.Contains("camanim"))
|
||||
{
|
||||
if (entry.Contains("_anim_"))
|
||||
{
|
||||
AnimationAssets.Add(entry);
|
||||
var chara = new CharacterAsset(entry, localFilesPath + GetResourcePath(entry));
|
||||
Animations.Add(chara);
|
||||
}
|
||||
else
|
||||
{
|
||||
CharacterAssets.Add(entry);
|
||||
var chara = new CharacterAsset(entry, localFilesPath + GetResourcePath(entry));
|
||||
Characters.Add(chara);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//ParseList(File.ReadAllText(catalogPath));
|
||||
|
||||
//foreach (var asset in CharacterAssets)
|
||||
//{
|
||||
// //string assetPath = "https://jp-prd-cdn-danmachi-danchro.akamaized.net/resources/assetbundles/assets/Android_En/" + asset;
|
||||
// //string outPath = Application.dataPath + "/../GameAssets/" + asset;
|
||||
// //if (File.Exists(outPath)) continue;
|
||||
// //yield return Downloader.DownloadAsset(assetPath, outPath, null);
|
||||
// var split = asset.Split(new char[] { '_', '.' });
|
||||
// var hash = split[split.Length - 2];
|
||||
// if (hashAssets.ContainsKey(hash))
|
||||
// {
|
||||
// hashAssets[hash] = asset;
|
||||
// assetHashes[asset] = hash;
|
||||
// }
|
||||
|
||||
// var filePath = Path.Combine(hashDirectories[hash], "__data");
|
||||
// var chara = new CharacterAsset(asset, filePath);
|
||||
// Characters.Add(chara);
|
||||
//}
|
||||
|
||||
DanMachiModelViewerInterface.Instance.CharacterSelection.SetData(Characters);
|
||||
|
||||
yield break;
|
||||
}
|
||||
|
||||
//public void ParseList(string assetList)
|
||||
//{
|
||||
// var json = JObject.Parse(assetList);
|
||||
// foreach (var entry in json["m_InternalIds"])
|
||||
// {
|
||||
// var fileName = entry.ToString().Split(new char[]{'\\', '/'}).Last();
|
||||
// assets.Add(fileName);
|
||||
// if (fileName.StartsWith("chara_") && fileName.Contains("assets_all") && !fileName.Contains("anim") && !fileName.Contains("facial"))
|
||||
// {
|
||||
// CharacterAssets.Add(fileName);
|
||||
// }
|
||||
// if (fileName.EndsWith(".anim"))
|
||||
// {
|
||||
// Animations.Add(fileName);
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
public string GetCharacter(string group, string id, string costume)
|
||||
{
|
||||
return CharacterAssets.First(c => c.StartsWith($"chara_{group}_{id}_{costume}"));
|
||||
}
|
||||
|
||||
public string GetAssetPathByName(string name)
|
||||
{
|
||||
if (assetHashes.ContainsKey(name))
|
||||
{
|
||||
var assetHash = assetHashes[name];
|
||||
var fullPath = Path.Combine(hashDirectories[assetHash], "__data");
|
||||
return fullPath;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/DanMachiAssetLibrary.cs.meta
Normal file
11
Assets/DanMachi/Scripts/DanMachiAssetLibrary.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b12f661a77fd03f499c6aa577cf3d546
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
40
Assets/DanMachi/Scripts/DanMachiModelBuilder.cs
Normal file
40
Assets/DanMachi/Scripts/DanMachiModelBuilder.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class DanMachiModelBuilder : ModelBuilder
|
||||
{
|
||||
public static DanMachiModelBuilder Instance => GetInstance<DanMachiModelBuilder>();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_mainInstance = this;
|
||||
}
|
||||
|
||||
public override IEnumerator SpawnAsset(Enum assetType, string assetPath, Action<ObjectContainer> callback = null)
|
||||
{
|
||||
switch (assetType)
|
||||
{
|
||||
case AssetTypes.Unknown:
|
||||
throw new NotImplementedException();
|
||||
case AssetTypes.Character:
|
||||
var asset = DanMachiAssetLibrary.Instance.Characters.First(c=>c.AssetName == assetPath);
|
||||
callback?.Invoke(SpawnCharacter(asset));
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
|
||||
public DanMachiCharacterContainer SpawnCharacter(CharacterAsset asset)
|
||||
{
|
||||
var container = ObjectContainer.Create<DanMachiCharacterContainer>("Character");
|
||||
var handle = UIHandle.CreateAsChild<UIHandleMain>(container.transform).Init(container);
|
||||
container.Build(asset);
|
||||
container.PlayAnimation(container.Animations[0]);
|
||||
return container;
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/DanMachiModelBuilder.cs.meta
Normal file
11
Assets/DanMachi/Scripts/DanMachiModelBuilder.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 39edab08a0610954bab2fac72308fcfa
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
15
Assets/DanMachi/Scripts/DanMachiModelViewerInterface.cs
Normal file
15
Assets/DanMachi/Scripts/DanMachiModelViewerInterface.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
|
||||
public class DanMachiModelViewerInterface : ModelViewerInterface
|
||||
{
|
||||
public static DanMachiModelViewerInterface Instance => GetInstance<DanMachiModelViewerInterface>();
|
||||
|
||||
public CharacterDropdown CharacterSelection;
|
||||
public UIToolbar SelectedObjectToolbar;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_mainInstance = this;
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/DanMachiModelViewerInterface.cs.meta
Normal file
11
Assets/DanMachi/Scripts/DanMachiModelViewerInterface.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a67ad85d97739684da41f7a86132d210
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
94
Assets/DanMachi/Scripts/DanMachiModelViewerMain.cs
Normal file
94
Assets/DanMachi/Scripts/DanMachiModelViewerMain.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
[RequireComponent(typeof(DanMachiAssetLibrary), typeof(DanMachiModelBuilder), typeof(DanMachiModelViewerInterface))]
|
||||
public class DanMachiModelViewerMain : ModelViewerMain
|
||||
{
|
||||
public static DanMachiModelViewerMain Instance => GetInstance<DanMachiModelViewerMain>();
|
||||
|
||||
protected DanMachiAssetLibrary _assets => DanMachiAssetLibrary.Instance;
|
||||
protected DanMachiModelBuilder _modelBuilder => DanMachiModelBuilder.Instance;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_backupTimers = _backupTimes.ToArray();
|
||||
CurrentScene = SceneContainer.Create<DanMachiSceneContainer>(this);
|
||||
}
|
||||
|
||||
private IEnumerator Start()
|
||||
{
|
||||
Application.targetFrameRate = 30;
|
||||
Error.Log(Color.green, "Viewer version: " + Application.version);
|
||||
|
||||
float warningTimer = 0;
|
||||
while (DanMachiAssetLibrary.Instance == null || DanMachiModelBuilder.Instance == null || DanMachiModelViewerInterface.Instance == null || SharedResources.Instance == null)
|
||||
{
|
||||
warningTimer += Time.deltaTime;
|
||||
if(warningTimer > 2)
|
||||
{
|
||||
warningTimer = 0;
|
||||
string report = $"AssetLibrary: {DanMachiAssetLibrary.Instance != null}\nModelBuilder: {DanMachiModelBuilder.Instance != null}\nInterface: {DanMachiModelViewerInterface.Instance != null}\nResources: {SharedResources.Instance != null}";
|
||||
Error.Log(report, Color.red);
|
||||
}
|
||||
yield return 0;
|
||||
}
|
||||
|
||||
if (!MainCameraOrbit.Frames.Any())
|
||||
MainCameraOrbit.SetDefaultFrame();
|
||||
|
||||
_mainInstance = this;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
//AutoSaveUpdate();
|
||||
}
|
||||
|
||||
public static void RegisterObject(DanMachiObjectContainer container)
|
||||
{
|
||||
Instance.CurrentScene.AllObjects.Add(container);
|
||||
}
|
||||
|
||||
public static void UnregisterObject(DanMachiObjectContainer container)
|
||||
{
|
||||
Instance.CurrentScene.AllObjects.Remove(container);
|
||||
}
|
||||
|
||||
public static void DisposeOf(GameObject go)
|
||||
{
|
||||
if (go == null) return;
|
||||
var rends = go.GetComponentsInChildren<Renderer>();
|
||||
foreach (var rend in rends)
|
||||
{
|
||||
for (int i = rend.materials.Length - 1; i >= 0; i--)
|
||||
{
|
||||
Destroy(rend.materials[i]);
|
||||
}
|
||||
}
|
||||
Destroy(go);
|
||||
UnityEngine.Resources.UnloadUnusedAssets();
|
||||
System.GC.Collect();
|
||||
}
|
||||
|
||||
public IEnumerator LoadScene(DanMachiSceneSerializable bc)
|
||||
{
|
||||
EmptyScene<DanMachiSceneContainer>();
|
||||
|
||||
foreach (var c in bc.Objects)
|
||||
{
|
||||
if (c.GUID == "cameraOrbit")
|
||||
{
|
||||
MainCameraOrbit.DeserializeFrames(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
yield return _modelBuilder.SpawnSerialized(c);
|
||||
}
|
||||
}
|
||||
bc.Timeline.Deserialize(TimelineController.Instance);
|
||||
CurrentScene.Frames = bc.Frames.Select(f => new FrameContent(f)).ToList();
|
||||
yield return 0;
|
||||
TimelineController.SetCurrentFrame(TimelineController.Instance.CurrentFrame);
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/DanMachiModelViewerMain.cs.meta
Normal file
11
Assets/DanMachi/Scripts/DanMachiModelViewerMain.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2600eb3d110b4b346af6009caf5c1e34
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
49
Assets/DanMachi/Scripts/DanMachiSceneContainer.cs
Normal file
49
Assets/DanMachi/Scripts/DanMachiSceneContainer.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class DanMachiSceneContainer : SceneContainer
|
||||
{
|
||||
public override KeyframeData SerializeFrame()
|
||||
{
|
||||
return new KeyframeData();
|
||||
}
|
||||
|
||||
public override ObjectContainerSerializable Serialize()
|
||||
{
|
||||
return new SceneSerializable(this);
|
||||
}
|
||||
|
||||
public override void Lerp(KeyframeData frame1, KeyframeData frame2, float amount)
|
||||
{
|
||||
var frame = (frame1 as KeyframeData).Lerp(frame2, amount) as KeyframeData;
|
||||
}
|
||||
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
if (_applicationQuitting) return;
|
||||
|
||||
for (int i = AllObjects.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var obj = AllObjects[i];
|
||||
if (obj.GetDataType() == DataType.Camera)
|
||||
{
|
||||
Debug.Log("Destroying cam");
|
||||
obj.Frames.Clear();
|
||||
obj.SetDefaultFrame();
|
||||
continue;
|
||||
}
|
||||
Destroy(obj.gameObject);
|
||||
}
|
||||
|
||||
base.OnDestroy();
|
||||
}
|
||||
|
||||
public override void Select()
|
||||
{
|
||||
//Settings.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
public override void Deselect()
|
||||
{
|
||||
//Settings.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/DanMachiSceneContainer.cs.meta
Normal file
11
Assets/DanMachi/Scripts/DanMachiSceneContainer.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c58ee12edd81a8d43a9107bc7906a17b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
6
Assets/DanMachi/Scripts/DanMachiSceneSerializable.cs
Normal file
6
Assets/DanMachi/Scripts/DanMachiSceneSerializable.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
using System;
|
||||
|
||||
[Serializable]
|
||||
public class DanMachiSceneSerializable : SceneSerializable
|
||||
{
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/DanMachiSceneSerializable.cs.meta
Normal file
11
Assets/DanMachi/Scripts/DanMachiSceneSerializable.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c04af4c8b1b74df4783e6f4815bd909f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DanMachi/Scripts/SpringBone.meta
Normal file
8
Assets/DanMachi/Scripts/SpringBone.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1a18b62d9e3df7145807bbac970b0294
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
21
Assets/DanMachi/Scripts/SpringBone/SpringBone.cs
Normal file
21
Assets/DanMachi/Scripts/SpringBone/SpringBone.cs
Normal file
@@ -0,0 +1,21 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Unity.Animations.SpringBones
|
||||
{
|
||||
public class SpringBone : MonoBehaviour
|
||||
{
|
||||
// Start is called before the first frame update
|
||||
void Start()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/SpringBone/SpringBone.cs.meta
Normal file
11
Assets/DanMachi/Scripts/SpringBone/SpringBone.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c0f98808b73c1124db3bf2a8a8e54cf6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"name": "com.unity.animations.springbone"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cd3f2222600b41b4ead10f1843a97448
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/DanMachi/Scripts/UI.meta
Normal file
8
Assets/DanMachi/Scripts/UI.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0149f5e055b5ff14da09775c923fa81e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
140
Assets/DanMachi/Scripts/UI/CharacterDropdown.cs
Normal file
140
Assets/DanMachi/Scripts/UI/CharacterDropdown.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/UI/CharacterDropdown.cs.meta
Normal file
11
Assets/DanMachi/Scripts/UI/CharacterDropdown.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eaaf892cb6c1a98408a9e1e8e75c5b79
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
63
Assets/DanMachi/Scripts/UI/CharacterPanel.cs
Normal file
63
Assets/DanMachi/Scripts/UI/CharacterPanel.cs
Normal 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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/DanMachi/Scripts/UI/CharacterPanel.cs.meta
Normal file
11
Assets/DanMachi/Scripts/UI/CharacterPanel.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26a550c137eb4ff42aebcf10b11d5626
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user