DanMachi:

-compatibility improvements
Core:
-simplified object and keyframe serialization
-complicated assetbundle loading
This commit is contained in:
Katboi01 2024-05-10 09:56:39 +02:00
parent c922584d38
commit 2a7117fca2
191 changed files with 79813 additions and 25806 deletions
Assets
DanMachi
Eversoul
KF3.meta
KF3
KF3.unityKF3.unity.metaPrefabs.meta
Prefabs
Scripts.meta
Scripts

File diff suppressed because it is too large Load Diff

View File

@ -1,64 +1,80 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using UnityEditor.Graphs;
using UnityEngine;
public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
public class DanMachiCharacterContainer : ObjectContainer, IAnimated
{
protected override System.Type _serializeType => typeof(DanMachiCharacterSerializable);
protected override System.Type _keyframeType => typeof(DanMachiCharacterKeyframeData);
public CharacterAsset Data;
public string AnimationSet;
public string Animation;
public GameObject Body;
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 List<Transform> Bones = new List<Transform>();
public override void Select()
public void Init()
{
if(MorphPanel != null)
_animator = GetComponentInChildren<Animator>();
if(_animator != null)
{
MorphPanel.gameObject.SetActive(true);
_animator.applyRootMotion = false;
_animator.runtimeAnimatorController = _animatorController = Instantiate(SharedResources.Instance.GenericAnimatorController);
}
else
{
Error.Log(Color.red, $"{name} has no animator");
}
CreateMorphPanel();
CreateCharacterPanel();
SetBones();
}
public override void Deselect()
public void Rebuild(CharacterAsset model)
{
if (MorphPanel != null)
{
MorphPanel.gameObject.SetActive(false);
}
DestroyImmediate(Body);
Build(model);
}
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);
var assetPath = Path.Combine(DanMachiAssetLibrary.Instance.LocalFilesPath, model.FilePath);
var characterAsset = AssetLibrary.LoadFromFile(assetPath);
var assetNames = characterAsset.GetAllAssetNames();
var characterModel = assetNames.FirstOrDefault(a => Path.GetFileName(a).StartsWith("CP_") && a.EndsWith(".prefab"));
foreach (var go in characterAsset.LoadAllAssets<GameObject>())
if(!string.IsNullOrEmpty(characterModel))
{
Instantiate(go, transform);
Body = Instantiate(characterAsset.LoadAsset(characterModel), transform) as GameObject;
}
characterAsset.Unload(false);
else
{
Body = new GameObject();
Body.transform.SetParent(transform);
foreach (var go in characterAsset.LoadAllAssets<GameObject>())
{
Instantiate(go, Body.transform);
}
}
LoadedAssets = new List<AssetBundleEntry>() { new AssetBundleEntry(model.AssetName, assetPath, characterAsset) };
AssetLibrary.UnloadAsset(assetPath);
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)
@ -67,7 +83,7 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
{
AnimationSet = animationSet.Costume;
Animation = "";
var animationAsset = AssetBundle.LoadFromFile(animationSet.FilePath);
var animationAsset = AssetBundle.LoadFromFile(Path.Combine(DanMachiAssetLibrary.Instance.LocalFilesPath, animationSet.FilePath));
Animations = animationAsset.LoadAllAssets<AnimationClip>().ToList();
animationAsset.Unload(false);
}
@ -81,6 +97,12 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
public void PlayAnimation(AnimationClip anim)
{
if(_animator == null)
{
Error.Log(Color.red, $"{name} has no animator");
return;
}
if(anim == null)
{
Animation = "";
@ -110,8 +132,20 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
public void SetBones()
{
_humanBones.Clear();
Bones.Clear();
if (_animator == null) return;
var humanBones = new Dictionary<HumanBodyBones, Transform>();
var allBones = _animator.transform.GetComponentsInChildren<Transform>().ToDictionary(b=>b.name, b=>b);
var allBones = new Dictionary<string, Transform>();
foreach(var bone in _animator.transform.GetComponentsInChildren<Transform>())
{
if (!allBones.ContainsKey(bone.name))
{
allBones[bone.name] = bone;
}
}
humanBones.Add(HumanBodyBones.Hips, TryGet(allBones,"Hips"));
humanBones.Add(HumanBodyBones.Spine, TryGet(allBones,"Spine"));
humanBones.Add(HumanBodyBones.RightUpperLeg, TryGet(allBones,"RightUpLeg"));
@ -186,6 +220,7 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
}
_humanBones = humanBones;
Bones = allBones.Values.ToList();
}
public T TryGet<T>(Dictionary<string, T> dict, string key)
@ -199,11 +234,6 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
public void CreateMorphPanel()
{
if(MorphPanel != null)
{
Destroy(MorphPanel.gameObject);
}
var morphRenderers = new Dictionary<SkinnedMeshRenderer, List<MorphHelper>>();
foreach (var rend in gameObject.GetComponentsInChildren<SkinnedMeshRenderer>())
{
@ -213,29 +243,59 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
}
}
if (morphRenderers.Count == 0) return;
if (morphRenderers.Count == 0)
{
if(MorphPanel != null)
{
Destroy(MorphPanel.gameObject);
MorphPanel = null;
InstantiatedObjects.Remove(MorphPanel.gameObject);
}
return;
}
MorphPanel = MorphPanel.Create(morphRenderers.Select(mr=>mr.Key.sharedMesh.name).ToList());
MorphPanel.name = $"Chr_{Data.Id} Morphs";
if(MorphPanel != null)
{
MorphPanel.Init(morphRenderers.Select(mr => mr.Key.sharedMesh.name).ToList());
}
else
{
MorphPanel = MorphPanel.Create(morphRenderers.Select(mr => mr.Key.sharedMesh.name).ToList());
MorphPanel.name = $"Chr_{Data.Id} Morphs";
InstantiatedObjects.Add(MorphPanel.gameObject);
DanMachiInterface.Instance.SelectedObjectToolbar.AttachToThis(MorphPanel.GetComponent<UIElementDragger>());
}
foreach(var rend in morphRenderers)
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.",""));
var panel = MorphPanel.CreateMorph(mesh.name, this, rend.Key, i, mesh.GetBlendShapeName(i).Replace("blendShape1.",""));
var helper = panel.MorphHelper;
if (morphRenderers.ContainsKey(rend.Key))
morphRenderers[rend.Key].Add(helper);
else
morphRenderers.Add(rend.Key, new List<MorphHelper>() { helper });
}
}
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>());
if(CharacterPanel != null)
{
CharacterPanel.Init(this);
}
else
{
CharacterPanel = CharacterPanel.Create(this);
CharacterPanel.name = $"Chr_{Data.Id} Settings";
InstantiatedObjects.Add(CharacterPanel.gameObject);
DanMachiInterface.Instance.SelectedObjectToolbar.AttachToThis(CharacterPanel.GetComponent<UIElementDragger>());
}
}
public override Vector3 GetCenter()
@ -247,19 +307,45 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated
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;
}
public override void PastePose(KeyframeData frame, PoseLoadOptions pasteParams)
{
PlayAnimation("");
if (pasteParams.Root)
{
transform.SetTransform(frame.Root);
}
var frameData = frame as DanMachiCharacterKeyframeData;
if (frameData == null) return;
foreach (var bone in frameData.Bones.Bones)
{
var targetBone = Bones.FirstOrDefault(b => b.name == bone.Name);
if (targetBone == null) continue;
bone.Transform.ApplyTo(targetBone.transform);
}
foreach(var morph in frameData.Morphs)
{
var renderer = Morphs.Keys.FirstOrDefault(k => k.name == morph.Key);
if (renderer == null) continue;
foreach(var value in morph.Value)
{
var helper = Morphs[renderer].FirstOrDefault(h => h.Name == value.Name);
if (helper == null) continue;
helper.Value = value.Value;
helper.UpdateMorph(value.Strength);
}
}
SetKeyframe();
}
}

View File

@ -0,0 +1,29 @@

using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
public class DanMachiCharacterKeyframeData : KeyframeData
{
public BoneList Bones = new BoneList();
public Dictionary<string, List<MorphHelper>> Morphs = new Dictionary<string, List<MorphHelper>>();
public DanMachiCharacterKeyframeData() { }
public DanMachiCharacterKeyframeData(DanMachiCharacterContainer container)
{
this.Root = new SerializableTransform(container.transform);
this.Bones = new BoneList() { Name = "", Bones = container.Bones.Select(b => new SerializableBone(b)).ToArray() };
this.Morphs = container.Morphs.ToDictionary(m => m.Key.name, m => m.Value);
}
public override KeyframeData Clone()
{
var keyframe = new DanMachiCharacterKeyframeData();
keyframe.Root = new SerializableTransform(this.Root);
keyframe.Bones = new BoneList() { Name = Bones.Name, Bones = Bones.Bones.Select(b=> new SerializableBone(b)).ToArray() };
keyframe.Morphs = Morphs.ToDictionary(m => m.Key, m => m.Value.Select(v=>new MorphHelper(v.ParentName, v.Name, v.Strength, v.Value)).ToList());
return keyframe;
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c58ee12edd81a8d43a9107bc7906a17b
guid: d096ac3a0685dd54a836bc35192a0522
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,12 @@

public class DanMachiCharacterSerializable : ObjectContainerSerializable
{
public string AssetName;
public DanMachiCharacterSerializable() { }
public DanMachiCharacterSerializable(DanMachiCharacterContainer container) : base(container)
{
AssetName = container.Data.AssetName;
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6ce5c34b04160214b935e3dcefed9ffc
guid: 90e549cfb34f0cc47ac51d28cf4a6d9a
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,42 +0,0 @@
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();
}
}

View File

@ -29,8 +29,8 @@ public class DanMachiAssetLibrary : AssetLibrary
// 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\\";
string catalogPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low\\aiming\\DanChro\\com.unity.addressables\\catalog_0.0.0.json";
LocalFilesPath = ModelViewerSettings.Get("AssetsPath", new ModelViewerSettings.Setting(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low\\Unity\\aiming_DanChro\\", ModelViewerSettings.SettingType.FolderPath));
yield return LoadAddressableCatalog(catalogPath);
@ -49,13 +49,13 @@ public class DanMachiAssetLibrary : AssetLibrary
if (entry.Contains("_anim_"))
{
AnimationAssets.Add(entry);
var chara = new CharacterAsset(entry, localFilesPath + GetResourcePath(entry, out _));
var chara = new CharacterAsset(entry, GetResourcePath(entry, out _));
Animations.Add(chara);
}
else
{
CharacterAssets.Add(entry);
var chara = new CharacterAsset(entry, localFilesPath + GetResourcePath(entry, out _));
var chara = new CharacterAsset(entry, GetResourcePath(entry, out _));
Characters.Add(chara);
}
}
@ -82,7 +82,7 @@ public class DanMachiAssetLibrary : AssetLibrary
// Characters.Add(chara);
//}
DanMachiModelViewerInterface.Instance.CharacterSelection.SetData(Characters);
DanMachiInterface.Instance.CharacterSelection.SetData(Characters);
yield break;
}

View File

@ -0,0 +1,6 @@
public class DanMachiInterface : ModelViewerInterface
{
public static DanMachiInterface Instance => GetInstance<DanMachiInterface>();
public CharacterDropdown CharacterSelection;
}

View File

@ -0,0 +1,42 @@
using System.Collections;
using System.Linq;
using UnityEngine;
[RequireComponent(typeof(DanMachiAssetLibrary), typeof(DanMachiModelBuilder), typeof(DanMachiInterface))]
public class DanMachiMain : ModelViewerMain
{
public static DanMachiMain Instance => GetInstance<DanMachiMain>();
protected DanMachiAssetLibrary _assets => DanMachiAssetLibrary.Instance;
protected DanMachiModelBuilder _modelBuilder => DanMachiModelBuilder.Instance;
protected override void Awake()
{
CurrentScene = SceneContainer.Create<SceneContainer>(this);
base.Awake();
}
private IEnumerator Start()
{
Application.targetFrameRate = 30;
Error.Log(Color.green, "Viewer version: " + Application.version);
float warningTimer = 0;
while (DanMachiAssetLibrary.Instance == null || DanMachiModelBuilder.Instance == null || DanMachiInterface.Instance == null || SharedResources.Instance == null)
{
warningTimer += Time.deltaTime;
if(warningTimer > 2)
{
warningTimer = 0;
string report = $"AssetLibrary: {DanMachiAssetLibrary.Instance != null}\nModelBuilder: {DanMachiModelBuilder.Instance != null}\nInterface: {DanMachiInterface.Instance != null}\nResources: {SharedResources.Instance != null}";
Error.Log(report, Color.red);
}
yield return 0;
}
}
private void Update()
{
//AutoSaveUpdate();
}
}

View File

@ -8,28 +8,65 @@ public class DanMachiModelBuilder : ModelBuilder
{
public static DanMachiModelBuilder Instance => GetInstance<DanMachiModelBuilder>();
public override IEnumerator SpawnAsset(Enum assetType, string assetPath, Action<ObjectContainer> callback = null)
public override IEnumerator SpawnSerializedCoroutine(ObjectContainerSerializable oc, Action<ObjectContainer> callback = null)
{
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);
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;
return SpawnCharacter(asset);
default:
throw new NotImplementedException();
}
yield break;
}
public DanMachiCharacterContainer SpawnCharacter(CharacterAsset asset)
private 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]);
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);
return container;
}
}

View File

@ -1,10 +0,0 @@
using System.Collections.Generic;
using TMPro;
public class DanMachiModelViewerInterface : ModelViewerInterface
{
public static DanMachiModelViewerInterface Instance => GetInstance<DanMachiModelViewerInterface>();
public CharacterDropdown CharacterSelection;
public UIToolbar SelectedObjectToolbar;
}

View File

@ -1,89 +0,0 @@
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;
protected override void Awake()
{
CurrentScene = SceneContainer.Create<DanMachiSceneContainer>(this);
base.Awake();
}
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;
}
}
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);
}
}

View File

@ -1,49 +0,0 @@
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);
}
}

View File

@ -1,6 +0,0 @@
using System;
[Serializable]
public class DanMachiSceneSerializable : SceneSerializable
{
}

View File

@ -1,21 +1,8 @@
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()
{
}
}
}

View File

@ -0,0 +1,8 @@
using UnityEngine;
namespace Unity.Animations.SpringBones
{
public class SpringCapsuleCollider : MonoBehaviour
{
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c04af4c8b1b74df4783e6f4815bd909f
guid: 572171c99ddfc0542b942432884ec564
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,8 @@
using UnityEngine;
namespace Unity.Animations.SpringBones
{
public class SpringManager : MonoBehaviour
{
}
}

View File

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

View File

@ -0,0 +1,8 @@
using UnityEngine;
namespace Unity.Animations.SpringBones
{
public class SpringSphereCollider : MonoBehaviour
{
}
}

View File

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

View File

@ -60,32 +60,33 @@ public class CharacterDropdown : MonoBehaviour
UnityAction<int> groupCallback = (index) =>
{
if (index == 0) return;
if (index == 0)
{
SetDropdownData(1, null);
Despawn();
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;
if (index == 0)
{
Despawn();
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);
DanMachiModelBuilder.Instance.SpawnAsset(AssetTypes.Character, costume.AssetName);
};
//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,
@ -113,7 +114,7 @@ public class CharacterDropdown : MonoBehaviour
{
Debug.LogError("Delete Current");
}
StartCoroutine(ModelBuilder.GetInstance().SpawnAsset(AssetTypes.Character, MainDropdown.options[selection].text));
StartCoroutine(ModelBuilder.GetInstance().SpawnAssetCoroutine(AssetTypes.Character, MainDropdown.options[selection].text));
}
public void SetDropdownData(string label, List<string> options, bool nullValue = false, bool sortValues = false)
@ -122,12 +123,6 @@ public class CharacterDropdown : MonoBehaviour
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)
@ -137,4 +132,42 @@ public class CharacterDropdown : MonoBehaviour
}
ModelViewerInterface.SetDropdownData(Dropdowns[depth], options, nullValue, sortValues);
}
public void SelectDropdownData(int depth, string valueText, bool notify)
{
var dropdown = Dropdowns[depth];
var value = dropdown.options.FindIndex(d=>d.text == valueText);
SelectDropdownData(depth, value, notify);
}
public void SelectDropdownData(int depth, int value, bool notify)
{
if (value == -1) return;
var dropdown = Dropdowns[depth];
if (notify)
{
dropdown.value = value;
}
else
{
dropdown.SetValueWithoutNotify(value);
}
}
public string GetOption(int depth)
{
if (Dropdowns[depth].value == 0) return null;
return Dropdowns[depth].options[Dropdowns[depth].value].text;
}
private void Despawn()
{
var selected = ModelViewerMain.GetInstance().SelectedObject;
if (selected != null)
{
selected.Destroy();
}
}
}

View File

@ -28,9 +28,10 @@ public class CharacterPanel : MonoBehaviour
{
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());
_selectedChara.Rebuild(DanMachiAssetLibrary.Instance.Characters.First(c => c.Category == data.Category && c.Id == data.Id && c.Costume == CostumeDropdown.options[value].text));
//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.SpawnAsset(AssetTypes.Character, newData.AssetName);
_selectedChara.PastePose(pose, PoseLoadOptions.All());
}
public void SelectAnimationSet(int value)
@ -38,6 +39,7 @@ public class CharacterPanel : MonoBehaviour
if(value == 0)
{
AnimationDropdown.SetOptions(null);
_selectedChara.PlayAnimation((AnimationClip)null);
return;
}
var data = _selectedChara.Data;

File diff suppressed because it is too large Load Diff

View File

@ -45,8 +45,8 @@ public class EversoulCharacterContainer : ObjectContainer, IAnimated
var asset = bundle.LoadAsset<GameObject>(model.ResourceName);
var go = Instantiate(asset, this.transform);
EversoulAssetLibrary.Instance.UnloadAssets(dependencyPaths);
EversoulAssetLibrary.Instance.UnloadAsset(modelPath);
AssetLibrary.UnloadAssets(dependencyPaths);
AssetLibrary.UnloadAsset(modelPath);
SetDefaultMaterials(transform);

View File

@ -7,5 +7,4 @@ public class EversoulInterface : ModelViewerInterface
public static EversoulInterface Instance => GetInstance<EversoulInterface>();
public EversoulCharacterDropdown CharacterSelection;
public UIToolbar SelectedObjectToolbar;
}

View File

@ -104,7 +104,7 @@ public class EversoulCharacterDropdown : MonoBehaviour
{
Debug.LogError("Delete Current");
}
StartCoroutine(ModelBuilder.GetInstance().SpawnAsset(AssetTypes.Character, MainDropdown.options[selection].text));
StartCoroutine(ModelBuilder.GetInstance().SpawnAssetCoroutine(AssetTypes.Character, MainDropdown.options[selection].text));
}
public void SetDropdownData(string label, List<string> options, bool nullValue = false, bool sortValues = false)

8
Assets/KF3.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c6fd7a592b4202742a737ce9daddeeeb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

40248
Assets/KF3/KF3.unity Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 50cd194efc5f9c44d9b6ee9079abd64d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
Assets/KF3/Prefabs.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c0a907902af71e44aaab7696de8c5b0c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 725384a4561b63d4baa344c060b5e015
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c30254db06d7e754dbcc1991db5066dc
guid: 50ed82b5576a8274fbef3e9850fafadd
PrefabImporter:
externalObjects: {}
userData:

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 860580398cf97ab4eac7935169b6dd42
guid: bf21dae47f1e1b74faf8be16bb74c2dc
PrefabImporter:
externalObjects: {}
userData:

View File

@ -0,0 +1,989 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &406419102996990435
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4779939240792789388}
- component: {fileID: 1584950039069069924}
- component: {fileID: 3262512346737592932}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4779939240792789388
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 406419102996990435}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4184826984943928819}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 9, y: -0.5}
m_SizeDelta: {x: -28, y: -3}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1584950039069069924
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 406419102996990435}
m_CullTransparentMesh: 1
--- !u!114 &3262512346737592932
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 406419102996990435}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Toggle
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &1451225421186468728
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5101148945640598805}
- component: {fileID: 1160409419726520999}
m_Layer: 5
m_Name: MorphSlider
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5101148945640598805
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1451225421186468728}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 5882853902430253298}
- {fileID: 5203495626939517929}
- {fileID: 4308357552645940838}
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0.000061035156, y: 0.000030517578}
m_SizeDelta: {x: -10, y: 20}
m_Pivot: {x: 0.5, y: 0}
--- !u!114 &1160409419726520999
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1451225421186468728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 3984808659029867453}
m_FillRect: {fileID: 7434744616954175478}
m_HandleRect: {fileID: 6096567429521374474}
m_Direction: 0
m_MinValue: 0
m_MaxValue: 100
m_WholeNumbers: 1
m_Value: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2023615170869959625
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5203495626939517929}
m_Layer: 5
m_Name: Fill Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5203495626939517929
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2023615170869959625}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 7434744616954175478}
m_Father: {fileID: 5101148945640598805}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.25}
m_AnchorMax: {x: 1, y: 0.75}
m_AnchoredPosition: {x: -5, y: 0}
m_SizeDelta: {x: -20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2471763352390373912
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4308357552645940838}
m_Layer: 5
m_Name: Handle Slide Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4308357552645940838
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2471763352390373912}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 6096567429521374474}
m_Father: {fileID: 5101148945640598805}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2510049255526463552
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6096567429521374474}
- component: {fileID: 4742402777936722718}
- component: {fileID: 3984808659029867453}
m_Layer: 5
m_Name: Handle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6096567429521374474
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2510049255526463552}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4308357552645940838}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4742402777936722718
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2510049255526463552}
m_CullTransparentMesh: 1
--- !u!114 &3984808659029867453
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2510049255526463552}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &3594065669119621667
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6787305365772754371}
- component: {fileID: 5212221834949504815}
- component: {fileID: 7351176722807286657}
- component: {fileID: 1764505660656797435}
m_Layer: 5
m_Name: MorphSlider
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6787305365772754371
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1283946357276694583}
- {fileID: 5101148945640598805}
- {fileID: 4184826984943928819}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 983, y: -294}
m_SizeDelta: {x: 170, y: 36}
m_Pivot: {x: 0, y: 1}
--- !u!222 &5212221834949504815
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_CullTransparentMesh: 1
--- !u!114 &7351176722807286657
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0.392}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &1764505660656797435
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ce70097e989567b4c8cdc841bea38e7c, type: 3}
m_Name:
m_EditorClassIdentifier:
Slider: {fileID: 1160409419726520999}
ToggleCallbacks: {fileID: 0}
Text: {fileID: 3808922627261925310}
Toggle: {fileID: 8264476568868939848}
--- !u!1 &6639914104638231064
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3626829940778144311}
- component: {fileID: 8769834181534787845}
- component: {fileID: 2562180160881843108}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3626829940778144311
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 2149453652001172432}
m_Father: {fileID: 4184826984943928819}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 10, y: -10}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8769834181534787845
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_CullTransparentMesh: 1
--- !u!114 &2562180160881843108
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6739384456699907057
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7434744616954175478}
- component: {fileID: 956272652380745244}
- component: {fileID: 6569251248387748135}
m_Layer: 5
m_Name: Fill
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7434744616954175478
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739384456699907057}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 5203495626939517929}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 10, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &956272652380745244
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739384456699907057}
m_CullTransparentMesh: 1
--- !u!114 &6569251248387748135
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739384456699907057}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6858770152562268284
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2149453652001172432}
- component: {fileID: 7693030575685829328}
- component: {fileID: 3149754566040842011}
m_Layer: 5
m_Name: Checkmark
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2149453652001172432
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6858770152562268284}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 3626829940778144311}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 20}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7693030575685829328
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6858770152562268284}
m_CullTransparentMesh: 1
--- !u!114 &3149754566040842011
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6858770152562268284}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6934912295437609305
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4184826984943928819}
- component: {fileID: 8264476568868939848}
m_Layer: 5
m_Name: Toggle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &4184826984943928819
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6934912295437609305}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 3626829940778144311}
- {fileID: 4779939240792789388}
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0.000015258789, y: 5}
m_SizeDelta: {x: 160, y: 20}
m_Pivot: {x: 0.5, y: 0}
--- !u!114 &8264476568868939848
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6934912295437609305}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 2562180160881843108}
toggleTransition: 1
graphic: {fileID: 3149754566040842011}
m_Group: {fileID: 0}
onValueChanged:
m_PersistentCalls:
m_Calls: []
m_IsOn: 1
--- !u!1 &8095447207275656126
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1283946357276694583}
- component: {fileID: 9132769058287262584}
- component: {fileID: 3808922627261925310}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1283946357276694583
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -0.000030517578}
m_SizeDelta: {x: 0, y: 20}
m_Pivot: {x: 0.5, y: 1}
--- !u!222 &9132769058287262584
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_CullTransparentMesh: 1
--- !u!114 &3808922627261925310
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: New Text
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 16
m_fontSizeBase: 16
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8136949952947563388
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5882853902430253298}
- component: {fileID: 8404216737247336084}
- component: {fileID: 6857429999625137368}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5882853902430253298
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8136949952947563388}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 5101148945640598805}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.25}
m_AnchorMax: {x: 1, y: 0.75}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8404216737247336084
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8136949952947563388}
m_CullTransparentMesh: 1
--- !u!114 &6857429999625137368
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8136949952947563388}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b2d0521d1dc319e418a688922476c31a
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,485 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3594065669119621667
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6787305365772754371}
- component: {fileID: 5212221834949504815}
- component: {fileID: 7351176722807286657}
- component: {fileID: 1764505660656797435}
m_Layer: 5
m_Name: MorphToggle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6787305365772754371
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1283946357276694583}
- {fileID: 4184826984943928819}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 983, y: -294}
m_SizeDelta: {x: 170, y: 36}
m_Pivot: {x: 0, y: 1}
--- !u!222 &5212221834949504815
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_CullTransparentMesh: 1
--- !u!114 &7351176722807286657
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0.392}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &1764505660656797435
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ce70097e989567b4c8cdc841bea38e7c, type: 3}
m_Name:
m_EditorClassIdentifier:
Slider: {fileID: 0}
ToggleCallbacks: {fileID: 8844218806920435032}
Text: {fileID: 3808922627261925310}
Toggle: {fileID: 8264476568868939848}
--- !u!1 &6639914104638231064
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3626829940778144311}
- component: {fileID: 8769834181534787845}
- component: {fileID: 2562180160881843108}
- component: {fileID: 8844218806920435032}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3626829940778144311
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 2149453652001172432}
m_Father: {fileID: 4184826984943928819}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 10, y: -10}
m_SizeDelta: {x: 25, y: 25}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8769834181534787845
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_CullTransparentMesh: 1
--- !u!114 &2562180160881843108
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &8844218806920435032
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6639914104638231064}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 902f33e1b15fa0d40b8eefd09e3ab28f, type: 3}
m_Name:
m_EditorClassIdentifier:
MouseHover:
m_PersistentCalls:
m_Calls: []
MouseHoverEnd:
m_PersistentCalls:
m_Calls: []
--- !u!1 &6858770152562268284
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2149453652001172432}
- component: {fileID: 7693030575685829328}
- component: {fileID: 3149754566040842011}
m_Layer: 5
m_Name: Checkmark
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2149453652001172432
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6858770152562268284}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 3626829940778144311}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.000015258789, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7693030575685829328
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6858770152562268284}
m_CullTransparentMesh: 1
--- !u!114 &3149754566040842011
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6858770152562268284}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &6934912295437609305
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4184826984943928819}
- component: {fileID: 8264476568868939848}
m_Layer: 5
m_Name: Toggle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4184826984943928819
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6934912295437609305}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 3626829940778144311}
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 10, y: 0}
m_SizeDelta: {x: 160, y: 20}
m_Pivot: {x: 0, y: 0.5}
--- !u!114 &8264476568868939848
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6934912295437609305}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 2562180160881843108}
toggleTransition: 1
graphic: {fileID: 3149754566040842011}
m_Group: {fileID: 0}
onValueChanged:
m_PersistentCalls:
m_Calls: []
m_IsOn: 1
--- !u!1 &8095447207275656126
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1283946357276694583}
- component: {fileID: 9132769058287262584}
- component: {fileID: 3808922627261925310}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1283946357276694583
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 20.000002, y: 0}
m_SizeDelta: {x: -39.999996, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9132769058287262584
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_CullTransparentMesh: 1
--- !u!114 &3808922627261925310
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: New Text
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 16
m_fontSizeBase: 16
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a1970a34f4ac9fc4cb6c3ad8678bcdf8
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,873 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1451225421186468728
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5101148945640598805}
- component: {fileID: 1160409419726520999}
m_Layer: 5
m_Name: MorphSlider
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5101148945640598805
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1451225421186468728}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 5882853902430253298}
- {fileID: 5203495626939517929}
- {fileID: 4308357552645940838}
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0.000061035156, y: 0.000030517578}
m_SizeDelta: {x: -10, y: 20}
m_Pivot: {x: 0.5, y: 0}
--- !u!114 &1160409419726520999
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1451225421186468728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 3984808659029867453}
m_FillRect: {fileID: 7434744616954175478}
m_HandleRect: {fileID: 6096567429521374474}
m_Direction: 0
m_MinValue: 0
m_MaxValue: 100
m_WholeNumbers: 1
m_Value: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &2023615170869959625
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5203495626939517929}
m_Layer: 5
m_Name: Fill Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5203495626939517929
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2023615170869959625}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 7434744616954175478}
m_Father: {fileID: 5101148945640598805}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.25}
m_AnchorMax: {x: 1, y: 0.75}
m_AnchoredPosition: {x: -5, y: 0}
m_SizeDelta: {x: -20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2471763352390373912
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4308357552645940838}
m_Layer: 5
m_Name: Handle Slide Area
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4308357552645940838
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2471763352390373912}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 6096567429521374474}
m_Father: {fileID: 5101148945640598805}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &2510049255526463552
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6096567429521374474}
- component: {fileID: 4742402777936722718}
- component: {fileID: 3984808659029867453}
m_Layer: 5
m_Name: Handle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6096567429521374474
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2510049255526463552}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4308357552645940838}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4742402777936722718
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2510049255526463552}
m_CullTransparentMesh: 1
--- !u!114 &3984808659029867453
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2510049255526463552}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &3594065669119621667
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6787305365772754371}
- component: {fileID: 5212221834949504815}
- component: {fileID: 7351176722807286657}
- component: {fileID: 1764505660656797435}
m_Layer: 5
m_Name: MorphToggleSlider
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6787305365772754371
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1283946357276694583}
- {fileID: 5101148945640598805}
- {fileID: 2082427350901896704}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 983, y: -294}
m_SizeDelta: {x: 170, y: 36}
m_Pivot: {x: 0, y: 1}
--- !u!222 &5212221834949504815
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_CullTransparentMesh: 1
--- !u!114 &7351176722807286657
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0.392}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &1764505660656797435
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3594065669119621667}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ce70097e989567b4c8cdc841bea38e7c, type: 3}
m_Name:
m_EditorClassIdentifier:
Slider: {fileID: 1160409419726520999}
ToggleCallbacks: {fileID: 6650061251048089259}
Text: {fileID: 3808922627261925310}
Toggle: {fileID: 6072093624729148347}
--- !u!1 &5100599950166842026
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2082427350901896704}
- component: {fileID: 6072093624729148347}
m_Layer: 5
m_Name: Toggle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2082427350901896704
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5100599950166842026}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1486240385386209732}
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 5, y: -1.5}
m_SizeDelta: {x: 16, y: 16}
m_Pivot: {x: 0, y: 1}
--- !u!114 &6072093624729148347
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5100599950166842026}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 395059011922667607}
toggleTransition: 1
graphic: {fileID: 955629858079808744}
m_Group: {fileID: 0}
onValueChanged:
m_PersistentCalls:
m_Calls: []
m_IsOn: 1
--- !u!1 &6739384456699907057
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7434744616954175478}
- component: {fileID: 956272652380745244}
- component: {fileID: 6569251248387748135}
m_Layer: 5
m_Name: Fill
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &7434744616954175478
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739384456699907057}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 5203495626939517929}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 10, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &956272652380745244
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739384456699907057}
m_CullTransparentMesh: 1
--- !u!114 &6569251248387748135
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6739384456699907057}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8095447207275656126
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1283946357276694583}
- component: {fileID: 9132769058287262584}
- component: {fileID: 3808922627261925310}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1283946357276694583
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 6787305365772754371}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 15.000001, y: -0.000030517578}
m_SizeDelta: {x: -29.999998, y: 20}
m_Pivot: {x: 0.5, y: 1}
--- !u!222 &9132769058287262584
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_CullTransparentMesh: 1
--- !u!114 &3808922627261925310
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8095447207275656126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: New Text
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 16
m_fontSizeBase: 16
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 256
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8136949952947563388
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5882853902430253298}
- component: {fileID: 8404216737247336084}
- component: {fileID: 6857429999625137368}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5882853902430253298
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8136949952947563388}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 5101148945640598805}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.25}
m_AnchorMax: {x: 1, y: 0.75}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8404216737247336084
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8136949952947563388}
m_CullTransparentMesh: 1
--- !u!114 &6857429999625137368
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8136949952947563388}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8780337301073652623
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4260789979014223907}
- component: {fileID: 5491607378222969123}
- component: {fileID: 955629858079808744}
m_Layer: 5
m_Name: Checkmark
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4260789979014223907
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8780337301073652623}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1486240385386209732}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -0.000015258789, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5491607378222969123
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8780337301073652623}
m_CullTransparentMesh: 1
--- !u!114 &955629858079808744
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8780337301073652623}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8849731523621724651
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1486240385386209732}
- component: {fileID: 6863922223278217974}
- component: {fileID: 395059011922667607}
- component: {fileID: 6650061251048089259}
m_Layer: 5
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1486240385386209732
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8849731523621724651}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 4260789979014223907}
m_Father: {fileID: 2082427350901896704}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6863922223278217974
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8849731523621724651}
m_CullTransparentMesh: 1
--- !u!114 &395059011922667607
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8849731523621724651}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &6650061251048089259
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8849731523621724651}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 902f33e1b15fa0d40b8eefd09e3ab28f, type: 3}
m_Name:
m_EditorClassIdentifier:
MouseHover:
m_PersistentCalls:
m_Calls: []
MouseHoverEnd:
m_PersistentCalls:
m_Calls: []

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d14a29596b555f3458423c78e0082679
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 581741c85ee2b1d43b73c88a0364f8c5
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0eb004b3d1c3a5642ae606e60c5294e4
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
Assets/KF3/Scripts.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 038ba5aed73069e4d88ea650fb1c0e7e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,13 @@
namespace KF3
{
public class AdditionalResources : SharedResources
{
public UIKF3MorphSlider Pfb_KF3MorphSliderToggle;
public UIKF3CharacterPanel Pfb_KF3CharacterPanel;
public UIKF3StaticSettings Pfb_KF3StaticSettings;
public UIKF3SceneSettings Pfb_KF3SceneSettings;
public UIKF3MorphSlider Pfb_KF3MorphSlider;
public UIKF3MorphSlider Pfb_KF3MorphToggle;
public UIKF3MorphPanel Pfb_KF3MorphPanel;
}
}

View File

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

View File

@ -0,0 +1,292 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class CharaModelReferencer : MonoBehaviour
{
private void Awake()
{
root = base.transform.Find("root");
if(root != null)
{
boneList.Clear();
MakeBoneList(root);
}
}
private void Update()
{
UpdateOsage();
}
private void LateUpdate()
{
Transform left = boneList.FirstOrDefault(b => b.name == "j_thigh_l");
Transform right = boneList.FirstOrDefault(b => b.name == "j_thigh_r");
LateUpdateOsage(left, right);
}
public void JoinReferenceParam()
{
if (this.refAnimationObj == null) return;
SimpleAnimation component = this.root.GetComponent<SimpleAnimation>();
if (component == null) return;
component.clip = null;
for(int i = component.GetStates().Count() - 1; i >= 0; i--)
{
component.RemoveState(component.GetStates().ToList()[i].name);
}
foreach (CharaModelReferencer.RefAnime refAnime in this.refAnimationObj.GetComponent<CharaModelReferencer>().prefabAnimeList)
{
if (refAnime.clip != null)
{
component.AddState(refAnime.clip, refAnime.name);
}
}
this.rootPos = (this.basePos = this.root.localPosition);
if (this.refAnimationObj.GetComponent<CharaModelReferencer>().scaleParamList.Count > 0)
{
this.root.localPosition = (this.rootPos = new Vector3(this.root.localPosition.x, this.refAnimationObj.GetComponent<CharaModelReferencer>().rootPosY, this.root.localPosition.z));
}
component.gameObject.SetActive(false);
setScaleOne();
foreach (Transform transform in this.boneList)
{
this.setOsage(transform);
this.setScale(transform);
}
component.gameObject.SetActive(true);
}
private void MakeBoneList(Transform bone)
{
if (bone.GetComponent<CharaModelReferencer>() != null)
{
return;
}
if (bone.name.IndexOf("j_") == 0 || bone.name == "root" || bone.name == "pelvis")
{
this.boneList.Add(bone);
}
foreach (object obj in bone)
{
Transform bone2 = (Transform)obj;
this.MakeBoneList(bone2);
}
}
private void setOsage(Transform bone)
{
Osage osage = bone.GetComponent<Osage>();
if (osage == null && bone.name.IndexOf("j_osg") == 0)
{
osage = bone.gameObject.AddComponent<Osage>();
}
CharaModelReferencer.OsageParam osageParam = this.refAnimationObj.GetComponent<CharaModelReferencer>().osageParamList.Find((CharaModelReferencer.OsageParam itm) => itm.boneName == bone.name);
if (osageParam != null)
{
if (osage == null)
{
osage = bone.gameObject.AddComponent<Osage>();
}
osage.boneAxis = osageParam.boneAxis;
osage.stiffnessForce = osageParam.stiffnessForce;
osage.dragForce = osageParam.dragForce;
osage.springForce = osageParam.springForce;
}
else if (osage != null && bone.name.IndexOf("j_osg") != 0)
{
UnityEngine.Object.Destroy(osage);
osage = null;
}
if (osage != null)
{
this.osageList.Add(osage);
}
}
private void setScale(Transform bone)
{
CharaModelReferencer.ScaleParam scaleParam = this.refAnimationObj.GetComponent<CharaModelReferencer>().scaleParamList.Find((CharaModelReferencer.ScaleParam itm) => itm.boneName == bone.name);
if (scaleParam != null)
{
bone.localScale = scaleParam.boneScale;
}
}
public void setScaleOne()
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Transform transform in this.boneList)
{
transform.localScale = Vector3.one;
}
this.root.localPosition = (this.rootPos = Vector3.zero);
}
public void UpdateOsage()
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Osage osage in this.osageList)
{
osage.UpdateOsage();
}
}
public void LateUpdateOsage(Transform thighL, Transform thighR)
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Osage osage in this.osageList)
{
osage.LateUpdateOsage(thighL, thighR);
}
}
public void SetRootPos(bool reset)
{
this.root.localPosition = (reset ? this.basePos : this.rootPos);
}
public void ResetOsage()
{
if (this.refAnimationObj == null)
{
return;
}
foreach (Osage osage in this.osageList)
{
osage.Reset();
}
}
public GameObject refAnimationObj;
private Transform root;
public List<Transform> boneList = new List<Transform>();
private List<Osage> osageList = new List<Osage>();
private Vector3 basePos = Vector3.zero;
private Vector3 rootPos = Vector3.zero;
public CharaMotionDefine.MotionPersonalityType motionPersonalityType;
public List<CharaModelReferencer.RefAnime> prefabAnimeList = new List<CharaModelReferencer.RefAnime>();
public List<CharaModelReferencer.OsageParam> osageParamList = new List<CharaModelReferencer.OsageParam>();
public float rootPosY;
public List<CharaModelReferencer.ScaleParam> scaleParamList = new List<CharaModelReferencer.ScaleParam>();
public Color eyeColor = new Color(0f, 0f, 0f, 0f);
public string tailNodeName = "";
public string earNodeName = "";
public string variantCopyPrefabName = "";
public bool ussVariantCopyPrefabVoice;
[Serializable]
public class RefAnime
{
// Token: 0x06004018 RID: 16408 RVA: 0x001C7E0F File Offset: 0x001C600F
public RefAnime()
{
}
// Token: 0x06004019 RID: 16409 RVA: 0x001C7E30 File Offset: 0x001C6030
public RefAnime(string nam, AnimationClip clp, string se, int eb, int ef, int ea, int tb, int tf, int ta)
{
this.name = nam;
this.clip = clp;
this.seName = se;
this.earBefore = eb;
this.earFrame = ef;
this.earAfter = ea;
this.tailBefore = tb;
this.tailFrame = tf;
this.tailAfter = ta;
}
// Token: 0x0400481C RID: 18460
public string name = "";
// Token: 0x0400481D RID: 18461
public AnimationClip clip;
// Token: 0x0400481E RID: 18462
public string seName = "";
// Token: 0x0400481F RID: 18463
public int earBefore;
// Token: 0x04004820 RID: 18464
public int earFrame;
// Token: 0x04004821 RID: 18465
public int earAfter;
// Token: 0x04004822 RID: 18466
public int tailBefore;
// Token: 0x04004823 RID: 18467
public int tailFrame;
// Token: 0x04004824 RID: 18468
public int tailAfter;
}
[Serializable]
public class OsageParam
{
// Token: 0x04004825 RID: 18469
public string boneName;
// Token: 0x04004826 RID: 18470
public Vector3 boneAxis;
// Token: 0x04004827 RID: 18471
public float stiffnessForce;
// Token: 0x04004828 RID: 18472
public float dragForce;
// Token: 0x04004829 RID: 18473
public Vector3 springForce;
}
[Serializable]
public class ScaleParam
{
// Token: 0x0400482A RID: 18474
public string boneName;
// Token: 0x0400482B RID: 18475
public Vector3 boneScale;
}
}

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1ca9226664748b2429436d99a7bb4d1c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,168 @@
using SerializableTypes;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using static KF3CharacterContainerSerializable;
namespace KF3.Containers
{
[System.Serializable]
public class CharacterKeyframeData : KeyframeData
{
public BoneList[] Bones = new BoneList[0];
public MorphHelper[] Morphs = new MorphHelper[0];
public MorphHelper[] Renderers = new MorphHelper[0];
public bool
EyesLocked,
PhysicsEnabled,
IKEnabled;
public SVector3 LeftEyeRotation, RightEyeRotation;
public SVector3 EyeTarget;
public float LookAtStrength;
public string CurrentAnimation;
public CharacterKeyframeData() { }
public CharacterKeyframeData(KF3CharacterContainer container)
{
this.Root = new SerializableTransform(container.transform);
this.CurrentAnimation = container.CurrentAnimation;
this.IKEnabled = container.IKEnabled;
this.PhysicsEnabled = container.PhysicsEnabled;
if (container as KF3CeruleanContainer != null)
{
var bones = new List<BoneList>
{
new BoneList()
{
Name = "Body",
Bones = container.Body.boneList.Select(b => new SerializableBone(b)).ToArray()
}
};
this.Bones = bones.ToArray();
this.Renderers = container.Renderers.Select(r => new MorphHelper("", GetRendererName(container, r), 0, r.enabled)).ToArray();
}
else if (container as KF3FriendContainer != null)
{
var bones = new List<BoneList>
{
new BoneList()
{
Name = "Body",
Bones = container.Body != null ? container.Body.boneList.Select(b => new SerializableBone(b)).ToArray() : new SerializableBone[0]
}
};
var container1 = (KF3FriendContainer)container;
bones.Add(new BoneList()
{
Name = "Ears",
Bones = container1.Ears != null ? container1.Ears.boneList.Select(b => new SerializableBone(b)).ToArray() : new SerializableBone[0]
});
bones.Add(new BoneList()
{
Name = "EarsAlt",
Bones = container1.EarsAlt != null ? container1.EarsAlt.boneList.Select(b => new SerializableBone(b)).ToArray() : new SerializableBone[0]
});
bones.Add(new BoneList()
{
Name = "Tail",
Bones = container1.Tail != null ? container1.Tail.boneList.Select(b => new SerializableBone(b)).ToArray() : new SerializableBone[0]
});
bones.Add(new BoneList()
{
Name = "TailAlt",
Bones = container1.TailAlt != null ? container1.TailAlt.boneList.Select(b => new SerializableBone(b)).ToArray() : new SerializableBone[0]
});
var extraBones = new List<SerializableBone>();
foreach (var ik in container1.GetComponentsInChildren<InverseKinematics>())
{
extraBones.Add(new SerializableBone(ik.target));
extraBones.Add(new SerializableBone(ik.elbow));
}
bones.Add(new BoneList()
{
Name = "Extra",
Bones = extraBones.ToArray()
});
this.Bones = bones.ToArray();
this.EyesLocked = container1.EyesLocked;
this.LeftEyeRotation = container1.LeftEyeRotation.eulerAngles;
this.RightEyeRotation = container1.RightEyeRotation.eulerAngles;
this.EyeTarget = container1.EyeTarget.transform.localPosition;
this.LookAtStrength = container1.LookAtStrength;
var morphs = new List<MorphHelper>();
foreach (var mesh in container1.Morphs)
{
foreach (MorphHelper morph in mesh.Value)
{
morphs.Add(new MorphHelper(morph.ParentName, morph.Name, morph.Strength, morph.Value));
}
}
this.Morphs = morphs.ToArray();
this.Renderers = container1.Renderers.Select(r => new MorphHelper("", GetRendererName(container1, r), 0, r.enabled)).ToArray();
}
else
{
Error.Log("Sum ting wong", UnityEngine.Color.red);
}
}
public override KeyframeData Clone()
{
var keyframe = new CharacterKeyframeData();
keyframe.Root = new SerializableTransform(this.Root);
keyframe.Bones = this.Bones.Select(b => new BoneList() { Name = b.Name, Bones = b.Bones.Select(b1 => new SerializableBone(b1)).ToArray() }).ToArray();
keyframe.EyesLocked = this.EyesLocked;
keyframe.IKEnabled = this.IKEnabled;
keyframe.PhysicsEnabled = this.PhysicsEnabled;
keyframe.LeftEyeRotation = this.LeftEyeRotation;
keyframe.RightEyeRotation = this.RightEyeRotation;
keyframe.EyeTarget = this.EyeTarget;
keyframe.LookAtStrength = this.LookAtStrength;
keyframe.CurrentAnimation = this.CurrentAnimation;
var morphs = new List<MorphHelper>();
var renderers = new List<MorphHelper>();
foreach (var morph in this.Morphs)
{
morphs.Add(new MorphHelper(morph.ParentName, morph.Name, morph.Strength, morph.Value));
}
foreach (var renderer in this.Renderers)
{
renderers.Add(new MorphHelper(renderer.ParentName, renderer.Name, renderer.Strength, renderer.Value));
}
keyframe.Morphs = morphs.ToArray();
keyframe.Renderers = renderers.ToArray();
return keyframe;
}
public override KeyframeData Lerp(KeyframeData target, float amount)
{
var target1 = target as CharacterKeyframeData;
if (target1 == null) { Debug.LogError("Error, incompatible type"); return this; }
var copy = this.Clone() as CharacterKeyframeData;
copy.Root = copy.Root.LerpWith(target1.Root, amount);
copy.EyeTarget = Vector3.Lerp(copy.EyeTarget, target1.EyeTarget, amount);
foreach (var bonelist in copy.Bones)
{
for (int i = 0; i < bonelist.Bones.Length; i++)
{
var bone1 = target1.Bones.FirstOrDefault(b => b.Name == bonelist.Name)?.Bones.FirstOrDefault(b => b.Name == bonelist.Bones[i].Name);
if (bone1 == null) continue;
bonelist.Bones[i].Transform = bonelist.Bones[i].Transform.LerpWith(bone1.Transform, amount);
}
}
if (copy.Morphs != null && target1.Morphs != null)
{
foreach (var morph in copy.Morphs)
{
var targetMorph = target1.Morphs.FirstOrDefault(m => m.ParentName == morph.ParentName && m.Name == morph.Name);
if (targetMorph == null) continue;
morph.Strength = Mathf.Lerp(morph.Strength, targetMorph.Strength, amount);
}
}
return copy;
}
}
}

View File

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

View File

@ -0,0 +1,162 @@
using KF3.Containers;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class KF3CeruleanContainer : KF3CharacterContainer
{
public UIKF3CharacterPanel CharacterPanel;
public static IEnumerator CreateAsync(string modelName, string animationSetName, System.Action<KF3CeruleanContainer> callback = null)
{
GameObject go = new GameObject(modelName);
var container = go.AddComponent<KF3CeruleanContainer>();
yield return container.BuildGeneral(modelName, animationSetName);
UIHandleCerulean.CreateAsChild(container);
Main.SelectObject(container);
container.LoadInProgress = false;
callback?.Invoke(container);
}
public override void SetAnimationReferences()
{
if (BodyAnimation)
{
BodySimpleAnimation = Body.GetComponentInChildren<SimpleAnimation>();
if (Main.OverrideClip != null)
{
foreach (var anim in BodyAnimation.prefabAnimeList)
{
anim.clip = Main.OverrideClip;
}
}
Body.refAnimationObj = BodyAnimation.gameObject;
Body.JoinReferenceParam();
}
else
{
Error.Log(Color.blue, "Body Animations Missing");
}
}
public override void SetBones()
{
var bones = Body.boneList;
var extraBones = bones.Where(b => b.name.Contains("osg")).ToList();
foreach (var bone in bones)
{
if (!bone.gameObject.TryGetComponent(out UIHandle bone1))
{
if (bone.GetComponent<Osage>() != null)
{
bone1 = UIHandlePhysicsBone.CreateAsChild(this, bone, new List<SerializableBone.BoneTags>() { SerializableBone.BoneTags.Dynamic }).SetColor(Color.cyan).SetName(bone.name);
}
else
{
bone1 = UIHandleBone.CreateAsChild(this, bone, new List<SerializableBone.BoneTags>()).SetColor(Color.gray).SetName(bone.name);
}
}
}
}
public override void DoStuff()
{
foreach (Renderer r in GetComponentsInChildren<Renderer>())
{
Material[] overrideMaterials = new Material[r.materials.Length];
for (int i = 0; i < r.materials.Length; i++)
{
overrideMaterials[i] = new Material(Shader.Find("PRD/FriendsShaderV2"));
if (ModelId >= 40400)
{
overrideMaterials[i].SetTexture("_BaseMap", r.materials[i].GetTexture("_BaseMap"));
overrideMaterials[i].SetTexture("_1st_ShadeMap", r.materials[i].GetTexture("_1st_ShadeMap"));
}
else if (ModelId >= 40000)
{
overrideMaterials[i].SetTexture("_BaseMap", r.materials[i].mainTexture);
overrideMaterials[i].SetTexture("_1st_ShadeMap", r.materials[i].mainTexture);
}
else
{
overrideMaterials[i].SetTexture("_BaseMap", r.materials[i].GetTexture("_BaseMap") as Texture2D);
overrideMaterials[i].SetTexture("_1st_ShadeMap", r.materials[i].GetTexture("_BaseMap") as Texture2D);
}
}
r.materials = overrideMaterials;
Renderers.Add(r);
}
var charaPanel = CharacterPanel = UIKF3CharacterPanel.Create(this);
InstantiatedObjects.Add(charaPanel.gameObject);
}
public override void PastePose(KeyframeData frame, PoseLoadOptions pasteParams)
{
var bones = frame as CharacterKeyframeData;
this.PlayBodyAnimation("");
if (pasteParams.Root)
{
bones.Root.ApplyTo(transform);
}
if (pasteParams.Body)
{
foreach (var bone in this.Body.boneList)
{
if (pasteParams.Other || bone.GetComponent<Osage>() == null)
bones.Bones.FirstOrDefault(b => b.Name == "Body").Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
if (bones.Renderers != null)
{
foreach (var renderer in bones.Renderers)
{
var rend = this.Renderers.FirstOrDefault(r => KF3CharacterContainerSerializable.GetRendererName(this, r) == renderer.Name);
if (rend != null)
{
rend.enabled = renderer.Value;
}
}
}
}
public override IEnumerator GetModel(string bodyIdLong, string costumeId)
{
KF3AssetLibrary lib = Main.Assets;
List<KF3AssetBundle> abList = lib.AssetBundles.Where(ab => ab.FileName.StartsWith($"ch_{bodyIdLong}_")).ToList();
KF3AssetBundle bundle;
//load body
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_{costumeId}.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
Body = spawnAndGetReferencer(ab);
});
}
public override IEnumerator GetAnimations(string idLong)
{
KF3AssetLibrary lib = Main.Assets;
KF3AssetBundle bundle;
List<KF3AssetBundle> abList = lib.AssetBundles.Where(ab => ab.FileName.StartsWith($"ch_{idLong}_")).ToList();
bundle = lib.CeruleanAnimationSets.FirstOrDefault(ab => ab.FileName == $"ch_{idLong}_a_mot.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
BodyAnimation = spawnAndGetReferencer(ab);
});
}
public override void Select()
{
CharacterPanel.gameObject.SetActive(true);
}
public override void Deselect()
{
CharacterPanel.gameObject.SetActive(false);
}
}

View File

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

View File

@ -0,0 +1,265 @@
using KF3.Containers;
using System.Collections;
using System.Linq;
using UnityEngine;
public class KF3CharacterContainer : KF3ObjectContainer
{
protected override System.Type _serializeType => typeof(KF3CharacterContainerSerializable);
protected override System.Type _keyframeType => typeof(CharacterKeyframeData);
public bool
BonesVisible = true,
PhysicsEnabled = true,
IKEnabled = true;
public string
CostumeName,
AnimationName;
public CharaModelReferencer
Body,
BodyAnimation;
public SimpleAnimation
BodySimpleAnimation;
public float AnimationSpeed = 0;
public string CurrentAnimation = "";
protected IEnumerator BuildGeneral(string modelName, string animSetName)
{
enabled = false;
string mIdLong = modelName.Split('_', '.')[1];
string mCostume = modelName.Split('_', '.')[2];
string aIdLong = animSetName.Split('_', '.')[1];
if (LoadInProgress) yield break;
LoadInProgress = true;
ModelId = int.Parse(mIdLong);
CostumeName = modelName;
AnimationName = animSetName;
using(new KeyframeToggleContext(this))
{
yield return GetModel(mIdLong, mCostume);
yield return GetAnimations(aIdLong);
SetAnimationReferences();
SetBones();
DoStuff();
}
SetKeyframe();
enabled = true;
}
public virtual void SetAnimationReferences() {}
public virtual void SetBones() {}
public virtual void DoStuff() {}
public virtual void ToggleBonesVisible(bool value)
{
BonesVisible = value;
foreach (var handle in Handles.Where(h => h as UIHandleBone != null))
{
handle.ToggleActive(value);
}
}
public void TogglePhysics()
{
TogglePhysics(!PhysicsEnabled);
}
public void TogglePhysics(bool value = true)
{
PhysicsEnabled = value;
foreach (var handle in Handles.Where(h => h.GetType() == typeof(UIHandlePhysicsBone)))
{
handle.Target.GetComponent<Osage>().enabled = value;
}
}
public void ResetBones()
{
foreach (var bone in Handles)
{
bone.TransformResetAll();
}
}
public string GetAnimationName()
{
if (BodySimpleAnimation.clip != null)
{
return BodySimpleAnimation.GetStates().FirstOrDefault(st => st.clip.name == BodySimpleAnimation.clip.name).name;
}
else return "";
}
public void PlayBodyAnimation(string clipName)
{
PlayAnimation(BodySimpleAnimation, clipName);
}
public void PlayAnimation(SimpleAnimation anim, string clipName, float time = -1)
{
if (anim == null) return;
else if (string.IsNullOrEmpty(clipName))
{
anim.Stop();
anim.clip = null;
anim.enabled = false;
return;
}
anim.enabled = true;
anim.clip = anim.GetState(clipName).clip;
anim.Play(anim.GetStates().FirstOrDefault(state => state.clip == anim.clip).name);
anim.GetStates().FirstOrDefault(state => state.clip == anim.clip).speed = AnimationSpeed;
if(time != -1)
{
anim.GetStates().FirstOrDefault(state => state.clip == anim.clip).time = time;
}
}
public void RewindAllAnimations()
{
if (BodySimpleAnimation && BodySimpleAnimation.clip != null)
{
BodySimpleAnimation.Rewind();
}
if (this as KF3FriendContainer != null)
{
var EarsSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
var TailSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
if (EarsSimpleAnimation && EarsSimpleAnimation.clip != null)
{
EarsSimpleAnimation.Rewind();
}
if (TailSimpleAnimation && TailSimpleAnimation.clip != null)
{
TailSimpleAnimation.Rewind();
}
}
}
public void UnwindAllAnimations()
{
if (BodySimpleAnimation && BodySimpleAnimation.clip != null)
{
BodySimpleAnimation.Unwind();
}
if (this as KF3FriendContainer != null)
{
var EarsSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
var TailSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
if (EarsSimpleAnimation && EarsSimpleAnimation.clip != null)
{
EarsSimpleAnimation.Unwind();
}
if (TailSimpleAnimation && TailSimpleAnimation.clip != null)
{
TailSimpleAnimation.Unwind();
}
}
}
public void SetAnimationTimeScale(float timeScale)
{
if (BodySimpleAnimation && BodySimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = BodySimpleAnimation.GetStates().FirstOrDefault(state => state.clip == BodySimpleAnimation.clip);
currentClip.speed = timeScale;
}
if (this as KF3FriendContainer != null)
{
var EarsSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
var TailSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
if (EarsSimpleAnimation && EarsSimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = EarsSimpleAnimation.GetStates().FirstOrDefault(state => state.clip == EarsSimpleAnimation.clip);
currentClip.speed = timeScale;
}
if (TailSimpleAnimation && TailSimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = TailSimpleAnimation.GetStates().FirstOrDefault(state => state.clip == TailSimpleAnimation.clip);
currentClip.speed = timeScale;
}
}
}
public void ChangeAnimationTimeScale(int time)
{
if (BodySimpleAnimation && BodySimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = BodySimpleAnimation.GetStates().FirstOrDefault(state => state.clip == BodySimpleAnimation.clip);
currentClip.speed += 0.2f * time;
}
if (this as KF3FriendContainer != null)
{
var EarsSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
var TailSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
if (EarsSimpleAnimation && EarsSimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = EarsSimpleAnimation.GetStates().FirstOrDefault(state => state.clip == EarsSimpleAnimation.clip);
currentClip.speed += 0.2f * time;
}
if (TailSimpleAnimation && TailSimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = TailSimpleAnimation.GetStates().FirstOrDefault(state => state.clip == TailSimpleAnimation.clip);
currentClip.speed += 0.2f * time;
}
}
}
public void ResetAnimationTimeScale()
{
if (BodySimpleAnimation && BodySimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = BodySimpleAnimation.GetStates().FirstOrDefault(state => state.clip == BodySimpleAnimation.clip);
currentClip.speed = currentClip.speed == 0 ? 1 : 0;
}
if (this as KF3FriendContainer != null)
{
var EarsSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
var TailSimpleAnimation = ((KF3FriendContainer)this).EarsSimpleAnimation;
if (EarsSimpleAnimation && EarsSimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = EarsSimpleAnimation.GetStates().FirstOrDefault(state => state.clip == EarsSimpleAnimation.clip);
currentClip.speed = currentClip.speed == 0 ? 1 : 0;
}
if (TailSimpleAnimation && TailSimpleAnimation.clip != null)
{
SimpleAnimation.State currentClip = TailSimpleAnimation.GetStates().FirstOrDefault(state => state.clip == TailSimpleAnimation.clip);
currentClip.speed = currentClip.speed == 0 ? 1 : 0;
}
}
}
public override void SetKeyframe(int frameNum = -1)
{
base.SetKeyframe(frameNum);
}
protected CharaModelReferencer spawnAndGetReferencer(AssetBundle ab)
{
if (ab != null)
{
GameObject go = Instantiate(ab.LoadAsset(ab.GetAllAssetNames()[0]) as GameObject, transform);
ab.Unload(false);
return go.GetComponent<CharaModelReferencer>();
}
return null;
}
/// <summary> Find and load all files related to selected model </summary>
public virtual IEnumerator GetModel(string bodyIdLong, string costumeId)
{
yield break;
}
/// <summary> Find and load all files related to selected animation set </summary>
public virtual IEnumerator GetAnimations(string idLong)
{
yield break;
}
}

View File

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

View File

@ -0,0 +1,60 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
[System.Serializable]
public class KF3CharacterContainerSerializable : KF3ObjectContainerSerializable
{
public bool IsCerulean;
public int ModelId;
public string CostumeName;
public string AnimationName;
public KF3CharacterContainerSerializable() { }
public KF3CharacterContainerSerializable(KF3CharacterContainer container)
{
this.GUID = container.GUID;
this.ModelId = container.ModelId;
this.CostumeName = container.CostumeName;
this.AnimationName = container.AnimationName;
this.IsCerulean = container as KF3CeruleanContainer != null;
this.Frames = container.Frames.Select(f => new FrameContent(f)).ToList();
}
public KF3CharacterContainerSerializable(KF3CharacterContainerSerializable source)
{
this.ModelId = source.ModelId;
this.CostumeName = source.CostumeName;
this.AnimationName = source.AnimationName;
this.IsCerulean = source.IsCerulean;
this.Filename = source.Filename;
this.GUID = source.GUID;
this.Frames = source.Frames.Select(f => new FrameContent(f)).ToList();
}
public static string GetRendererName(KF3ObjectContainer container1, Renderer r)
{
var container = container1 as KF3FriendContainer;
if (container == null) return r.gameObject.name;
else if (r.gameObject.name.ToLower() == "model")
{
if (r.transform.parent == container.Body.transform)
return "hair";
else if (container.Ears && r.transform.parent == container.Ears.transform)
return "ears";
else if (container.EarsAlt && r.transform.parent == container.EarsAlt.transform)
return "ears (alt)";
else if (container.Tail && r.transform.parent == container.Tail.transform)
return "tail";
else if (container.TailAlt && r.transform.parent == container.TailAlt.transform)
return "tail (alt)";
else
return r.gameObject.name;
}
else
return r.gameObject.name;
}
}

View File

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

View File

@ -0,0 +1,746 @@
using KF3.Containers;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class KF3FriendContainer : KF3CharacterContainer
{
public bool
EyesLocked = false;
public float
LookAtStrength;
public Transform
LeftEye,
RightEye,
SubWeapon,
SubWeaponBone;
public UIHandleEyes
EyeTarget;
public Quaternion
LeftEyeRotation = Quaternion.identity,
RightEyeRotation = Quaternion.identity;
/// <summary> Original data </summary>
public CharaModelReferencer
Ears,
EarsAlt,
Tail,
TailAlt;
public CharaModelReferencer
EarsAnimation,
TailAnimation;
/// <summary> Custom Animator </summary>
public SimpleAnimation
EarsSimpleAnimation,
TailSimpleAnimation;
public Dictionary<HumanBodyBones, Transform> HumanBones = new Dictionary<HumanBodyBones, Transform>();
private Dictionary<Transform, UIHandle> BoneHandles = new Dictionary<Transform, UIHandle>();
//private Dictionary<Transform, HumanBodyBones> HumanBonesInverse = new Dictionary<Transform, HumanBodyBones>();
public UIKF3MorphPanel MorphPanel;
public UIKF3CharacterPanel CharacterPanel;
private bool isFakeFriend = false;
public static IEnumerator CreateAsync(string modelName, string animationSetName, bool fakeFriend = false, System.Action<KF3FriendContainer> callback = null)
{
GameObject go = new GameObject(modelName);
var container = go.AddComponent<KF3FriendContainer>();
if (fakeFriend) container.DoNotSave = container.isFakeFriend = true;
yield return container.BuildGeneral(modelName, animationSetName);
if (!container.isFakeFriend) UIHandleFriend.CreateAsChild(container);
container.LoadInProgress = false;
callback?.Invoke(container);
}
protected override void Start()
{
if (isFakeFriend) return;
LeftEyeRotation = LeftEye.localRotation;
RightEyeRotation = RightEye.localRotation;
base.Start();
}
private void Update()
{
if (LoadInProgress || isFakeFriend) return;
if (BodySimpleAnimation && BodySimpleAnimation.clip != null) //check if simple animation component has been set
{
SimpleAnimation.State currentClip = BodySimpleAnimation.GetStates().FirstOrDefault(state => state.clip == BodySimpleAnimation.clip);
if (currentClip.normalizedTime == 1 && currentClip.speed > 0) //check if an animation is playing and if an animation was playing before
{
RewindAllAnimations();
}
else if (currentClip.normalizedTime <= 0 && currentClip.speed < 0) //check if an animation is playing and if an animation was playing before
{
UnwindAllAnimations();
}
}
if ((LeftEye && RightEye && EyeTarget) && !EyesLocked)
{
Vector3 target = Vector3.Lerp(EyeTarget.transform.position, KF3ModelViewerMain.Instance.GetCamera().transform.position, LookAtStrength);
LeftEye.LookAt(target, HumanBones[HumanBodyBones.Head].up);
RightEye.LookAt(target, HumanBones[HumanBodyBones.Head].up);
}
}
#region Setup
public override void SetAnimationReferences()
{
if (BodyAnimation)
{
BodySimpleAnimation = Body.GetComponentInChildren<SimpleAnimation>();
if (Main.OverrideClip != null)
{
foreach (var anim in BodyAnimation.prefabAnimeList)
{
anim.clip = Main.OverrideClip;
}
}
Body.refAnimationObj = BodyAnimation.gameObject;
Body.JoinReferenceParam();
}
else
{
Error.Log(Color.blue, "Body Animations Missing");
}
if (Ears && EarsAnimation)
{
EarsSimpleAnimation = Ears.GetComponentInChildren<SimpleAnimation>();
Ears.transform.SetParent(Body.boneList.FirstOrDefault(b => b.name == "j_head"));
Ears.transform.ResetTransform();
Ears.refAnimationObj = EarsAnimation.gameObject;
Ears.JoinReferenceParam();
if (EarsAlt)
{
EarsAlt.transform.SetParent(Body.boneList.FirstOrDefault(b => b.name == "j_head"));
EarsAlt.transform.ResetTransform();
EarsAlt.GetComponentInChildren<Renderer>().enabled = false;
}
}
else
{
Error.Log(Color.blue, "Ears Missing");
}
if (Tail && TailAnimation)
{
TailSimpleAnimation = Tail.GetComponentInChildren<SimpleAnimation>();
Tail.transform.SetParent(Body.boneList.FirstOrDefault(b => b.name == (string.IsNullOrEmpty(BodyAnimation.tailNodeName) ? "j_lowerbody" : BodyAnimation.tailNodeName)));
Tail.transform.ResetTransform();
Tail.refAnimationObj = TailAnimation.gameObject;
Tail.JoinReferenceParam();
if (TailAlt)
{
TailAlt.transform.SetParent(Body.boneList.FirstOrDefault(b => b.name == (string.IsNullOrEmpty(BodyAnimation.tailNodeName) ? "j_lowerbody" : BodyAnimation.tailNodeName)));
TailAlt.transform.ResetTransform();
TailAlt.GetComponentInChildren<Renderer>().enabled = false;
}
}
else
{
Error.Log(Color.blue, "Tail Missing");
}
}
public override void SetBones()
{
if (isFakeFriend) return;
HumanBones = new Dictionary<HumanBodyBones, Transform>();
var extraBones = Body.boneList.Where(b => b.name.Contains("osg"));
HumanBones.Add(HumanBodyBones.Spine, Body.transform.Find("root/pelvis"));
HumanBones.Add(HumanBodyBones.Hips, Body.transform.Find("root/pelvis/j_lowerbody"));
HumanBones.Add(HumanBodyBones.RightUpperLeg, Body.transform.Find("root/pelvis/j_lowerbody/j_thigh_r"));
HumanBones.Add(HumanBodyBones.RightLowerLeg, Body.transform.Find("root/pelvis/j_lowerbody/j_thigh_r/j_leg_r"));
HumanBones.Add(HumanBodyBones.RightFoot, Body.transform.Find("root/pelvis/j_lowerbody/j_thigh_r/j_leg_r/j_foot_r"));
HumanBones.Add(HumanBodyBones.LeftUpperLeg, Body.transform.Find("root/pelvis/j_lowerbody/j_thigh_l"));
HumanBones.Add(HumanBodyBones.LeftLowerLeg, Body.transform.Find("root/pelvis/j_lowerbody/j_thigh_l/j_leg_l"));
HumanBones.Add(HumanBodyBones.LeftFoot, Body.transform.Find("root/pelvis/j_lowerbody/j_thigh_l/j_leg_l/j_foot_l"));
HumanBones.Add(HumanBodyBones.Chest, Body.transform.Find("root/pelvis/j_upperbody"));
HumanBones.Add(HumanBodyBones.UpperChest, Body.transform.Find("root/pelvis/j_upperbody/j_chest"));
HumanBones.Add(HumanBodyBones.Neck, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_neck"));
HumanBones.Add(HumanBodyBones.Head, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_neck/j_head"));
HumanBones.Add(HumanBodyBones.RightShoulder, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r"));
HumanBones.Add(HumanBodyBones.RightUpperArm, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r"));
HumanBones.Add(HumanBodyBones.RightLowerArm, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r"));
HumanBones.Add(HumanBodyBones.RightHand, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r"));
HumanBones.Add(HumanBodyBones.RightIndexProximal, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r/j_index_a_r"));
HumanBones.Add(HumanBodyBones.RightIndexIntermediate, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r/j_index_a_r/j_index_b_r"));
HumanBones.Add(HumanBodyBones.RightRingProximal, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r/j_ring_a_r"));
HumanBones.Add(HumanBodyBones.RightRingIntermediate, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r/j_ring_a_r/j_ring_b_r"));
HumanBones.Add(HumanBodyBones.RightThumbProximal, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r/j_thumb_a_r"));
HumanBones.Add(HumanBodyBones.RightThumbIntermediate, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_r/j_arm_r/j_forearm_r/j_wrist_r/j_thumb_a_r/j_thumb_b_r"));
HumanBones.Add(HumanBodyBones.LeftShoulder, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l"));
HumanBones.Add(HumanBodyBones.LeftUpperArm, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l"));
HumanBones.Add(HumanBodyBones.LeftLowerArm, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l"));
HumanBones.Add(HumanBodyBones.LeftHand, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l"));
HumanBones.Add(HumanBodyBones.LeftIndexProximal, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l/j_index_a_l"));
HumanBones.Add(HumanBodyBones.LeftIndexIntermediate, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l/j_index_a_l/j_index_b_l"));
HumanBones.Add(HumanBodyBones.LeftRingProximal, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l/j_ring_a_l"));
HumanBones.Add(HumanBodyBones.LeftRingIntermediate, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l/j_ring_a_l/j_ring_b_l"));
HumanBones.Add(HumanBodyBones.LeftThumbProximal, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l/j_thumb_a_l"));
HumanBones.Add(HumanBodyBones.LeftThumbIntermediate, Body.transform.Find("root/pelvis/j_upperbody/j_chest/j_shoulder_l/j_arm_l/j_forearm_l/j_wrist_l/j_thumb_a_l/j_thumb_b_l"));
//HumanBonesInverse = HumanBones.Where(d=>d.Value != null).ToDictionary((i) => i.Value, (i) => i.Key);
if (Tail)
{
extraBones = extraBones.Union(Tail.boneList.Where(b => b.name.Contains("osg")));
}
if (TailAlt)
{
extraBones = extraBones.Union(TailAlt.boneList.Where(b => b.name.Contains("osg")));
}
if (Ears)
{
extraBones = extraBones.Union(Ears.boneList.Where(b => b.name.Contains("osg")));
}
if (EarsAlt)
{
extraBones = extraBones.Union(EarsAlt.boneList.Where(b => b.name.Contains("osg")));
}
var allBones = HumanBones.Where(b => b.Value != null).Select(b => b.Value).Union(Body.transform.Find("root")?.GetComponentsInChildren<Transform>().Where(t => t.name.Contains("weapon")).ToList()).Union(extraBones).Distinct();
foreach (var bone in allBones)
{
var tags = new List<SerializableBone.BoneTags>();
UIHandle handle;
if (HumanBones.ContainsValue(bone))
tags.Add(SerializableBone.BoneTags.Humanoid);
if (bone.name.EndsWith("_l"))
tags.Add(SerializableBone.BoneTags.Left);
else if (bone.name.EndsWith("_r"))
tags.Add(SerializableBone.BoneTags.Right);
if (extraBones.Contains(bone))
{
if (bone.GetComponent<Osage>() != null)
{
tags.Add(SerializableBone.BoneTags.Dynamic);
handle = UIHandlePhysicsBone.CreateAsChild(this, bone, tags).SetColor(Color.cyan);
}
else
{
handle = UIHandleBone.CreateAsChild(this, bone, tags).SetColor(Color.cyan);
}
}
else
{
handle = UIHandleBone.CreateAsChild(this, bone, tags);
}
if (bone == HumanBones[HumanBodyBones.Hips])
handle.SetOffset(bone.up * -0.02f);
if (bone == HumanBones[HumanBodyBones.Chest])
handle.SetOffset(bone.up * -0.02f);
BoneHandles.Add(bone, handle);
}
}
public override void DoStuff()
{
if (isFakeFriend) return;
UIKF3MorphSlider eyeBase = null;
foreach (Renderer r in GetComponentsInChildren<Renderer>())
{
foreach (Material mat in r.materials)
{
#if UNITY_ANDROID
if(!mat.shader.name.EndsWith("V2"))
mat.shader = Shader.Find(mat.shader.name + "V2");
#endif
if (mat.shader.name == "PRD/Cheek")
{
Texture2D tex = mat.GetTexture("_BaseMap") as Texture2D;
mat.shader = Shader.Find("Unlit/Transparent");
mat.mainTexture = tex;
}
}
Renderers.Add(r);
}
var morphPanel = MorphPanel = UIKF3MorphPanel.Create(this);
var charaPanel = CharacterPanel = UIKF3CharacterPanel.Create(this);
InstantiatedObjects.Add(morphPanel.gameObject);
InstantiatedObjects.Add(charaPanel.gameObject);
foreach (Transform child in GetComponentsInChildren<Transform>())
{
switch (child.name)
{
case "md_eye_base":
{
UIKF3MorphSlider.CreateLookAt(this, morphPanel.EyesPanel);
SkinnedMeshRenderer meshRenderer = child.GetComponent<SkinnedMeshRenderer>();
if (meshRenderer == null || meshRenderer.sharedMesh == null) break;
for (int i = 0; i < meshRenderer.sharedMesh.blendShapeCount; i++)
{
UIKF3MorphSlider.CreateMorph(this, meshRenderer, i, "BS_eye.eye_", morphPanel.EyesPanel);
}
if (HumanBones.ContainsKey(HumanBodyBones.Head) && HumanBones[HumanBodyBones.Head] != null && !EyeTarget)
{
Transform head = HumanBones[HumanBodyBones.Head];
EyeTarget = UIHandleEyes.Create(this, head);
}
eyeBase = UIKF3MorphSlider.CreateEyeToggle(this, meshRenderer, morphPanel.EyesPanel, MorphPanel.EyesToggleGroup);
break;
}
case "md_eye_special_a":
case "md_eye_special_b":
{
SkinnedMeshRenderer meshRenderer = child.GetComponent<SkinnedMeshRenderer>();
var toggle = UIKF3MorphSlider.CreateEyeToggle(this, meshRenderer, morphPanel.EyesPanel, MorphPanel.EyesToggleGroup);
break;
}
case "md_mouth_base":
{
SkinnedMeshRenderer meshRenderer = child.GetComponent<SkinnedMeshRenderer>();
if (meshRenderer == null || meshRenderer.sharedMesh == null) break;
for (int i = 0; i < meshRenderer.sharedMesh.blendShapeCount; i++)
{
UIKF3MorphSlider.CreateMorph(this, meshRenderer, i, "BS_mouth.mouth_", morphPanel.MouthPanel);
}
break;
}
case "md_eye_l": LeftEye = child; break;
case "md_eye_r": RightEye = child; break;
case "md_brow_base":
{
SkinnedMeshRenderer meshRenderer = child.GetComponent<SkinnedMeshRenderer>();
if (meshRenderer == null || meshRenderer.sharedMesh == null) break;
for (int i = 0; i < meshRenderer.sharedMesh.blendShapeCount; i++)
{
UIKF3MorphSlider.CreateMorph(this, meshRenderer, i, "BS_brow.brow_", morphPanel.EyebrowsPanel);
}
break;
}
case "md_subweapon":
{
SubWeapon = child;
if (SubWeaponBone == null) break;
SubWeapon.SetParent(SubWeaponBone);
SubWeapon.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
break;
}
case "subweapon":
{
SubWeaponBone = child;
if (SubWeapon == null) break;
SubWeapon.SetParent(SubWeaponBone);
SubWeapon.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
break;
}
}
}
if(eyeBase != null)
{
eyeBase.Toggle.isOn = true;
}
SetIK(HumanBodyBones.LeftUpperArm);
SetIK(HumanBodyBones.RightUpperArm);
SetIK(HumanBodyBones.LeftUpperLeg);
SetIK(HumanBodyBones.RightUpperLeg);
ToggleIK(true);
}
public void SetIK(HumanBodyBones bone)
{
var cTr = transform;
UIHandleIK ikHandle = null;
Color orange = new Color(1.0f, 0.64f, 0.0f);
switch (bone)
{
case HumanBodyBones.LeftUpperArm:
{
if (HumanBones[HumanBodyBones.LeftHand] == null) return;
InverseKinematics IK = gameObject.AddComponent<InverseKinematics>();
IK.upperArm = HumanBones[HumanBodyBones.LeftUpperArm];
IK.forearm = HumanBones[HumanBodyBones.LeftLowerArm];
IK.hand = HumanBones[HumanBodyBones.LeftHand];
IK.elbow = UIHandleIK.CreateTransform("Elbow_L", transform, IK.forearm.position + -cTr.forward * 0.1f);
UIHandleIK.CreateAsChild(this, IK.elbow, orange, IK.name, 0.75f);
IK.target = UIHandleIK.CreateTransform("Hand_L", transform, IK.hand.position, IK.hand.eulerAngles);
ikHandle = UIHandleIK.CreateAsChild(this, IK.target, Color.green, IK.name, 2f);
ikHandle.HiddenHandles = new List<UIHandle> {
BoneHandles[IK.upperArm],
BoneHandles[IK.forearm],
BoneHandles[IK.hand],
};
IK.uppperArm_OffsetRotation = new Vector3(0, 90, 0);
IK.forearm_OffsetRotation = new Vector3(-90, 90, 0);
IK.SpawnLines(Color.green);
break;
}
case HumanBodyBones.RightUpperArm:
{
if (HumanBones[HumanBodyBones.RightHand] == null) return;
InverseKinematics IK = gameObject.AddComponent<InverseKinematics>();
IK.upperArm = HumanBones[HumanBodyBones.RightUpperArm];
IK.forearm = HumanBones[HumanBodyBones.RightLowerArm];
IK.hand = HumanBones[HumanBodyBones.RightHand];
IK.elbow = UIHandleIK.CreateTransform("Elbow_R", transform, IK.forearm.position + -cTr.forward * 0.1f);
UIHandleIK.CreateAsChild(this, IK.elbow, orange, IK.name, 0.75f);
IK.target = UIHandleIK.CreateTransform("Hand_R", transform, IK.hand.position, IK.hand.eulerAngles);
ikHandle = UIHandleIK.CreateAsChild(this, IK.target, Color.blue, IK.name, 2f);
ikHandle.HiddenHandles = new List<UIHandle> {
BoneHandles[IK.upperArm],
BoneHandles[IK.forearm],
BoneHandles[IK.hand],
};
IK.uppperArm_OffsetRotation = new Vector3(0, 90, 0);
IK.forearm_OffsetRotation = new Vector3(-90, 90, 0);
IK.SpawnLines(Color.blue);
break;
}
case HumanBodyBones.LeftUpperLeg:
{
if (HumanBones[HumanBodyBones.LeftFoot] == null) return;
InverseKinematics IK = gameObject.AddComponent<InverseKinematics>();
IK.upperArm = HumanBones[HumanBodyBones.LeftUpperLeg];
IK.forearm = HumanBones[HumanBodyBones.LeftLowerLeg];
IK.hand = HumanBones[HumanBodyBones.LeftFoot];
IK.elbow = UIHandleIK.CreateTransform("Knee_L", transform, IK.forearm.position + cTr.forward * 0.2f);
UIHandleIK.CreateAsChild(this, IK.elbow, orange, IK.name, 0.75f);
IK.target = UIHandleIK.CreateTransform("Foot_L", transform, IK.hand.position, IK.hand.eulerAngles + cTr.forward * 45);
ikHandle = UIHandleIK.CreateAsChild(this, IK.target, Color.green, IK.name, 2f);
ikHandle.HiddenHandles = new List<UIHandle> {
BoneHandles[IK.upperArm],
BoneHandles[IK.forearm],
BoneHandles[IK.hand],
};
IK.uppperArm_OffsetRotation = new Vector3(0, 90, 0);
IK.forearm_OffsetRotation = new Vector3(-90, 90, 0);
IK.hand_OffsetRotation = new Vector3(0, 0, -45);
IK.SpawnLines(Color.green);
break;
}
case HumanBodyBones.RightUpperLeg:
{
if (HumanBones[HumanBodyBones.RightFoot] == null) return;
InverseKinematics IK = gameObject.AddComponent<InverseKinematics>();
IK.upperArm = HumanBones[HumanBodyBones.RightUpperLeg];
IK.forearm = HumanBones[HumanBodyBones.RightLowerLeg];
IK.hand = HumanBones[HumanBodyBones.RightFoot];
IK.elbow = UIHandleIK.CreateTransform("Knee_R", transform, IK.forearm.position + cTr.forward * 0.2f);
UIHandleIK.CreateAsChild(this, IK.elbow, orange, IK.name, 0.75f);
IK.target = UIHandleIK.CreateTransform("Foot_R", transform, IK.hand.position, IK.hand.eulerAngles + cTr.forward * 45);
ikHandle = UIHandleIK.CreateAsChild(this, IK.target, Color.blue, IK.name, 2f);
ikHandle.HiddenHandles = new List<UIHandle> {
BoneHandles[IK.upperArm],
BoneHandles[IK.forearm],
BoneHandles[IK.hand],
};
IK.uppperArm_OffsetRotation = new Vector3(0, 90, 0);
IK.forearm_OffsetRotation = new Vector3(-90, 90, 0);
IK.hand_OffsetRotation = new Vector3(0, 0, -45);
IK.SpawnLines(Color.blue);
break;
}
}
}
#endregion
#region Animation
public void PlayEarsAnimation(string clipName)
{
PlayAnimation(EarsSimpleAnimation, clipName);
}
public void PlayTailAnimation(string clipName)
{
PlayAnimation(TailSimpleAnimation, clipName);
}
#endregion
#region Control
public void UpdateLookAtTarget(float value)
{
LookAtStrength = value;
}
public void UpdateMorph(SkinnedMeshRenderer meshRenderer, int id, float value, Slider slider = null)
{
meshRenderer.SetBlendShapeWeight(id, value);
Morphs[meshRenderer].First(m => m.Name == meshRenderer.sharedMesh.GetBlendShapeName(id)).Strength = value;
if (slider)
slider.SetValueWithoutNotify(value);
}
#endregion
#region Toggles
public void ToggleIK(bool value)
{
foreach (var ik in GetComponents<InverseKinematics>())
{
ik.SoftEnabled = value;
ik.linesVisible = value;
}
foreach (UIHandleIK ikHandle in Handles.Where(h=>h.GetType() == typeof(UIHandleIK)))
{
foreach(var handle in ikHandle.HiddenHandles)
{
handle.ForceDisplayOff(value);
}
}
IKEnabled = value;
}
public override void ToggleBonesVisible(bool value)
{
base.ToggleBonesVisible(value);
if (EyeTarget != null)
{
EyeTarget.ToggleActive(value);
}
}
#endregion
public override void Select()
{
MorphPanel.gameObject.SetActive(true);
CharacterPanel.gameObject.SetActive(true);
}
public override void Deselect()
{
MorphPanel.gameObject.SetActive(false);
CharacterPanel.gameObject.SetActive(false);
}
public override void PastePose(KeyframeData keyframe1, PoseLoadOptions pasteParams)
{
var keyframe = keyframe1 as CharacterKeyframeData;
this.CurrentAnimation = keyframe.CurrentAnimation;
if (keyframe.CurrentAnimation == "")
{
ToggleIK(keyframe.IKEnabled);
this.PlayAnimation(this.BodySimpleAnimation, "");
}
else
{
ToggleIK(false);
int currentFrame = TimelineController.Instance.CurrentFrame;
FrameContent startFrame = null;
foreach (var frame in Frames)
{
if (frame.FrameNum <= currentFrame && (frame.ObjectData as CharacterKeyframeData).CurrentAnimation == keyframe.CurrentAnimation)
{
if (startFrame == null || frame.FrameNum > startFrame.FrameNum)
{
startFrame = frame;
}
}
}
float diff = currentFrame - startFrame.FrameNum;
this.PlayAnimation(this.BodySimpleAnimation, keyframe.CurrentAnimation, diff * (TimelineController.Instance.FrameDelayMS/1000));
}
var body = keyframe.Bones.FirstOrDefault(b => b.Name == "Body") ?? new BoneList();
var ears = keyframe.Bones.FirstOrDefault(b => b.Name == "Ears") ?? new BoneList();
var tail = keyframe.Bones.FirstOrDefault(b => b.Name == "Tail") ?? new BoneList();
var earsAlt = keyframe.Bones.FirstOrDefault(b => b.Name == "EarsAlt") ?? new BoneList();
var tailAlt = keyframe.Bones.FirstOrDefault(b => b.Name == "TailAlt") ?? new BoneList();
if (pasteParams.Root)
{
keyframe.Root.ApplyTo(transform);
}
if (pasteParams.Body)
{
foreach (var bone in this.Body.boneList)
{
if (pasteParams.Other || bone.GetComponent<Osage>() == null)
body.Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
if (pasteParams.Tail)
{
if (this.Tail != null)
{
foreach (var bone in this.Tail.boneList)
{
tail.Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
if (this.TailAlt != null)
{
foreach (var bone in this.TailAlt.boneList)
{
tailAlt.Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
}
if (pasteParams.Ears)
{
if (this.Ears != null)
{
foreach (var bone in this.Ears.boneList)
{
ears.Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
if (this.EarsAlt != null && earsAlt != null)
{
foreach (var bone in this.EarsAlt.boneList)
{
earsAlt.Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
}
foreach (var ik in GetComponentsInChildren<InverseKinematics>())
{
var bones1 = keyframe.Bones.FirstOrDefault(b => b.Name == "Extra");
if (bones1 != null)
{
bones1.Bones.FirstOrDefault(b => b.Name == ik.target.name)?.Transform.ApplyTo(ik.target);
bones1.Bones.FirstOrDefault(b => b.Name == ik.elbow.name)?.Transform.ApplyTo(ik.elbow);
}
}
if (pasteParams.Morphs)
{
//MorphPanel.PasteValues(keyframe.Renderers);
foreach (var morph in keyframe.Morphs)
{
var rend = this.Morphs.Keys.FirstOrDefault(k => k.name == morph.ParentName);
if (rend == null) continue;
MorphHelper h = this.Morphs[rend].FirstOrDefault(m => m.Name == morph.Name);
if (h != null) this.UpdateMorph(rend, rend.sharedMesh.GetBlendShapeIndex(morph.Name), morph.Strength, h.Slider);
}
}
if (keyframe.Renderers != null)
{
foreach (var renderer in keyframe.Renderers)
{
var rend = this.Renderers.FirstOrDefault(r => KF3CharacterContainerSerializable.GetRendererName(this, r) == renderer.Name);
if (rend != null)
{
rend.enabled = renderer.Value;
}
}
}
this.TogglePhysics(keyframe.PhysicsEnabled);
this.EyesLocked = keyframe.EyesLocked;
this.LeftEyeRotation = Quaternion.Euler(keyframe.LeftEyeRotation);
this.RightEyeRotation = Quaternion.Euler(keyframe.RightEyeRotation);
this.EyeTarget.transform.localPosition = keyframe.EyeTarget;
this.LookAtStrength = keyframe.LookAtStrength;
this.CharacterPanel.UpdateSelection();
}
public override IEnumerator GetModel(string bodyIdLong, string costumeId)
{
KF3AssetLibrary lib = Main.Assets;
List<KF3AssetBundle> abList = lib.AssetBundles.Where(ab => ab.FileName.StartsWith($"ch_{bodyIdLong}_")).ToList();
KF3AssetBundle bundle;
//load body
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_{costumeId}.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
Body = spawnAndGetReferencer(ab);
});
//load ears
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_{costumeId}_ear.prefab");
if (bundle == null)
{
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_a_ear.prefab");
}
yield return lib.LoadAsset(bundle, (ab) =>
{
Ears = spawnAndGetReferencer(ab);
});
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_z_ear.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
EarsAlt = spawnAndGetReferencer(ab);
});
//load tail
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_{costumeId}_tail.prefab");
if (bundle == null)
{
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_a_tail.prefab");
}
yield return lib.LoadAsset(bundle, (ab) =>
{
Tail = spawnAndGetReferencer(ab);
});
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_z_tail.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
TailAlt = spawnAndGetReferencer(ab);
});
}
public override IEnumerator GetAnimations(string idLong)
{
KF3AssetLibrary lib = Main.Assets;
KF3AssetBundle bundle;
List<KF3AssetBundle> abList = lib.AssetBundles.Where(ab => ab.FileName.StartsWith($"ch_{idLong}_")).ToList();
//load body motion
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{idLong}_a_mot.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
BodyAnimation = spawnAndGetReferencer(ab);
});
//load ears motion
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{idLong}_a_ear_mot.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
EarsAnimation = spawnAndGetReferencer(ab);
});
//load tail motion
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{idLong}_a_tail_mot.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
TailAnimation = spawnAndGetReferencer(ab);
});
}
}

View File

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

View File

@ -0,0 +1,58 @@
using KF3.Containers;
using System;
using UnityEngine;
public class KF3ObjectContainer : ObjectContainer
{
protected override System.Type _serializeType => typeof(KF3ObjectContainerSerializable);
public KF3CharacterContainer AsCharacter => this as KF3CharacterContainer;
protected static KF3ModelViewerMain Main => KF3ModelViewerMain.Instance;
protected override void Start()
{
if (DoNotSave) return;
if(Frames.Count == 0)
{
SetKeyframe();
}
KF3ModelViewerMain.RegisterObject(this);
var selector = UITimelineObjectEntry.Create(this);
InstantiatedObjects.Add(selector.gameObject);
KF3ModelViewerMain.Instance.SelectObject(this);
}
protected override void OnDestroy()
{
if (Main.SelectedObject == this)
{
Main.SelectObject(null);
}
KF3ModelViewerMain.UnregisterObject(this);
base.OnDestroy();
}
#region Timeline
public override DataType GetDataType()
{
switch (this)
{
case KF3FriendContainer _:
return DataType.Character;
case KF3CeruleanContainer _:
return DataType.Character;
case KF3StaticContainer _:
return DataType.Object;
default:
Error.Log(Color.red, GetType().FullName);
throw new NotImplementedException();
}
}
#endregion
}

View File

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

View File

@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Linq;
[System.Serializable]
public class KF3ObjectContainerSerializable : ObjectContainerSerializable
{
public KF3ObjectContainerSerializable() : base() { }
public KF3ObjectContainerSerializable(KF3ObjectContainer container) : base(container) { }
public KF3ObjectContainerSerializable(KF3ObjectContainerSerializable source) : base(source) { }
}

View File

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

View File

@ -0,0 +1,185 @@
using KF3.Containers;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class KF3SceneContainer : SceneContainer
{
public string BackgroundName = "";
public Dictionary<string, GameObject> Backgrounds = new Dictionary<string, GameObject>();
public string StageName = "";
public Dictionary<string, GameObject> Stages = new Dictionary<string, GameObject>();
public List<GameObject> InstantiatedObjects = new List<GameObject>();
public List<FrameContent> Frames = new List<FrameContent>();
public UIKF3SceneSettings Settings;
protected KF3ModelViewerMain Main => KF3ModelViewerMain.Instance;
public override void Init(ModelViewerMain main1)
{
var main = main1 as KF3ModelViewerMain;
base.Init(main);
Settings = UIKF3SceneSettings.Create(this);
InstantiatedObjects.Add(Settings.gameObject);
if (main.UI != null)
{
KF3ModelViewerInterface.SetDropdownData(Settings.StageDropdown, KF3ModelViewerMain.Instance.Assets.Stages.Select(s => s.DisplayName).ToList(), true);
KF3ModelViewerInterface.SetDropdownData(Settings.BackgroundDropdown, KF3ModelViewerMain.Instance.Assets.Skies.Select(s => s.DisplayName).ToList(), true);
}
}
public void SetBackground(string newBackground)
{
if (newBackground == BackgroundName) return;
var currentBackground = BackgroundName;
if (newBackground != "")
{
if (!Backgrounds.ContainsKey(newBackground))
{
Backgrounds[newBackground] = null;
KF3ModelViewerMain.Instance.StartCoroutine(Main.Builder.SpawnAsset(newBackground, bg =>
{
Backgrounds[newBackground] = bg;
InstantiatedObjects.Add(bg);
}));
}
else
{
Backgrounds[newBackground]?.SetActive(true);
}
}
if (currentBackground != "")
{
Backgrounds[currentBackground]?.SetActive(false);
var currentFrame = TimelineController.Instance.CurrentFrame;
bool containsCurrent = Frames.Where(f => (f.ObjectData as SceneKeyframe).Background == currentBackground && f.FrameNum != currentFrame).Any();
if (!containsCurrent)
{
KF3ModelViewerMain.DisposeOf(Backgrounds[currentBackground]);
Backgrounds.Remove(currentBackground);
}
}
BackgroundName = newBackground;
}
public void SetStage(string newStage)
{
if (newStage == StageName) return;
var currentStage = StageName;
if (newStage != "")
{
if (!Stages.ContainsKey(newStage))
{
Stages[newStage] = null;
KF3ModelViewerMain.Instance.StartCoroutine(Main.Builder.SpawnAsset(newStage, bg =>
{
Stages[newStage] = bg;
InstantiatedObjects.Add(bg);
}));
}
else
{
Stages[newStage]?.SetActive(true);
}
}
if (currentStage != "")
{
Stages[currentStage]?.SetActive(false);
var currentFrame = TimelineController.Instance.CurrentFrame;
bool containsCurrent = Frames.Where(f => (f.ObjectData as SceneKeyframe).Stage == currentStage && f.FrameNum != currentFrame).Any();
if (!containsCurrent)
{
KF3ModelViewerMain.DisposeOf(Stages[currentStage]);
Stages.Remove(currentStage);
}
}
StageName = newStage;
}
public KeyframeData SerializeFrame()
{
return new SceneKeyframe(this);
}
public override SceneSerializable Serialize()
{
return new KF3SceneSerializable(this);
}
public void Lerp(KeyframeData frame1, KeyframeData frame2, float amount)
{
var frame = (frame1 as SceneKeyframe).Lerp(frame2, amount) as SceneKeyframe;
SetBackground(frame.Background);
SetStage(frame.Stage);
}
public void GetClosestFrames(int frame, out FrameContent previousFrame, out FrameContent nextFrame)
{
previousFrame = null;
nextFrame = null;
var frames = Frames.OrderBy(f => f.FrameNum).ToArray();
for (int i = 0; i < Frames.Count; i++)
{
if (Frames[i].FrameNum < frame)
{
previousFrame = nextFrame = frames[i];
}
else if (Frames[i].FrameNum == frame)
{
previousFrame = nextFrame = frames[i];
break;
}
else if (Frames[i].FrameNum > frame)
{
if (previousFrame == null) previousFrame = frames[i];
nextFrame = frames[i];
break;
}
}
}
public virtual void SetKeyframe(int frameNum = -1)
{
if (frameNum == -1) frameNum = TimelineController.Instance.CurrentFrame;
GetClosestFrames(frameNum, out var previousFrame, out var nextFrame);
FrameContent currentFrame = null;
if (previousFrame == null || previousFrame.FrameNum != frameNum)
{
currentFrame = new FrameContent(frameNum);
Frames.Add(currentFrame);
Frames = Frames.OrderBy(f => f.FrameNum).ToList();
}
else if (previousFrame.FrameNum == frameNum) currentFrame = previousFrame;
else if (nextFrame.FrameNum == frameNum) currentFrame = nextFrame;
currentFrame.SetObjectData(SerializeFrame());
TimelineController.UpdateTimeline();
}
public void SetDefaultFrame()
{
Frames = new List<FrameContent>()
{
new FrameContent(0).SetObjectData(SerializeFrame())
};
}
}

View File

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

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using UnityEngine;
using UnityEngine.Networking.Types;
[Serializable]
public class KF3SceneSerializable : SceneSerializable
{
public List<FrameContent> Frames = new List<FrameContent>();
public KF3SceneSerializable() { }
public KF3SceneSerializable(KF3SceneContainer scene)
{
this.Version = Application.version;
this.Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture); ;
this.Timeline = new TimelineControllerSerializable(TimelineController.Instance);
this.Frames = scene.Frames.Select(f => new FrameContent(f)).ToList();
foreach(var obj in scene.AllObjects)
{
Objects.Add(obj.Serialize() as KF3ObjectContainerSerializable);
}
}
}

View File

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

View File

@ -0,0 +1,286 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
public class KF3StaticContainer : KF3ObjectContainer
{
public bool CanBeSaved = true;
private bool paused = false;
public int SelectedMaterialVariant = 0;
private Dictionary<Renderer, List<Material[]>> _materialVariants = new Dictionary<Renderer, List<Material[]>>();
private Material lineMaterial;
public List<GameObject> DetachableObjects = new List<GameObject>();
private Dictionary<GameObject, Transform[]> linePoints = new Dictionary<GameObject, Transform[]>();
public UIKF3StaticSettings SettingsPanel;
//private void Start()
//{
// KF3ModelContainer mc = gameObject.AddComponent<KF3ModelContainer>();
// mc.Renderers = this.renderers;
//}
public static KF3StaticContainer Create(AssetBundle ab)
{
if(ab == null) return null;
GameObject go = Instantiate(ab.LoadAsset(ab.GetAllAssetNames()[0]) as GameObject);
var container = go.AddComponent<KF3StaticContainer>();
container.name = ab.name;
UIHandleProp.CreateAsChild(container, go.transform);
container.Init();
ab.Unload(false);
return container;
}
public void Init()
{
Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>();
foreach (Renderer renderer in renderers)
{
Material[] overrideMaterials = new Material[renderer.materials.Length];
Material[] overrideMaterials2 = new Material[renderer.materials.Length];
for (int i = 0; i < renderer.materials.Length; i++)
{
if (renderer.materials[i].shader.name == "PRD/Stage")
{
overrideMaterials[i] = new Material(Shader.Find("PRD/FriendsShaderV2"));
{
overrideMaterials[i].SetTexture("_BaseMap", renderer.materials[i].mainTexture);
overrideMaterials[i].SetTexture("_1st_ShadeMap", renderer.materials[i].mainTexture);
}
overrideMaterials2[i] = new Material(renderer.materials[i]);
{
overrideMaterials2[i].SetTexture("_ShadowTex", null);
}
}
else
{
overrideMaterials[i] = overrideMaterials2[i] = renderer.materials[i];
}
}
AddMaterialVariant(renderer, renderer.materials);
AddMaterialVariant(renderer, overrideMaterials);
AddMaterialVariant(renderer, overrideMaterials2);
}
SettingsPanel = UIKF3StaticSettings.Create(this);
InstantiatedObjects.Add(SettingsPanel.gameObject);
}
public void PauseAll()
{
foreach (var par in transform.GetComponentsInChildren<ParticleSystem>())
{
par.Pause();
}
foreach (var anim in transform.GetComponentsInChildren<Animator>())
{
anim.speed = 0;
}
paused = true;
}
public void PlauseAll()
{
if (paused)
UnPauseAll();
else
PauseAll();
}
public void UnPauseAll()
{
foreach (var par in transform.GetComponentsInChildren<ParticleSystem>())
{
par.Play();
}
foreach (var anim in transform.GetComponentsInChildren<Animator>())
{
anim.speed = 1;
}
paused = false;
}
public void ReStartAll()
{
foreach (var par in transform.GetComponentsInChildren<ParticleSystem>())
{
par.time = 0;
par.Play();
}
foreach (var anim in transform.GetComponentsInChildren<Animator>())
{
anim.Play(anim.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, 0);
anim.speed = 1;
}
paused = false;
}
public void ToggleLines()
{
bool value = false;
foreach(var linePoint in linePoints)
{
value = !linePoint.Key.GetComponent<LineRenderer>().enabled;
break;
}
foreach (var linePoint in linePoints)
{
linePoint.Key.GetComponent<LineRenderer>().enabled = value;
}
}
////Set up UI knobs for every sub-objects of an animated effect
//public void BuildHierarchy()
//{
// foreach (var par in transform.GetComponentsInChildren<ParticleSystem>())
// {
// if (par.transform.GetComponent<UIHandle>() == null)
// {
// par.gameObject.layer = 0;
// par.gameObject.AddComponent<UIHandleParticle>()
// .Init(par.gameObject).SetScale(1f).SetColor(Color.blue);
// NewLine(par.transform.parent, par.transform, 0.01f, Color.blue);
// }
// }
// foreach (var rend in transform.GetComponentsInChildren<Renderer>())
// {
// if (rend.transform.parent.GetComponent<UIHandle>() == null)
// {
// Renderers.Add(rend);
// rend.transform.parent.gameObject.layer = 0;
// rend.transform.parent.gameObject.AddComponent<UIHandleDetachable>()
// .Init(rend.transform.parent.gameObject).SetScale(1f).SetColor(Color.gray);
// NewLine(transform, rend.transform.parent, 0.01f, Color.gray);
// DetachableObjects.Add(rend.transform.gameObject);
// }
// }
//}
//public GameObject DetachObject(int index)
//{
// return DetachObject(DetachableObjects[index]);
//}
//public GameObject DetachObject(GameObject go)
//{
// var detached = Instantiate(go);
// var knobs = detached.GetComponentsInChildren<UIHandle>();
// UIHandle knob = null;
// for (int i = knobs.Length - 1; i >= 0; i--)
// {
// knob = knobs[i];
// if(knob.GetType() == typeof(UIHandleParticle))
// {
// Destroy(knob.ClearForDeletion());
// DestroyImmediate(knob.gameObject);
// }
// else
// {
// Destroy(knob.ClearForDeletion());
// }
// }
// var container = detached.AddComponent<KF3StaticContainer>();
// detached.transform.position = go.transform.position;
// detached.transform.rotation = go.transform.rotation;
// detached.name = go.name + "_Detached";
// container.CanBeSaved = false;
// Destroy(detached.GetComponent<UIHandle>().ClearForDeletion());
// knob = detached.AddComponent<UIHandleFurniture>()
// .Init(detached).SetDefaults(Vector3.zero, Vector3.zero, Vector3.one);
// var renderers = detached.GetComponentsInChildren<Renderer>().ToList();
// renderers.Remove(detached.GetComponent<Renderer>());
// foreach (var rend in renderers)
// {
// rend.gameObject.layer = 0;
// rend.gameObject.AddComponent<UIHandleDetachable>()
// .Init(rend.gameObject).SetColor(Color.gray).SetScale(1).SetName(detached.name + "_part");
// rend.enabled = true;
// //var go2 = container.NewLine(rend.transform, rend.transform.parent, 0.01f, Color.gray);
// //go2.name = rend.transform.name + " -> " + rend.transform.parent.name;
// }
// knob.ScaleReset();
// return detached;
//}
public GameObject NewLine(Transform point1, Transform point2, float width, Color color)
{
if(lineMaterial == null)
{
lineMaterial = new Material(Shader.Find("Legacy Shaders/Particles/Alpha Blended Premultiply"));
}
GameObject go = new GameObject("line");
go.layer = 5;
go.transform.SetParent(this.transform);
var lr = go.AddComponent<LineRenderer>();
lr.startWidth = lr.endWidth = width;
lr.startColor = lr.endColor = color;
lr.sharedMaterial = lineMaterial;
linePoints.Add(go, new Transform[] { point1, point2 });
return go;
}
private void Update()
{
foreach (var kv in linePoints)
{
var lr = kv.Key.GetComponent<LineRenderer>();
for (int i = 0; i < kv.Value.Length; i++)
{
lr.SetPosition(i, kv.Value[i].position);
}
}
}
public void AddMaterialVariant(Renderer renderer, Material[] materialVariant)
{
if (!_materialVariants.ContainsKey(renderer))
{
_materialVariants.Add(renderer, new List<Material[]>());
}
_materialVariants[renderer].Add(materialVariant);
}
public void SetMaterialVariant(int index)
{
foreach (var keyValue in _materialVariants)
{
keyValue.Key.materials = keyValue.Value[index];
}
}
protected override void OnDestroy()
{
Destroy(lineMaterial);
foreach(var material in _materialVariants)
{
foreach(var material1 in material.Value)
{
foreach (var material2 in material1)
{
Destroy(material2);
}
}
}
base.OnDestroy();
}
public override void Select()
{
SettingsPanel.gameObject.SetActive(true);
}
public override void Deselect()
{
SettingsPanel.gameObject.SetActive(false);
}
}

View File

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

View File

@ -0,0 +1,34 @@
namespace KF3.Containers
{
[System.Serializable]
public class SceneKeyframe : KeyframeData
{
public string Stage;
public string Background;
public SceneKeyframe() { }
public SceneKeyframe(KF3SceneContainer main)
{
this.Root = null;
this.Stage = main.StageName;
this.Background = main.BackgroundName;
}
public override KeyframeData Clone()
{
var keyframe = new SceneKeyframe();
keyframe.Root = null;
keyframe.Stage = this.Stage;
keyframe.Background = this.Background;
return keyframe;
}
public override KeyframeData Lerp(KeyframeData target1, float amount)
{
var target = target1 as SceneKeyframe;
var copy = this.Clone() as SceneKeyframe;
return copy;
}
}
}

View File

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

View File

@ -0,0 +1,11 @@
using UnityEngine;
using UnityEngine.Playables;
public static class CustomPlayableExtensions
{
public static void ResetTime(this Playable playable, float time)
{
playable.SetTime(time);
playable.SetTime(time);
}
}

View File

@ -0,0 +1,13 @@
fileFormatVersion: 2
guid: 1d6aadfd4af940c47a915f6e609245bd
timeCreated: 1519667576
licenseType: Pro
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b77693a8e9b9801468ec185f1ab291a8
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,30 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIHandleCerulean : UIHandle
{
protected KF3CeruleanContainer mContainer => Owner as KF3CeruleanContainer;
public static UIHandleCerulean CreateAsChild(KF3ObjectContainer owner)
{
var handle = CreateAsChild<UIHandleCerulean>(owner.transform);
handle.Init(owner).SetColor(Color.yellow).SetScale(1.5f);
return handle;
}
public override UIHandle Init(ObjectContainer owner)
{
base.Init(owner);
Popup.AddButton("Reset Position", () => TransformResetPosition());
Popup.AddButton("Reset Rotation", () => TransformResetRotation());
Popup.AddButton("Reset Scale", () => TransformResetScale());
Popup.AddButton("Toggle Physics", () => mContainer.TogglePhysics());
Popup.AddButton("Toggle Bones", () => mContainer.ToggleBonesVisible(!mContainer.BonesVisible));
Popup.AddButton("Reset Bones", () => mContainer.ResetBones());
Popup.AddButton("Delete", () => Destroy(Owner));
return this;
}
}

View File

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

View File

@ -0,0 +1,52 @@
using UnityEngine;
public class UIHandleEyes : UIHandle
{
public static UIHandleEyes Create(KF3FriendContainer owner, Transform head)
{
var handle = new GameObject().AddComponent<UIHandleEyes>();
handle.Init(owner, handle.transform)
.SetScale(2)
.SetColor(Color.red);
handle.name = $"Eyes_{owner.ModelId}";
handle.transform.localScale = 0.1f * Vector3.one;
handle.transform.SetParent(head);
handle.transform.position = head.position + head.forward;
return handle;
}
public override UIHandle Init(ObjectContainer friend)
{
base.Init(friend);
Popup.AddButton("Reset Position", () => LookAtPositionReset());
Popup.AddButton("Change mode", () => SwapLookAtMode());
return this;
}
public override void UpdateManual(Camera camera, bool linesEnabled)
{
base.UpdateManual(camera, linesEnabled);
transform.localEulerAngles = _defaultTransform.Rotation;
}
void SwapLookAtMode()
{
var mContainer = (KF3FriendContainer)Owner;
if (transform.parent == mContainer.HumanBones[HumanBodyBones.Head])
{
transform.SetParent(mContainer.Body.transform);
}
else
{
transform.SetParent(mContainer.HumanBones[HumanBodyBones.Head]);
}
}
void LookAtPositionReset()
{
transform.position = transform.parent.position + Vector3.forward;
}
}

View File

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

View File

@ -0,0 +1,38 @@
using UnityEngine;
public class UIHandleFriend : UIHandle
{
protected KF3FriendContainer mContainer => Owner as KF3FriendContainer;
public static UIHandleFriend CreateAsChild(KF3ObjectContainer owner)
{
var handle = CreateAsChild<UIHandleFriend>(owner.transform);
handle.Init(owner).SetColor(Color.yellow).SetScale(1.5f);
return handle;
}
public override UIHandle Init(ObjectContainer owner)
{
base.Init(owner);
Popup.AddButton("Reset All", TransformResetAll);
Popup.AddButton("Reset Position", TransformResetPosition);
Popup.AddButton("Reset Rotation", TransformResetRotation);
Popup.AddButton("Reset Scale", TransformResetScale);
Popup.AddButton("Toggle Physics", () =>
{
mContainer.TogglePhysics();
mContainer.SetKeyframe();
});
Popup.AddButton("Toggle Bones", () => mContainer.ToggleBonesVisible(!mContainer.BonesVisible));
Popup.AddButton("Toggle IK", () => {
mContainer.ToggleIK(!mContainer.IKEnabled);
mContainer.SetKeyframe();
});
Popup.AddButton("Reset Bones", () => mContainer.ResetBones());
Popup.AddButton("Delete", () => Destroy(Owner));
return this;
}
}

View File

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

View File

@ -0,0 +1,30 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
//[System.Serializable]
public class KF3AssetBundle
{
public string DisplayName;
public string FileName;
public string FullPath;
public int IdNum;
public string IdStr;
public KF3AssetBundle(string bundleName)
{
DisplayName = Path.GetFileName(bundleName);
FileName = bundleName;
FullPath = Path.Combine(Settings.AssetsDirectory, bundleName);
}
public KF3AssetBundle(string displayName, string bundleName)
{
DisplayName = displayName;
FileName = bundleName;
FullPath = Path.Combine(Settings.AssetsDirectory, bundleName);
}
}

View File

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

View File

@ -0,0 +1,339 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using UnityEngine;
public class KF3AssetLibrary : AssetLibrary
{
public List<CharaData> CharaData = new List<CharaData>();
public List<KF3AssetBundle> AssetBundles = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Characters = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Animations = new List<KF3AssetBundle>();
public List<KF3AssetBundle> AnimationSets = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Ceruleans = new List<KF3AssetBundle>();
public Dictionary<string, List<KF3AssetBundle>> CeruleansD = new Dictionary<string, List<KF3AssetBundle>>();
public List<KF3AssetBundle> CeruleanAnimationSets = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Effects = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Furniture = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Icons = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Miracles = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Skies = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Stages = new List<KF3AssetBundle>();
public List<KF3AssetBundle> Misc = new List<KF3AssetBundle>();
public static KF3AssetLibrary Instance => GetInstance<KF3AssetLibrary>();
public IEnumerator Init()
{
_mainInstance = this;
string charaData = LoadGzipFile("CHARA_DATA");
if (charaData != "error")
{
Error.Log(Color.green, "Loaded Chara_Data from KF3 cache");
CharaData = JsonHelper.getJsonArray<CharaData>(charaData).ToList();
}
KF3Names.LoadCeruleanNames();
if (GetComponent<KF3ModelViewerMain>().IsOnline)
{
yield return GetAbList();
}
if (AssetBundles.Count <= 0)
{
Error.Log(Color.red, "Failed to load ab_list.txt");
}
yield break;
}
public string LoadGzipFile(string fileName)
{
string openFile = Path.Combine(Settings.CacheDirectory, "CHARA_DATA.d");
if (!File.Exists(openFile)) { Error.Log(Color.blue, "CHARA_DATA cache file not found, character names may be outdated"); return "error"; }
using (Stream decompress = new GZipStream(File.OpenRead(openFile), CompressionMode.Decompress))
using (StreamReader stringWriter = new StreamReader(decompress))
{
return stringWriter.ReadToEnd();
}
}
private IEnumerator GetAbList()
{
//LOAD GAME VERSION
Error.Log(Color.green, $"Game Version is {Settings.GameVersion}");
//LOAD ASSETS URL
Error.Log(Color.green, $"Assets server address is: {Settings.AssetsUrl}");
//LOAD AB_LIST
string filePath = Path.Combine(Settings.AssetListDirectory, "ab_list.txt");
if (File.Exists(filePath))
{
LoadText(File.ReadAllText(filePath));
Error.Log(Color.green, $"Loaded ab file from {filePath}");
}
else if (KF3ModelViewerMain.Instance.IsOnline)
{
WWW www = new WWW(Settings.AssetsUrl + "/Windows/1.0.0/ja/ab_list.txt");
yield return www;
string response = www.text;
if (!string.IsNullOrEmpty(response))
{
LoadText(response);
Error.Log(Color.green, $"ab file downloaded");
File.WriteAllText(filePath, response);
}
else
{
Error.Log(Color.red, $"Failed to load ab file");
}
}
else
{
Error.Log(Color.red, $"Failed to load ab file");
}
//Load loose assets
foreach(var fileName in Directory.GetFiles(Settings.LooseAssetsDirectory))
{
string name = Path.GetFullPath(fileName);
KF3AssetBundle bundle = new KF3AssetBundle(Path.GetFileName(name));
bundle.FullPath = name;
AddToCategory(bundle, bundle.DisplayName);
}
}
public KF3AssetBundle Find(string fileName)
{
return AssetBundles.FirstOrDefault(ab => ab.FileName == fileName);
}
public IEnumerator LoadAsset(KF3AssetBundle bundle, Action<AssetBundle> callback)
{
if(bundle == null)
{
callback?.Invoke(null);
yield break;
}
if (File.Exists(bundle.FullPath))
{
callback?.Invoke(AssetBundle.LoadFromFile(bundle.FullPath));
yield break;
}
else if (KF3ModelViewerMain.Instance.IsOnline)
{
AssetBundle assetBundle = null;
yield return DownloadAssetBundle(bundle, (ab) =>
{
assetBundle = ab;
});
if(assetBundle != null)
{
callback?.Invoke(assetBundle);
yield break;
}
else
{
callback?.Invoke(null);
yield break;
}
}
else
{
Error.Log(Color.yellow, $"{bundle.FileName} Does not exist");
callback?.Invoke(null);
}
}
public IEnumerator DownloadAssetBundle(KF3AssetBundle bundle, System.Action<AssetBundle> callback)
{
string saveTo = bundle.FullPath;
string url = Settings.AssetsUrl + "/Windows/1.0.0/ja/assets/" + bundle.FileName;
Error.Log($"Downloading\n{url}\nto\n{saveTo}", Color.blue);
WWW www = new WWW(url);
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
Error.Log(Color.red, www.error);
www.Dispose();
callback(null);
yield break;
}
byte[] bytes = www.bytes;
Directory.CreateDirectory(Path.GetDirectoryName(saveTo));
File.WriteAllBytes(saveTo, bytes);
www.Dispose();
Error.Log(Color.green, $"Download Successful");
callback(AssetBundle.LoadFromFile(saveTo));
}
/// <summary>
/// Load AssetBundle list
/// </summary>
private void LoadText(string abListTxt)
{
int loaded = 0;
int total = 0;
using (StringReader reader = new StringReader(abListTxt))
{
while (reader.Peek() >= 0)
{
total++;
string line = reader.ReadLine();
if (string.IsNullOrEmpty(line))
{
continue;
}
loaded++;
string[] temp = line.Split(new string[] { " ", "\t" }, StringSplitOptions.RemoveEmptyEntries);
string bundleName = temp[0];
KF3AssetBundle bundle = new KF3AssetBundle(bundleName);
AddToCategory(bundle, bundleName);
}
}
Error.Log(Color.green, $"Loaded {loaded}/{total} AB lines");
}
private void AddToCategory(KF3AssetBundle bundle, string bundleName)
{
//add to global list
AssetBundles.Add(bundle);
//add to characters list
if (bundleName.StartsWith("ch_") && bundleName.EndsWith("_a.prefab"))
{
bundle.IdStr = bundleName.Split('_', '.')[1];
bundle.IdNum = int.Parse(bundle.IdStr);
if (bundle.IdNum < 10000)
{
Characters.Add(bundle);
}
else
{
bundle.DisplayName = KF3Names.GetEnemyName(bundle.IdNum);
Ceruleans.Add(bundle);
if (CeruleansD.ContainsKey(bundle.DisplayName))
{
CeruleansD[bundle.DisplayName].Add(bundle);
}
else
{
CeruleansD.Add(bundle.DisplayName, new List<KF3AssetBundle>() { bundle });
}
}
}
else if (bundleName.StartsWith("icon_"))
{
Icons.Add(bundle);
}
else if (bundleName.StartsWith("captainroom_"))
{
bundle.DisplayName = bundle.DisplayName.Replace("captainroom_obj_", "").Replace("_mdl.prefab", "");
Furniture.Add(bundle);
}
else if (bundleName.StartsWith("ch_") && bundleName.EndsWith("_mot.prefab"))
{
bundle.IdStr = bundleName.Split('_', '.')[1];
bundle.IdNum = int.Parse(bundle.IdStr);
Animations.Add(bundle);
if (bundleName.EndsWith("a_mot.prefab"))
{
if (bundle.IdNum < 10000)
{
bundle.DisplayName = bundle.IdStr + "_" + KF3Names.GetCharaName(bundle.IdNum);
AnimationSets.Add(bundle);
}
else
{
bundle.DisplayName = KF3Names.GetEnemyName(bundle.IdNum);
CeruleanAnimationSets.Add(bundle);
}
}
}
else if (bundleName.StartsWith("st_"))
{
Stages.Add(bundle);
}
else if (bundleName.StartsWith("sky_"))
{
Skies.Add(bundle);
}
else if (bundleName.StartsWith("ef_auth"))
{
bundle.DisplayName = bundleName.Replace("ef_auth", "");
Miracles.Add(bundle);
}
else if (bundleName.StartsWith("ef_"))
{
Effects.Add(bundle);
Misc.Add(bundle);
}
}
/// <summary>
/// Get a list of costumes from selected character id
/// </summary>
public List<KF3AssetBundle> GetCostumesFromId(int id)
{
if (id > 9999)
{
id = id / 10;
return AssetBundles.Where(k => k.FileName.StartsWith($"ch_{id.ToString().PadLeft(4, '0')}") && !k.FileName.Contains("mot") && k.FileName.Split(new char[] { '.', '_' }).Length == 4)
.ToList().ConvertAll(o=>(KF3AssetBundle)o);
}
else
{
return AssetBundles.Where(k => k.FileName.StartsWith($"ch_{id.ToString().PadLeft(4, '0')}") && !k.FileName.Contains("mot") && k.FileName.Split(new char[] { '.', '_' }).Length == 4)
.ToList().ConvertAll(o => (KF3AssetBundle)o);
}
}
public KF3AssetBundle GetAnimationSet(string name)
{
if(int.TryParse(name.Split('_','.')[1], out int id)){
return GetAnimationSet(id);
}
return (KF3AssetBundle)AnimationSets.FirstOrDefault(a => a.DisplayName == name || a.FileName == name);
}
public KF3AssetBundle GetAnimationSet(int id)
{
return (KF3AssetBundle)AnimationSets.FirstOrDefault(a => int.Parse(a.FileName.Split('_', '.')[1]) == id);
}
public List<KF3AssetBundle> GetMisc()
{
return Misc.ConvertAll(k=>(KF3AssetBundle)k);
}
public List<KF3AssetBundle> GetMiracles()
{
return Miracles.ConvertAll(k => (KF3AssetBundle)k);
}
public List<KF3AssetBundle> GetCeruleans(string name)
{
return CeruleansD[name];
}
public KF3AssetBundle GetFurnitureBundle(string bundleName)
{
return (KF3AssetBundle)Furniture.FirstOrDefault(a => a.DisplayName == bundleName || a.FileName == bundleName);
}
public KF3AssetBundle GetMiscBundle(string bundleName)
{
return (KF3AssetBundle)Misc.FirstOrDefault(a => a.DisplayName == bundleName || a.FileName == bundleName);
}
public KF3AssetBundle GetMiracleBundle(string bundleName)
{
return (KF3AssetBundle)Miracles.FirstOrDefault(a => a.DisplayName == bundleName || a.FileName == bundleName);
}
}

View File

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

View File

@ -0,0 +1,197 @@
using RuntimeGizmos;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class KF3ModelBuilder : ModelBuilder
{
public static KF3ModelBuilder Instance => GetInstance<KF3ModelBuilder>();
private KF3ModelViewerMain Main => KF3ModelViewerMain.Instance;
public IEnumerator Init(Action<KF3ModelBuilder> callback)
{
callback(this);
yield break;
}
public IEnumerator BuildCharacter(string modelName, string animSetName, Action<GameObject> callback = null)
{
yield return KF3FriendContainer.CreateAsync(modelName, animSetName, false, (container)=>
{
Main.SelectObject(container);
callback?.Invoke(container.gameObject);
});
}
public IEnumerator BuildCerulean(string modelName, string animSetName, Action<GameObject> callback = null)
{
yield return KF3CeruleanContainer.CreateAsync(modelName, animSetName, (container) =>
{
Main.SelectObject(container);
callback?.Invoke(container.gameObject);
});
}
public override IEnumerator SpawnSerializedCoroutine(ObjectContainerSerializable oc, Action<ObjectContainer> callback = null)
{
return SpawnSerialized(oc as KF3ObjectContainerSerializable, callback);
}
public IEnumerator SpawnSerialized(KF3ObjectContainerSerializable oc, Action<ObjectContainer> callback = null)
{
switch (oc)
{
case KF3CharacterContainerSerializable cs:
if (cs.IsCerulean)
{
var celName = Main.Assets.Ceruleans.FirstOrDefault(c => c.FileName == cs.CostumeName);
yield return BuildCerulean(celName.FileName, celName.FileName, (go) =>
{
var cont = go.GetComponent<KF3CeruleanContainer>();
cont.PasteContainer(cs, new PoseLoadOptions(true));
cont.DeserializeFrames(cs);
TimelineController.SetCurrentFrame(cont);
callback?.Invoke(cont);
});
}
else
{
yield return BuildCharacter(cs.CostumeName, cs.AnimationName, (go) =>
{
var cont = go.GetComponent<KF3FriendContainer>();
cont.PasteContainer(cs, new PoseLoadOptions(true));
cont.DeserializeFrames(cs);
TimelineController.SetCurrentFrame(cont);
callback?.Invoke(cont);
});
}
break;
case KF3ObjectContainerSerializable cs:
yield return SpawnFurniture(cs.Filename);
break;
}
}
public IEnumerator UpdateCharacter(KF3CharacterContainer container, string modelName, string animSetName, Action<ObjectContainer> callback = null)
{
if (container.LoadInProgress) yield break;
string mIdLong = modelName.Split('_', '.')[1];
string aIdLong = animSetName.Split('_', '.')[1];
container.ModelId = int.Parse(mIdLong);
container.CostumeName = modelName;
container.AnimationName = animSetName;
var data = container.Serialize() as KF3CharacterContainerSerializable;
Destroy(container);
yield return SpawnSerialized(data, callback);
}
public void SpawnReference(Texture2D texture, System.Action<GameObject> callback = null)
{
//GameObject go = new GameObject(texture.name);
//go.AddComponent<UIHandleReference>().Init(go);
//GameObject go1 = GameObject.CreatePrimitive(PrimitiveType.Plane);
//go1.transform.SetParent(go.transform);
//go1.Get<Renderer>().material.shader = Shader.Find("Unlit/Transparent Cutout");
//go1.Get<Renderer>().material.mainTexture = texture;
//go1.transform.localScale = new Vector3((float)texture.width / 5000, 1, (float)texture.height / 5000);
//callback?.Invoke(go);
}
public IEnumerator SpawnAsset(string text, System.Action<GameObject> callback)
{
KF3AssetBundle assetBundle = Main.Assets.Find(text);
yield return Main.Assets.LoadAsset(assetBundle, (ab) =>
{
var background = Instantiate(ab.LoadAsset(ab.GetAllAssetNames()[0])) as GameObject;
ab.Unload(false);
callback?.Invoke(background);
});
}
public IEnumerator SpawnFurniture(string bundleName, System.Action<GameObject> callback = null)
{
KF3AssetBundle assetBundle = Main.Assets.GetFurnitureBundle(bundleName);
if(assetBundle != null)
{
yield return Main.Assets.LoadAsset(assetBundle, (ab) =>
{
KF3StaticContainer containter = KF3StaticContainer.Create(ab);
callback?.Invoke(containter.gameObject);
});
}
else
{
assetBundle = Main.Assets.GetMiscBundle(bundleName);
if (assetBundle == null) assetBundle = assetBundle = Main.Assets.GetMiracleBundle(bundleName);
if (assetBundle != null)
{
yield return Spawn(assetBundle);
}
}
}
public IEnumerator Spawn(KF3AssetBundle assetBundle, System.Action<GameObject> callback = null)
{
yield return Main.Assets.LoadAsset(assetBundle, (ab) =>
{
GameObject go = Instantiate(ab.LoadAsset(ab.GetAllAssetNames()[0]) as GameObject);
go.layer = 0;
KF3StaticContainer containter = go.AddComponent<KF3StaticContainer>();
//containter.oName = assetBundle.DisplayName;
UIHandleProp.CreateAsChild(containter, go.transform);
//containter.PauseAll();
//containter.BuildHierarchy();
ab.Unload(false);
callback?.Invoke(go);
});
}
/// <summary> Clean Up, delete all model remains </summary>
public void DeleteAnimation(KF3CharacterContainer container)
{
List<GameObject> destroyQueue = new List<GameObject>()
{
container.BodyAnimation.gameObject
};
List<object> nullable = new List<object>()
{
container.BodySimpleAnimation
};
if(container as KF3FriendContainer != null)
{
var container1 = (KF3FriendContainer)container;
destroyQueue.Add(container1.EarsAnimation.gameObject);
destroyQueue.Add(container1.TailAnimation.gameObject);
nullable.Add(container1.EarsSimpleAnimation);
nullable.Add(container1.TailSimpleAnimation);
}
for (int i = destroyQueue.Count - 1; i >= 0; i--)
{
Destroy(destroyQueue[i]);
}
for (int i = nullable.Count - 1; i >= 0; i--)
{
nullable[i] = null;
}
Resources.UnloadUnusedAssets();
System.GC.Collect();
}
}

View File

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

View File

@ -0,0 +1,138 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using static UnityEngine.EventSystems.EventTrigger;
using static UnityEngine.GraphicsBuffer;
public class KF3ModelViewerInterface : ModelViewerInterface
{
public bool HandlesVisible = true;
public static KF3ModelViewerInterface Instance => GetInstance<KF3ModelViewerInterface>();
[Header("Current")]
public Transform Timeline;
public UIPopupMessage PopupMessagePrefab;
public Transform HandlesPanel;
public KF3.UI.Panels.SpawnPanel SpawnPanel;
[Header("Obsolete")]
public ScrollRect SelectionToggle;
public GameObject LightPanel;
public InputField WidthInput, HeightInput;
private GUIStyle _style = new GUIStyle();
private KF3ModelViewerMain Main => KF3ModelViewerMain.Instance;
private IEnumerator Start()
{
_mainInstance = this;
while(KF3ModelViewerMain.Instance == null || KF3AssetLibrary.Instance == null)
{
yield return 0;
}
_style.normal.textColor = Color.white;
FindControls();
StartCoroutine(SpawnPanel.LoadAll(Main));
TooltipLabels[0].transform.parent.gameObject.SetActive(Settings.Instance.showHints);
}
private void OnGUI()
{
if (ModelViewerMain.GetInstance() == null) return;
if (Settings.Instance.showHints)
{
int fontSize = Mathf.Clamp((int)(15.0f * ((float)Screen.height / (float)1080)), 10, int.MaxValue);
_style.fontSize = fontSize;
int n = 2;
float height = Mathf.Clamp((int)(18.0f * ((float)Screen.height / (float)1080)), 12, int.MaxValue);
GUI.Label(new Rect(10, n++ * height, 100, height), "E - open spawn menu", _style);
switch (Main.GetCameraHandler().Settings.CameraMode)
{
case 0:
case 1:
GUI.Label(new Rect(10, n++ * height, 100, height), "WASD - move camera (alt)", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "LMB + mouse move - move camera", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "RMB + mouse move - move sun", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "MMB + mouse up/down - camera target height", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "LMB + mouse scroll - camera distance", _style);
break;
case 2:
GUI.Label(new Rect(10, n++ * height, 100, height), "LMB + WASD - move camera", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "RMB + WASD - pan camera", _style);
break;
}
if (Main.SelectedObject)
{
GUI.Label(new Rect(10, n++ * height, 100, height), "Arrow Keys - change animation speed", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "Spacebar - pause/play animation", _style);
GUI.Label(new Rect(10, n++ * height, 100, height), "Ctrl + LMB - move invisibly", _style);
}
GUI.Label(new Rect(10, n++ * height, 100, height), "H - hide this", _style);
}
if (Main.GetCameraHandler() == Main.WorkCameraOrbit)
{
var centeredStyle = GUI.skin.GetStyle("Label");
centeredStyle.alignment = TextAnchor.UpperCenter;
GUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 25, 100, 50), "USING WORK CAMERA", centeredStyle);
}
}
private void FixedUpdate()
{
if (KF3ModelViewerMain.Instance == null) return;
if (Main.SelectedObject != null && Main.SelectedObject.GetDataType() == DataType.Character)
{
var simpleAnim = Main.GetSelectedObject<KF3ObjectContainer>().AsCharacter.BodySimpleAnimation;
if (simpleAnim != null && simpleAnim.clip != null)
{
SimpleAnimation.State currentClip = simpleAnim.GetStates().FirstOrDefault(state => state.clip == simpleAnim.clip);
//TimeScaleText.text = Strings.TimeScaleString + currentClip.speed.ToString("F2");
}
}
}
private void FindControls()
{
WidthInput.text = Screen.width.ToString();
HeightInput.text = Screen.height.ToString();
}
public void OnSceneDelete()
{
Main.EmptyScene<KF3SceneContainer>();
}
public void SelectionAdd(Transform entry)
{
var go = Instantiate(Main.Resources.SelectionEntry, SelectionToggle.content.transform);
go.SetTarget(entry);
}
public void SelectionRemove(Transform target)
{
var entry = SelectionToggle.content.transform.GetComponentsInChildren<UISelectionEntry>().FirstOrDefault(c => c.Target == target);
if(entry != null)
{
Destroy(entry);
}
}
public void SelectionClear()
{
if (SelectionToggle.content == null) return;
for (int i = SelectionToggle.content.transform.childCount - 1; i >= 0; i--)
{
DestroyImmediate(SelectionToggle.content.transform.GetChild(i).gameObject);
}
}
}

View File

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

View File

@ -0,0 +1,139 @@
using KF3;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class KF3ModelViewerMain : ModelViewerMain
{
public float SpecialDistance = 1;
public bool IsOnline = true;
public static KF3ModelViewerMain Instance => GetInstance<KF3ModelViewerMain>();
public KF3ModelViewerInterface UI => ModelViewerInterface.GetInstance<KF3ModelViewerInterface>();
public KF3AssetLibrary Assets => AssetLibrary.GetInstance<KF3AssetLibrary>();
public KF3ModelBuilder Builder => ModelBuilder.GetInstance<KF3ModelBuilder>();
public AdditionalResources Resources => SharedResources.Instance as AdditionalResources;
public AnimationClip OverrideClip;
protected override void Awake()
{
Debug.LogError("Fix this");
Settings.Load();
_backupTimers = _backupTimes.ToArray();
}
private IEnumerator Start()
{
Application.targetFrameRate = 30;
Error.Log(Color.green, "Viewer version: " + Application.version);
float warningTimer = 0;
yield return GetComponent<KF3AssetLibrary>().Init();
while (KF3ModelBuilder.Instance == null || KF3ModelViewerInterface.Instance == null || SharedResources.Instance == null)
{
warningTimer += Time.deltaTime;
if (warningTimer > 2)
{
warningTimer = 0;
string report = $"AssetLibrary: {KF3AssetLibrary.Instance != null}\nModelBuilder: {KF3ModelBuilder.Instance != null}\nInterface: {KF3ModelViewerInterface.Instance != null}\nResources: {SharedResources.Instance != null}";
Error.Log(report, Color.red);
}
yield return 0;
}
_mainInstance = this;
CurrentScene = SceneContainer.Create<KF3SceneContainer>(this);
KF3ModelViewerInterface.SetDropdownData(GetCurrentScene<KF3SceneContainer>().Settings.StageDropdown, KF3ModelViewerMain.Instance.Assets.Stages.Select(s => s.DisplayName).ToList(), true);
KF3ModelViewerInterface.SetDropdownData(GetCurrentScene<KF3SceneContainer>().Settings.BackgroundDropdown, KF3ModelViewerMain.Instance.Assets.Skies.Select(s => s.DisplayName).ToList(), true);
}
private void Update()
{
AutoSaveUpdate();
}
public override void SelectionClear()
{
base.SelectionClear();
KF3ModelViewerInterface.Instance.SelectionClear();
}
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 override IEnumerator LoadScene(SceneSerializable bc)
{
Debug.Log("Emptying scene");
EmptyScene<KF3SceneContainer>();
foreach (var c in bc.Objects)
{
Debug.Log($"Loading {c.Filename} {c.GUID} {c.Frames.Count}");
if (c.GUID == "cameraOrbit")
{
MainCameraOrbit.DeserializeFrames(c);
}
else
{
yield return Builder.SpawnSerializedCoroutine(c);
}
}
bc.Timeline.Deserialize(TimelineController.Instance);
(CurrentScene as KF3SceneContainer).Frames = (bc as KF3SceneSerializable).Frames.Select(f => new FrameContent(f)).ToList();
yield return 0;
TimelineController.SetCurrentFrame(TimelineController.Instance.CurrentFrame);
}
public static void FocusOn(Camera camera, GameObject focusedObject, float cameraDistance)
{
Bounds bounds = GetBoundsWithChildren(focusedObject);
Vector3 objectSizes = bounds.max - bounds.min;
float objectSize = Mathf.Max(objectSizes.x, objectSizes.y, objectSizes.z);
float cameraView = 2.0f * Mathf.Tan(0.5f * Mathf.Deg2Rad * Camera.main.fieldOfView); // Visible height 1 meter in front
float distance = cameraDistance * objectSize / cameraView; // Combined wanted distance from the object
distance += 0.5f * objectSize; // Estimated offset from the center to the outside of the object
Camera.main.transform.position = bounds.center - distance * Camera.main.transform.forward;
}
public static Bounds GetBoundsWithChildren(GameObject gameObject)
{
Renderer parentRenderer = gameObject.GetComponent<Renderer>();
Renderer[] childrenRenderers = gameObject.GetComponentsInChildren<Renderer>();
Bounds bounds = parentRenderer != null
? parentRenderer.bounds
: childrenRenderers.FirstOrDefault(x => x.enabled).bounds;
if (childrenRenderers.Length > 0)
{
foreach (Renderer renderer in childrenRenderers)
{
if (renderer.enabled)
{
bounds.Encapsulate(renderer.bounds);
}
}
}
return bounds;
}
}

View File

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

View File

@ -0,0 +1,732 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
public static class KF3Names
{
public static string GetCharaName(int id)
{
var charaData = KF3AssetLibrary.Instance.CharaData.FirstOrDefault(c => c.id == id);
if(charaData != null)
{
return $"{(String.IsNullOrEmpty(charaData.nameEn) ? charaData.name : charaData.nameEn)} {(String.IsNullOrEmpty(charaData.nickname) ? "" : charaData.nickname)}";
}
switch (id)
{
case 1:
return "Dhole";
case 2:
return "Serval";
case 3:
return "Fennec";
case 4:
return "Common Raccoon";
case 5:
return "Tasmanian Devil";
case 6:
return "Small-clawed Otter";
case 7:
return "Jaguar";
case 8:
return "Alpaca Suri";
case 9:
return "Lion";
case 10:
return "Moose";
case 11:
return "Northern White-faced Owl";
case 12:
return "Eurasian Eagle Owl";
case 13:
return "Ezo Red Fox";
case 14:
return "Silver Fox";
case 15:
return "Golden Snub-nosed Monkey";
case 16:
return "Brown Bear";
case 17:
return "Sheep";
case 18:
return "Blackbuck";
case 19:
return "Californian Sea Otter";
case 20:
return "Australian Devil";
case 21:
return "Peach Panther";
case 22:
return "Meerkat";
case 23:
return "Chinese Spot-Billed Duck";
case 24:
return "Royal Penguin";
case 25:
return "Emperor Penguin";
case 26:
return "Humboldt Penguin";
case 27:
return "Rockhopper Penguin";
case 28:
return "Gentoo Penguin";
case 29:
return "Plains Zebra";
case 30:
return "Thomson's Gazelle";
case 31:
return "Hippopotamus";
case 33:
return "Malayan Tapir";
case 34:
return "Fossa";
case 35:
return "Indian Elephant";
case 37:
return "King Cobra";
case 38:
return "Southern Tamandua";
case 39:
return "Peafowl";
case 41:
return "Okapi";
case 42:
return "Japanese Crested Ibis";
case 43:
return "Scarlet Ibis";
case 44:
return "Sand Cat";
case 45:
return "Tsuchinoko";
case 46:
return "American Beaver";
case 47:
return "Black-tailed Prairie Dog";
case 48:
return "Aurochs";
case 49:
return "Arabian oryx";
case 51:
return "White Rhinoceros";
case 52:
return "Panther Chameleon";
case 53:
return "Shoebill";
case 54:
return "Giant Armadillo";
case 56:
return "Margay";
case 57:
return "Capybara";
case 58:
return "Campo Flicker";
case 59:
return "Gray Wolf";
case 60:
return "Reticulated Giraffe";
case 61:
return "African Wild Dog";
case 62:
return "Common Dolphin";
case 63:
return "Mammoth";
case 64:
return "White Tiger";
case 65:
return "Saber-Toothed Tiger";
case 66:
return "Greater Flamingo";
case 67:
return "Raccoon Dog";
case 68:
return "Black Leopard";
case 69:
return "Cheetah";
case 70:
return "Blue Whale";
case 71:
return "Giant Penguin";
case 72:
return "Holstein Friesian Cattle";
case 73:
return "Tibetan Fox";
case 74:
return "Atlantic Puffin";
case 75:
return "Silky Anteater";
case 76:
return "Great Auk";
case 77:
return "Manul";
case 78:
return "Giant Anteater";
case 79:
return "Aye-aye";
case 83:
return "Dromedary";
case 84:
return "Bactrian Camel";
case 85:
return "Western Lowland Gorilla";
case 87:
return "Common Ostrich";
case 88:
return "Reindeer";
case 89:
return "Black rhinoceros";
case 91:
return "Arctic Hare";
case 92:
return "Alpine Marmot";
case 93:
return "Chinese White Dolphin";
case 94:
return "Californian Sea Lion";
case 95:
return "Komodo Dragon";
case 97:
return "Common Slider";
case 98:
return "Genbu";
case 99:
return "Seiryu";
case 100:
return "Byakko";
case 101:
return "Suzaku";
case 102:
return "Shisa Lefty";
case 103:
return "Shisa Right";
case 104:
return "Oinarisama";
case 105:
return "Kyubikitsune";
case 106:
return "Bearded Seal";
case 108:
return "African Elephant";
case 109:
return "African Rock Python";
case 110:
return "Greater Rhea";
case 112:
return "Cat";
case 113:
return "Unicorn Whale";
case 114:
return "Inugamigyoubu";
case 118:
return "Giant Pangolin";
case 119:
return "Northern Goshawk";
case 120:
return "Greater Roadrunner";
case 125:
return "Bergman's Bear";
case 127:
return "Caracal";
case 133:
return "Golden Tabby Tiger";
case 134:
return "Kodiak Bear";
case 136:
return "Sivatherium";
case 138:
return "Giant Panda";
case 140:
return "Jinmengyo";
case 141:
return "Sky Fish";
case 148:
return "Japanese Wolf";
case 149:
return "Japanese Otter";
case 151:
return "Barbary Lion";
case 153:
return "Bald Eagle";
case 154:
return "Jungle Crow";
case 155:
return "Okinawa Habu";
case 156:
return "Bottlenose Dolphin";
case 158:
return "Leopard";
case 161:
return "Black Jaguar";
case 165:
return "Maltese Tiger";
case 166:
return "Mexico Salamander";
case 168:
return "Yatagarasu";
case 170:
return "Okinawa Rail";
case 174:
return "Lesser Panda";
case 176:
return "Chapman's Zebra";
case 178:
return "Chicken";
case 179:
return "Alpaca Huacaya";
case 180:
return "White Lion";
case 182:
return "Geoffroy's Cat";
case 188:
return "Red Fox";
case 191:
return "Bat-Eared Fox";
case 193:
return "Aardwolf";
case 195:
return "Dog";
case 196:
return "Ezo Brown Bear";
case 197:
return "Gambian Rat";
case 199:
return "King Penguin";
case 200:
return "Adélie Penguin";
case 203:
return "Blue Wildebeest";
case 204:
return "Black Wildebeest";
case 207:
return "Mountain Tapir";
case 217:
return "African Penguin";
case 221:
return "Salt-water Crocodile";
case 222:
return "Shiserval Right";
case 223:
return "Shiserval Lefty";
case 233:
return "Chestnut Thoroughbred Horse";
case 234:
return "Brown Thoroughbred Horse";
case 235:
return "White Thoroughbred Horse";
case 236:
return "Vampire Bat";
case 237:
return "Long-tailed Whiskered Bat";
case 239:
return "Black-Headed Ibis";
case 241:
return "Serval";
case 242:
return "Superb Bird-of-Paradise";
case 243:
return "Western Parotia";
case 244:
return "Degu";
case 245:
return "Long-tailed Chinchilla";
case 253:
return "Harp Seal";
case 258:
return "Striated Caracara";
case 263:
return "Greater Honeyguide";
case 264:
return "Scarlet Macaw";
case 265:
return "Resplendent Quetzal";
case 267:
return "Siberian Husky";
case 273:
return "Passenger Pigeon";
case 276:
return "Secretarybird";
case 282:
return "Greater Bird-of-Paradise";
case 284:
return "Indian Wolf";
case 290:
return "Emerald Tree Boa";
case 291:
return "Garden Tree Boa";
case 301:
return "Orca";
case 302:
return "Dog";
case 307:
return "Amur Tiger";
case 314:
return "Pronghorn";
case 316:
return "Jack-o'-Lantern";
case 318:
return "Cerberus";
case 321:
return "Cellval";
case 322:
return "Serval";
case 323:
return "Pig";
case 327:
return "White Serval";
case 333:
return "Tasmanian Devil";
case 334:
return "Blackbuck";
case 335:
return "Californian Sea Otter";
case 336:
return "Australian Devil";
case 337:
return "Common Dolphin";
case 338:
return "Blue Whale";
case 339:
return "Californian Sea Lion";
case 340:
return "Common Raccoon";
case 341:
return "Fennec";
case 342:
return "Fennec";
case 343:
return "キンシコウ";
case 344:
return "アイアイ";
case 345:
return "オオセンザンコウ";
case 346:
return "オオタカ";
case 347:
return "ホワイトライオン";
case 349:
return "Royal Penguin【PPPのプリンセス】";
case 350:
return "Southern Tamandua【一撃のポーズぅ】";
case 351:
return "Tasmanian Devil";
case 352:
return "Lion";
case 353:
return "Blackbuck";
case 354:
return "Australian Devil";
case 355:
return "Malayan Tapir【やってみる…】";
case 356:
return "Common Ostrich【占いのその先へ】";
case 357:
return "Chapman's Zebra【オシャレリーダー】";
case 358:
return "Common Raccoon【時代が来たのだ】";
case 359:
return "Japanese Crested Ibis【疑惑の美声】";
case 360:
return "Fennec【私の時代も来たかなー】";
case 363:
return "Sand Cat【いいこと思いつきました】";
case 364:
return "Dhole【頼れる副隊長】";
case 365:
return "Small-clawed Otter【笑顔をお届け】";
case 366:
return "Tsuchinoko【頼られちゃ仕方ない】";
case 367:
return "Ezo Red Fox【ぷろげーまー】";
case 368:
return "Silver Fox【天才発明家・】";
case 369:
return "Yak";
case 380:
return "Hello Kitty♥serval";
case 381:
return "Hello Mimmy♥serval";
case 382:
return "Jaguar【連撃の極意】";
case 383:
return "Black Jaguar【一撃の極意】";
case 384:
return "Common Dolphin【わっふいわっふーい】";
case 385:
return "Meerkat【正義の家庭教師】";
case 386:
return "Caracal";
case 387:
return "Cellval";
case 388:
return "Phoenix";
case 389:
return "Unico";
case 390:
return "Bald Eagle【みんなでジャスティス】";
case 391:
return "Northern Goshawk【みんなでクールに】";
case 396:
return "Witch";
case 397:
return "Draco Centaur";
case 399:
return "Tachikoma Standard";
case 400:
return "Tachikoma Heavy-armed";
case 401:
return "Paraceratherium";
case 901:
return "";
case 902:
return "";
case 995:
return "Tachikoma Standard";
case 996:
return "Tachikoma Heavy-armed";
case 997:
return "White Serval";
case 998:
return "Dhole (Cutscene)";
case 1001:
return "Mirai";
case 1002:
return "Calenda";
case 1003:
return "Flicky";
case 1004:
return "Boss";
case 1005:
return "Boss (Radio)";
case 1006:
return "Kako";
case 1007:
return "Nana";
case 1008:
return "Calenda (Cutscene)";
case 1009:
return "Flicky (Damaged)";
case 1010:
return "Eyes";
case 1011:
return "RulerCell Chrysalis";
case 1012:
return "RulerCell";
case 1013:
return "Hello Kitty";
}
return id.ToString();
}
public static Dictionary<Func<int, bool>, string> CeruleanNames = new Dictionary<Func<int, bool>, string>();
public static void LoadCeruleanNames()
{
string filePath = Path.Combine(Application.dataPath + "/../", "Celliens.txt");
if (File.Exists(filePath))
{
var lines = File.ReadAllLines(filePath);
foreach(var line in lines)
{
var split = line.Split(';');
if (split.Length != 2) continue;
int id = -1;
if (!int.TryParse(split[0], out id)) continue;
CeruleanNames.Add(x => x < id, split[1].Trim());
}
Error.Log(Color.green, $"Loaded {CeruleanNames.Count} Cellien Names");
}
else
{
Error.Log(Color.yellow, $"Celliens.txt not found, loading default list");
CeruleanNames = new Dictionary<Func<int, bool>, string>
{
{ x => x < 20010, "civile" },
{ x => x < 20020, "fangcell" },
{ x => x < 20030, "Zoospores" },
{ x => x < 20040, "Mikazuki" },
{ x => x < 20050, "volvox" },
{ x => x < 20056, "Tirucel" },
{ x => x < 20057, "Tiruchel (Majimun)" },
{ x => x < 20060, "Tiruchel" },
{ x => x < 20070, "Hunter Cell" },
{ x => x < 20080, "denwa" },
{ x => x < 20090, "bolt" },
{ x => x < 20100, "met" },
{ x => x < 20110, "Hwarin" },
{ x => x < 20120, "Koonin" },
{ x => x < 20130, "Octopus" },
{ x => x < 20140, "loco loco" },
{ x => x < 20150, "Horus Cell" },
{ x => x < 20162, "boat" },
{ x => x < 20171, "Santamet" },
{ x => x < 20180, "New Year's bolt" },
{ x => x < 20192, "kepeshsel" },
{ x => x < 20202, "Fang Cell (Christmas)" },
{ x => x < 20210, "Mikazuki (Christmas)" },
{ x => x < 20220, "Yavacell" },
{ x => x < 20230, "phage cell" },
{ x => x < 20240, "white fangcell" },
{ x => x < 20250, "White Mikazuki" },
{ x => x < 20260, "White Volvox" },
{ x => x < 20263, "Octopus (Majimun)" },
{ x => x < 20265, "Octopus (Mazimun)" },
{ x => x < 20270, "Octopus (Octopus)" },
{ x => x < 20310, "Tiruchel (Mazimun)" },
{ x => x < 20330, "Santamet" },
{ x => x < 20340, "Boombox" },
{ x => x < 20350, "loco loco (magimun)" },
{ x => x < 20360, "video camera" },
{ x => x < 20380, "door" },
{ x => x < 20420, "hosiery" },
{ x => x < 20430, "paramecium" },
{ x => x < 20441, "dioid fang cell" },
{ x => x < 20450, "Tachyrians" },
{ x => x < 20460, "Bolt" },
{ x => x < 20470, "Met" },
{ x => x < 20480, "Koonin" },
{ x => x < 20490, "mimicel" },
{ x => x < 20510, "horn cell" },
{ x => x < 21001, "sma" },
{ x => x < 21002, "akagau" },
{ x => x < 21003, "greengau" },
{ x => x < 21004, "bluegau" },
{ x => x < 21005, "akagau" },
{ x => x < 21006, "greengau" },
{ x => x < 21007, "blue-gau" },
{ x => x < 21008, "akagau" },
{ x => x < 21010, "aogau" },
{ x => x < 21030, "gotsun" },
{ x => x < 21036, "eyeball outlet (temporary)" },
{ x => x < 21040, "eyeball outlet" },
{ x => x < 21050, "Ikarin" },
{ x => x < 21059, "raincoat" },
{ x => x < 21060, "raincoat (majimun)" },
{ x => x < 21065, "builder shovel" },
{ x => x < 21067, "Builder's shovel (for checking site destruction)" },
{ x => x < 21068, "Builder Shovel (Mazimun)" },
{ x => x < 21080, "builder's shovel" },
{ x => x < 21090, "Senetocell" },
{ x => x < 21100, "black gau" },
{ x => x < 21112, "Black Gotsun" },
{ x => x < 21121, "Christmas Karin" },
{ x => x < 21130, "Kagamimochi gotsun" },
{ x => x < 21153, "Aogau (Majimun)" },
{ x => x < 21154, "akagau (majimun)" },
{ x => x < 21155, "green gau" },
{ x => x < 21160, "aogau (majimun)" },
{ x => x < 21170, "Gottsun (Mazimun)" },
{ x => x < 21180, "Raincoat (Mazimun)" },
{ x => x < 21190, "Eyeball outlet (Mazimun)" },
{ x => x < 21201, "Builder shovel (Mazimun)" },
{ x => x < 21210, "Ikarin (Mazimun)" },
{ x => x < 21220, "Sachiko (Mazimun)" },
{ x => x < 21224, "Sachiko" },
{ x => x < 21232, "Black Sachiko" },
{ x => x < 21240, "Sachiko" },
{ x => x < 21270, "Alex" },
{ x => x < 21273, "black senet cell" },
{ x => x < 21280, "black builder shovel" },
{ x => x < 21281, "Flicky" },
{ x => x < 21282, "Flicky right foot" },
{ x => x < 21290, "Flicky left foot" },
{ x => x < 21291, "Akagau first generation" },
{ x => x < 21293, "Aogau first generation" },
{ x => x < 21295, "Akagau 1st generation" },
{ x => x < 21310, "Aogau 1st generation" },
{ x => x < 21330, "Akagau 4th generation" },
{ x => x < 21340, "Seiryu the Holy Beast" },
{ x => x < 21350, "Holy Beast Byakko" },
{ x => x < 21360, "Holy Beast Suzaku" },
{ x => x < 21380, "holy beast gembu" },
{ x => x < 21390, "Akagau second generation" },
{ x => x < 21400, "Senetocer" },
{ x => x < 21410, "eyeball outlet (temporary)" },
{ x => x < 21420, "birdcell" },
{ x => x < 21430, "Test boss" },
{ x => x < 21470, "bird cell" },
{ x => x < 21480, "Triceragaon" },
{ x => x < 21486, "Midorigau (Majimun)" },
{ x => x < 21493, "Gotsun (Mazimun)" },
{ x => x < 21501, "Raincoat (Mazimun)" },
{ x => x < 21509, "Eyeball outlet (Mazimun)" },
{ x => x < 21523, "Builder shovel (Mazimun)" },
{ x => x < 21530, "Senet cell" },
{ x => x < 21550, "Sachiko (Mazimun)" },
{ x => x < 21560, "Dio cerulean terminus" },
{ x => x < 21570, "Chibi Dio Cerulean" },
{ x => x < 21610, "Midori gau (magimun)" },
{ x => x < 21620, "Black Senetocer" },
{ x => x < 40000, "Unknown" },
{x => x <40010, "Gacha Capsule/Card"},
{x => x <40200, "Gacha Box"},
{x => x <40300, "Blue Gacha Capsule"},
{x => x <40400, "Furniture Gacha"},
{ x => x != -1 , "Unknown" }
};
}
}
public static string GetEnemyName(int id)
{
var cases = CeruleanNames;
return cases.First(kvp => kvp.Key(id)).Value;
}
public static string GetDressName(string id)
{
switch (id)
{
case "a": return "Default";
case "aa": return "Default (V2)";
case "b": return "Special";
case "c": return "Tracksuit";
case "d": return "Park Ranger";
case "e": return "Maid";
case "f": return "Event Costume 1";
case "g": return "Various";
case "h": return "Party Dress";
case "i": return "School Uniform";
case "j": return "Sports Outfit";
case "k": return "Raincoat";
case "l": return "Dojo (Y)";
case "m": return "Dojo (G)";
case "n": return "Dojo (B)";
case "o": return "Dojo (R)";
case "p": return "Orihime";
case "q": return "Swimsuit 1";
case "r": return "Swimsuit 2";
case "s": return "XXX Swimsuit";
case "t": return "Lifeguard";
case "u": return "Harvest";
case "v": return "Halloween";
case "w": return "Maid 2";
}
return id;
}
}
public class JsonHelper
{
public static T[] getJsonArray<T>(string json)
{
string newJson = "{ \"array\": " + json + "}";
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
return wrapper.array;
}
[Serializable]
private class Wrapper<T>
{
public T[] array;
}
}
[System.Serializable]
public class CharaData
{
public int id;
public string name;
public string nameEn;
public string nickname;
}

View File

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

Some files were not shown because too many files have changed in this diff Show More