You've already forked UniversalViewer
							
							DanMachi:
-compatibility improvements Core: -simplified object and keyframe serialization -complicated assetbundle loading
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,64 +1,77 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| 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 +80,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 +94,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 +129,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 +217,7 @@ public class DanMachiCharacterContainer : DanMachiObjectContainer, IAnimated | ||||
|         } | ||||
|  | ||||
|         _humanBones = humanBones; | ||||
|         Bones = allBones.Values.ToList(); | ||||
|     } | ||||
|  | ||||
|     public T TryGet<T>(Dictionary<string, T> dict, string key) | ||||
| @@ -199,11 +231,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 +240,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 +304,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(); | ||||
|     } | ||||
| } | ||||
| @@ -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; | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c58ee12edd81a8d43a9107bc7906a17b | ||||
| guid: d096ac3a0685dd54a836bc35192a0522 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
| @@ -0,0 +1,12 @@ | ||||
|  | ||||
| public class DanMachiCharacterSerializable : ObjectContainerSerializable | ||||
| { | ||||
|     public string AssetName; | ||||
|  | ||||
|     public DanMachiCharacterSerializable() { } | ||||
|  | ||||
|     public DanMachiCharacterSerializable(DanMachiCharacterContainer container) : base(container) | ||||
|     { | ||||
|         AssetName = container.Data.AssetName; | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 6ce5c34b04160214b935e3dcefed9ffc | ||||
| guid: 90e549cfb34f0cc47ac51d28cf4a6d9a | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
| @@ -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(); | ||||
|     } | ||||
| } | ||||
| @@ -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; | ||||
|     } | ||||
|   | ||||
							
								
								
									
										6
									
								
								Assets/DanMachi/Scripts/DanMachiInterface.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								Assets/DanMachi/Scripts/DanMachiInterface.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| public class DanMachiInterface : ModelViewerInterface | ||||
| { | ||||
|     public static DanMachiInterface Instance => GetInstance<DanMachiInterface>(); | ||||
|  | ||||
|     public CharacterDropdown CharacterSelection; | ||||
| } | ||||
							
								
								
									
										42
									
								
								Assets/DanMachi/Scripts/DanMachiMain.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								Assets/DanMachi/Scripts/DanMachiMain.cs
									
									
									
									
									
										Normal 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(); | ||||
|     } | ||||
| } | ||||
| @@ -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; | ||||
|     } | ||||
| } | ||||
| @@ -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; | ||||
| } | ||||
| @@ -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); | ||||
|     } | ||||
| } | ||||
| @@ -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); | ||||
|     } | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
| using System; | ||||
|  | ||||
| [Serializable] | ||||
| public class DanMachiSceneSerializable : SceneSerializable | ||||
| { | ||||
| } | ||||
| @@ -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() | ||||
|         { | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,8 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace Unity.Animations.SpringBones | ||||
| { | ||||
|     public class SpringCapsuleCollider : MonoBehaviour | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c04af4c8b1b74df4783e6f4815bd909f | ||||
| guid: 572171c99ddfc0542b942432884ec564 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
							
								
								
									
										8
									
								
								Assets/DanMachi/Scripts/SpringBone/SpringManager.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/DanMachi/Scripts/SpringBone/SpringManager.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace Unity.Animations.SpringBones | ||||
| { | ||||
|     public class SpringManager : MonoBehaviour | ||||
|     { | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/DanMachi/Scripts/SpringBone/SpringManager.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/DanMachi/Scripts/SpringBone/SpringManager.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: eebc1635655c1984b999d5430c8d3ce0 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
| @@ -0,0 +1,8 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace Unity.Animations.SpringBones | ||||
| { | ||||
|     public class SpringSphereCollider : MonoBehaviour | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: a181323294f10e14faef8a3238a3bf5f | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
| @@ -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(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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
											
										
									
								
							| @@ -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); | ||||
|  | ||||
|   | ||||
| @@ -7,5 +7,4 @@ public class EversoulInterface : ModelViewerInterface | ||||
|     public static EversoulInterface Instance => GetInstance<EversoulInterface>(); | ||||
|  | ||||
|     public EversoulCharacterDropdown CharacterSelection; | ||||
|     public UIToolbar SelectedObjectToolbar; | ||||
| } | ||||
|   | ||||
| @@ -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
									
								
							
							
						
						
									
										8
									
								
								Assets/KF3.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c6fd7a592b4202742a737ce9daddeeeb | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										40248
									
								
								Assets/KF3/KF3.unity
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40248
									
								
								Assets/KF3/KF3.unity
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										7
									
								
								Assets/KF3/KF3.unity.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assets/KF3/KF3.unity.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 50cd194efc5f9c44d9b6ee9079abd64d | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										8
									
								
								Assets/KF3/Prefabs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/KF3/Prefabs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c0a907902af71e44aaab7696de8c5b0c | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										8
									
								
								Assets/KF3/Prefabs/UI.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/KF3/Prefabs/UI.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 725384a4561b63d4baa344c060b5e015 | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,5 +1,5 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c30254db06d7e754dbcc1991db5066dc | ||||
| guid: 50ed82b5576a8274fbef3e9850fafadd | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
							
								
								
									
										1982
									
								
								Assets/KF3/Prefabs/UI/FriendMorphPanel.prefab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1982
									
								
								Assets/KF3/Prefabs/UI/FriendMorphPanel.prefab
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,5 +1,5 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 860580398cf97ab4eac7935169b6dd42 | ||||
| guid: bf21dae47f1e1b74faf8be16bb74c2dc | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
							
								
								
									
										989
									
								
								Assets/KF3/Prefabs/UI/MorphSlider.prefab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										989
									
								
								Assets/KF3/Prefabs/UI/MorphSlider.prefab
									
									
									
									
									
										Normal 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 | ||||
							
								
								
									
										7
									
								
								Assets/KF3/Prefabs/UI/MorphSlider.prefab.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assets/KF3/Prefabs/UI/MorphSlider.prefab.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: b2d0521d1dc319e418a688922476c31a | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										485
									
								
								Assets/KF3/Prefabs/UI/MorphToggle.prefab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										485
									
								
								Assets/KF3/Prefabs/UI/MorphToggle.prefab
									
									
									
									
									
										Normal 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} | ||||
							
								
								
									
										7
									
								
								Assets/KF3/Prefabs/UI/MorphToggle.prefab.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assets/KF3/Prefabs/UI/MorphToggle.prefab.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: a1970a34f4ac9fc4cb6c3ad8678bcdf8 | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										873
									
								
								Assets/KF3/Prefabs/UI/MorphToggleSlider.prefab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										873
									
								
								Assets/KF3/Prefabs/UI/MorphToggleSlider.prefab
									
									
									
									
									
										Normal 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: [] | ||||
							
								
								
									
										7
									
								
								Assets/KF3/Prefabs/UI/MorphToggleSlider.prefab.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assets/KF3/Prefabs/UI/MorphToggleSlider.prefab.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d14a29596b555f3458423c78e0082679 | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										4014
									
								
								Assets/KF3/Prefabs/UI/SceneSettings.prefab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4014
									
								
								Assets/KF3/Prefabs/UI/SceneSettings.prefab
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										7
									
								
								Assets/KF3/Prefabs/UI/SceneSettings.prefab.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assets/KF3/Prefabs/UI/SceneSettings.prefab.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 581741c85ee2b1d43b73c88a0364f8c5 | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										1656
									
								
								Assets/KF3/Prefabs/UI/StaticSettings.prefab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1656
									
								
								Assets/KF3/Prefabs/UI/StaticSettings.prefab
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										7
									
								
								Assets/KF3/Prefabs/UI/StaticSettings.prefab.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assets/KF3/Prefabs/UI/StaticSettings.prefab.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 0eb004b3d1c3a5642ae606e60c5294e4 | ||||
| PrefabImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										8
									
								
								Assets/KF3/Scripts.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/KF3/Scripts.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 038ba5aed73069e4d88ea650fb1c0e7e | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										13
									
								
								Assets/KF3/Scripts/AdditionalResources.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Assets/KF3/Scripts/AdditionalResources.cs
									
									
									
									
									
										Normal 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/AdditionalResources.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/AdditionalResources.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 3eddd5732ddb1bd4e884314ec626f739 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										292
									
								
								Assets/KF3/Scripts/CharaModelReferencer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										292
									
								
								Assets/KF3/Scripts/CharaModelReferencer.cs
									
									
									
									
									
										Normal 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; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/CharaModelReferencer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/CharaModelReferencer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d3c24f6a6f3ca1b48a2169cbfca871f8 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										1097
									
								
								Assets/KF3/Scripts/CharaMotionDefine.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1097
									
								
								Assets/KF3/Scripts/CharaMotionDefine.cs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/CharaMotionDefine.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/CharaMotionDefine.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: ec813cdf8e05fbb489716dadac046141 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										8
									
								
								Assets/KF3/Scripts/Containers.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/KF3/Scripts/Containers.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 1ca9226664748b2429436d99a7bb4d1c | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										168
									
								
								Assets/KF3/Scripts/Containers/CharacterKeyframeData.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								Assets/KF3/Scripts/Containers/CharacterKeyframeData.cs
									
									
									
									
									
										Normal 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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/CharacterKeyframeData.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/CharacterKeyframeData.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 8923d4ac35f395b4cadc946757795475 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										162
									
								
								Assets/KF3/Scripts/Containers/KF3CeruleanContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								Assets/KF3/Scripts/Containers/KF3CeruleanContainer.cs
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3CeruleanContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3CeruleanContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c1670e1c9f79d8340a9c745453d0f118 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										265
									
								
								Assets/KF3/Scripts/Containers/KF3CharacterContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								Assets/KF3/Scripts/Containers/KF3CharacterContainer.cs
									
									
									
									
									
										Normal 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3CharacterContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3CharacterContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c13c0b3d8ec32244794be75bdce3fd14 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
| @@ -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; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c2af1ff3ca27f394aaf69496edffa73a | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										746
									
								
								Assets/KF3/Scripts/Containers/KF3FriendContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										746
									
								
								Assets/KF3/Scripts/Containers/KF3FriendContainer.cs
									
									
									
									
									
										Normal 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); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3FriendContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3FriendContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 65acd7afcc45d3142a3b712abcd41531 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										58
									
								
								Assets/KF3/Scripts/Containers/KF3ObjectContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								Assets/KF3/Scripts/Containers/KF3ObjectContainer.cs
									
									
									
									
									
										Normal 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 | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3ObjectContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3ObjectContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d028abe563d1f8142859213a6513cc27 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
| @@ -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) { } | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: a5a255f7822836f4f9cd74c5e12f5c9a | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										185
									
								
								Assets/KF3/Scripts/Containers/KF3SceneContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								Assets/KF3/Scripts/Containers/KF3SceneContainer.cs
									
									
									
									
									
										Normal 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()) | ||||
|         }; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3SceneContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3SceneContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 557b17c6118f1824f87ce6c5681d326a | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										26
									
								
								Assets/KF3/Scripts/Containers/KF3SceneSerializable.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								Assets/KF3/Scripts/Containers/KF3SceneSerializable.cs
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3SceneSerializable.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3SceneSerializable.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 049dacceaae7adb468b3c151f7985fef | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										286
									
								
								Assets/KF3/Scripts/Containers/KF3StaticContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										286
									
								
								Assets/KF3/Scripts/Containers/KF3StaticContainer.cs
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3StaticContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/KF3StaticContainer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 85d6b154ae038604a99d1805754858d9 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										34
									
								
								Assets/KF3/Scripts/Containers/SceneKeyframe.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Assets/KF3/Scripts/Containers/SceneKeyframe.cs
									
									
									
									
									
										Normal 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; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Containers/SceneKeyframe.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Containers/SceneKeyframe.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d761685c6e163014f915b5afc1014541 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/CustomPlayableExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/CustomPlayableExtensions.cs
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								Assets/KF3/Scripts/CustomPlayableExtensions.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								Assets/KF3/Scripts/CustomPlayableExtensions.cs.meta
									
									
									
									
									
										Normal 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:  | ||||
							
								
								
									
										8
									
								
								Assets/KF3/Scripts/Handles.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Assets/KF3/Scripts/Handles.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: b77693a8e9b9801468ec185f1ab291a8 | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										30
									
								
								Assets/KF3/Scripts/Handles/UIHandleCerulean.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Assets/KF3/Scripts/Handles/UIHandleCerulean.cs
									
									
									
									
									
										Normal 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Handles/UIHandleCerulean.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Handles/UIHandleCerulean.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: fcc0e948bb20f034e8b7ae8492816bd4 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										52
									
								
								Assets/KF3/Scripts/Handles/UIHandleEyes.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								Assets/KF3/Scripts/Handles/UIHandleEyes.cs
									
									
									
									
									
										Normal 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Handles/UIHandleEyes.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Handles/UIHandleEyes.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 60bfe8cf0d5fae34fb9d3ba5ba2306b8 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										38
									
								
								Assets/KF3/Scripts/Handles/UIHandleFriend.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Assets/KF3/Scripts/Handles/UIHandleFriend.cs
									
									
									
									
									
										Normal 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/Handles/UIHandleFriend.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/Handles/UIHandleFriend.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 2dd174b81dfa2fb47b2abf859285ec7f | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										30
									
								
								Assets/KF3/Scripts/KF3AssetBundle.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Assets/KF3/Scripts/KF3AssetBundle.cs
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/KF3AssetBundle.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/KF3AssetBundle.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 71c45231b7370ae4ea6c1acb050b2147 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										339
									
								
								Assets/KF3/Scripts/KF3AssetLibrary.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								Assets/KF3/Scripts/KF3AssetLibrary.cs
									
									
									
									
									
										Normal 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); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/KF3AssetLibrary.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/KF3AssetLibrary.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 373c79c99278cfd49831aa3dfee6c833 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										197
									
								
								Assets/KF3/Scripts/KF3ModelBuilder.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								Assets/KF3/Scripts/KF3ModelBuilder.cs
									
									
									
									
									
										Normal 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(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/KF3ModelBuilder.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/KF3ModelBuilder.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: eb8423da904bf2141920bdc3b0f113ac | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										138
									
								
								Assets/KF3/Scripts/KF3ModelViewerInterface.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								Assets/KF3/Scripts/KF3ModelViewerInterface.cs
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/KF3ModelViewerInterface.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/KF3ModelViewerInterface.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: e6d93901e0c9dc145a55438241b04761 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										139
									
								
								Assets/KF3/Scripts/KF3ModelViewerMain.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								Assets/KF3/Scripts/KF3ModelViewerMain.cs
									
									
									
									
									
										Normal 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; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/KF3ModelViewerMain.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/KF3ModelViewerMain.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 2cf8b98999cdac848800dcd38e22455e | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										732
									
								
								Assets/KF3/Scripts/KF3Names.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										732
									
								
								Assets/KF3/Scripts/KF3Names.cs
									
									
									
									
									
										Normal 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【天才発明家・G】"; | ||||
|             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; | ||||
| } | ||||
							
								
								
									
										11
									
								
								Assets/KF3/Scripts/KF3Names.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Assets/KF3/Scripts/KF3Names.cs.meta
									
									
									
									
									
										Normal 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
		Reference in New Issue
	
	Block a user