You've already forked UniversalViewer
							
							Eversoul:
-compatibility improvements Core: -new settings class
This commit is contained in:
		
							
								
								
									
										274
									
								
								Assets/Eversoul/Scripts/Containers/EversoulCharacterContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										274
									
								
								Assets/Eversoul/Scripts/Containers/EversoulCharacterContainer.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,274 @@ | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using UnityEngine; | ||||
|  | ||||
| public class EversoulCharacterContainer : ObjectContainer, IAnimated | ||||
| { | ||||
|     public CharacterAsset Data; | ||||
|     public string AnimationSet; | ||||
|     public string Animation; | ||||
|  | ||||
|     public MorphPanel MorphPanel; | ||||
|     public List<AnimationClip> Animations; | ||||
|     private Animator _animator; | ||||
|     private AnimatorOverrideController _animatorController; | ||||
|     private Dictionary<HumanBodyBones, Transform> _humanBones = new Dictionary<HumanBodyBones, Transform>(); | ||||
|  | ||||
|     public override void Select() | ||||
|     { | ||||
|         if (MorphPanel != null) | ||||
|         { | ||||
|             MorphPanel.gameObject.SetActive(true); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public override void Deselect() | ||||
|     { | ||||
|         if (MorphPanel != null) | ||||
|         { | ||||
|             MorphPanel.gameObject.SetActive(false); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public IEnumerator Build(CharacterAsset model) | ||||
|     { | ||||
|         Data = model; | ||||
|         var path = EversoulAssetLibrary.Instance.GetResourcePath(model.ResourceName, out var dependencies); | ||||
|         var modelPath = EversoulAssetLibrary.Instance.LocalFilesPath + path; | ||||
|         var dependencyPaths = dependencies.Select(path => EversoulAssetLibrary.Instance.LocalFilesPath + path).ToList(); | ||||
|         Debug.LogError(modelPath); | ||||
|  | ||||
|         yield return EversoulAssetLibrary.Instance.LoadAssets(dependencyPaths); | ||||
|  | ||||
|         var bundle = AssetLibrary.LoadFromFile(modelPath); | ||||
|         var asset = bundle.LoadAsset<GameObject>(model.ResourceName); | ||||
|         var go = Instantiate(asset, this.transform); | ||||
|  | ||||
|         EversoulAssetLibrary.Instance.UnloadAssets(dependencyPaths); | ||||
|         EversoulAssetLibrary.Instance.UnloadAsset(modelPath); | ||||
|  | ||||
|         SetDefaultMaterials(transform); | ||||
|  | ||||
|         Init(); | ||||
|     } | ||||
|  | ||||
|     public void Init() | ||||
|     { | ||||
|         _animator = GetComponentInChildren<Animator>(); | ||||
|         _animator.applyRootMotion = false; | ||||
|         _animator.runtimeAnimatorController = _animatorController = Instantiate(SharedResources.Instance.GenericAnimatorController); | ||||
|         SetBones(); | ||||
|         CreateMorphPanel(); | ||||
|     } | ||||
|  | ||||
|     public void PlayAnimation(AnimationClip anim) | ||||
|     { | ||||
|         if (anim == null) | ||||
|         { | ||||
|             Animation = ""; | ||||
|             _animator.enabled = false; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Animation = anim.name; | ||||
|             _animator.enabled = true; | ||||
|             _animatorController["Anim"] = anim; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void SetDefaultMaterials(Transform t) | ||||
|     { | ||||
|         List<Material> materials = new List<Material>(); | ||||
|         foreach (var renderer in t.GetComponentsInChildren<Renderer>()) | ||||
|         { | ||||
|             foreach (var material in renderer.sharedMaterials) | ||||
|             { | ||||
|                 if (materials.Contains(material)) continue; | ||||
|                 materials.Add(material); | ||||
|                 switch (material.shader.name) | ||||
|                 { | ||||
|                     case "NineArk/Character/PC_Basic_Body": | ||||
|                         material.shader = Shader.Find("Eversoul/Lit"); | ||||
|                         break; | ||||
|                     case "NineArk/Character/PC_Basic_Body_Transparent": | ||||
|                         material.shader = Shader.Find("Eversoul/Lit Transparent"); | ||||
|                         break; | ||||
|                     case "NineArk/Character/NPC_Glass": | ||||
|                         material.shader = Shader.Find("Eversoul/Glass"); | ||||
|                         break; | ||||
|                     case "NineArk/Character/PC_Basic_Face": | ||||
|                         material.shader = Shader.Find("Eversoul/Unlit"); | ||||
|                         break; | ||||
|                     case "NineArk/Character/PC_Basic_Eye": | ||||
|                         material.shader = Shader.Find("Eversoul/BasicEye"); | ||||
|                         break; | ||||
|                     case "NineArk/Outline/PC_Outline": | ||||
|                         material.shader = Shader.Find("Eversoul/Outline"); | ||||
|                         break; | ||||
|                     case "NineArk/Outline/PC_Outline_Transparent": | ||||
|                         material.shader = Shader.Find("Eversoul/Outline Transparent"); | ||||
|                         break; | ||||
|                     default: | ||||
|                         Debug.LogError("Shader not found: " + material.shader.name); | ||||
|                         //material.shader = Shader.Find("Eversoul/Lit"); | ||||
|                         break; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void SetBones() | ||||
|     { | ||||
|         var humanBones = new Dictionary<HumanBodyBones, Transform>(); | ||||
|         var allBones = new Dictionary<string, Transform>(); | ||||
|         foreach(var bone in _animator.transform.GetComponentsInChildren<Transform>()) | ||||
|         { | ||||
|             if (!allBones.ContainsKey(bone.name)) | ||||
|             { | ||||
|                 allBones.Add(bone.name, bone); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Debug.LogWarning("Duplicate bone: " + bone.name); | ||||
|             } | ||||
|         } | ||||
|         humanBones.Add(HumanBodyBones.Hips,                     TryGet(allBones, "Bip001 Pelvis")); | ||||
|         humanBones.Add(HumanBodyBones.Spine,                    TryGet(allBones, "Bip001 Spine")); | ||||
|         humanBones.Add(HumanBodyBones.RightUpperLeg,            TryGet(allBones, "Bip001 R Thigh")); | ||||
|         humanBones.Add(HumanBodyBones.RightLowerLeg,            TryGet(allBones, "Bip001 R Calf")); | ||||
|         humanBones.Add(HumanBodyBones.RightFoot,                TryGet(allBones, "Bip001 R Foot")); | ||||
|         humanBones.Add(HumanBodyBones.RightToes,                TryGet(allBones, "Bip001 R Toe0")); | ||||
|         humanBones.Add(HumanBodyBones.LeftUpperLeg,             TryGet(allBones, "Bip001 L Thigh")); | ||||
|         humanBones.Add(HumanBodyBones.LeftLowerLeg,             TryGet(allBones, "Bip001 L Calf")); | ||||
|         humanBones.Add(HumanBodyBones.LeftFoot,                 TryGet(allBones, "Bip001 L Foot")); | ||||
|         humanBones.Add(HumanBodyBones.LeftToes,                 TryGet(allBones, "Bip001 L Toe0")); | ||||
|         humanBones.Add(HumanBodyBones.Chest,                    TryGet(allBones, "Bip001 Spine1")); | ||||
|         humanBones.Add(HumanBodyBones.Neck,                     TryGet(allBones, "Bip001 Neck")); | ||||
|         humanBones.Add(HumanBodyBones.Head,                     TryGet(allBones, "Bip001 Head")); | ||||
|         humanBones.Add(HumanBodyBones.RightShoulder,            TryGet(allBones, "Bip001 R Clavicle")); | ||||
|         humanBones.Add(HumanBodyBones.RightUpperArm,            TryGet(allBones, "Bip001 R UpperArm")); | ||||
|         humanBones.Add(HumanBodyBones.RightLowerArm,            TryGet(allBones, "Bip001 R Forearm")); | ||||
|         humanBones.Add(HumanBodyBones.RightHand,                TryGet(allBones, "Bip001 R Hand")); | ||||
|         humanBones.Add(HumanBodyBones.RightIndexProximal,       TryGet(allBones, "Bip001 R Finger1")); | ||||
|         humanBones.Add(HumanBodyBones.RightIndexIntermediate,   TryGet(allBones, "Bip001 R Finger11")); | ||||
|         humanBones.Add(HumanBodyBones.RightMiddleProximal,      TryGet(allBones, "Bip001 R Finger2")); | ||||
|         humanBones.Add(HumanBodyBones.RightMiddleIntermediate,  TryGet(allBones, "Bip001 R Finger21")); | ||||
|         humanBones.Add(HumanBodyBones.RightRingProximal,        TryGet(allBones, "Bip001 R Finger3")); | ||||
|         humanBones.Add(HumanBodyBones.RightRingIntermediate,    TryGet(allBones, "Bip001 R Finger31")); | ||||
|         humanBones.Add(HumanBodyBones.RightLittleProximal,      TryGet(allBones, "Bip001 R Finger4")); | ||||
|         humanBones.Add(HumanBodyBones.RightLittleIntermediate,  TryGet(allBones, "Bip001 R Finger41")); | ||||
|         humanBones.Add(HumanBodyBones.RightThumbProximal,       TryGet(allBones, "Bip001 R Finger0")); | ||||
|         humanBones.Add(HumanBodyBones.RightThumbIntermediate,   TryGet(allBones, "Bip001 R Finger01")); | ||||
|         humanBones.Add(HumanBodyBones.LeftShoulder,             TryGet(allBones, "Bip001 L Clavicle")); | ||||
|         humanBones.Add(HumanBodyBones.LeftUpperArm,             TryGet(allBones, "Bip001 L UpperArm")); | ||||
|         humanBones.Add(HumanBodyBones.LeftLowerArm,             TryGet(allBones, "Bip001 L Forearm")); | ||||
|         humanBones.Add(HumanBodyBones.LeftHand,                 TryGet(allBones, "Bip001 L Hand")); | ||||
|         humanBones.Add(HumanBodyBones.LeftIndexProximal,        TryGet(allBones, "Bip001 L Finger1")); | ||||
|         humanBones.Add(HumanBodyBones.LeftIndexIntermediate,    TryGet(allBones, "Bip001 L Finger11")); | ||||
|         humanBones.Add(HumanBodyBones.LeftMiddleProximal,       TryGet(allBones, "Bip001 L Finger2")); | ||||
|         humanBones.Add(HumanBodyBones.LeftMiddleIntermediate,   TryGet(allBones, "Bip001 L Finger21")); | ||||
|         humanBones.Add(HumanBodyBones.LeftRingProximal,         TryGet(allBones, "Bip001 L Finger3")); | ||||
|         humanBones.Add(HumanBodyBones.LeftRingIntermediate,     TryGet(allBones, "Bip001 L Finger31")); | ||||
|         humanBones.Add(HumanBodyBones.LeftLittleProximal,       TryGet(allBones, "Bip001 L Finger4")); | ||||
|         humanBones.Add(HumanBodyBones.LeftLittleIntermediate,   TryGet(allBones, "Bip001 L Finger41")); | ||||
|         humanBones.Add(HumanBodyBones.LeftThumbProximal,        TryGet(allBones, "Bip001 L Finger0")); | ||||
|         humanBones.Add(HumanBodyBones.LeftThumbIntermediate,    TryGet(allBones, "Bip001 L Finger01")); | ||||
|         foreach (var bone in humanBones) | ||||
|         { | ||||
|             if (bone.Value != null) | ||||
|             { | ||||
|                 var tags = new List<SerializableBone.BoneTags>() { SerializableBone.BoneTags.Humanoid }; | ||||
|                 if (bone.Value.name.Contains(" L ")) | ||||
|                 { | ||||
|                     tags.Add(SerializableBone.BoneTags.Left); | ||||
|                 } | ||||
|                 else if (bone.Value.name.Contains(" R ")) | ||||
|                 { | ||||
|                     tags.Add(SerializableBone.BoneTags.Right); | ||||
|                 } | ||||
|                 if ((bone.Key >= HumanBodyBones.LeftThumbProximal && bone.Key <= HumanBodyBones.LeftLittleDistal) | ||||
|                     || (bone.Key >= HumanBodyBones.RightThumbProximal && bone.Key <= HumanBodyBones.RightLittleDistal)) | ||||
|                 { | ||||
|                     tags.Add(SerializableBone.BoneTags.Finger); | ||||
|                 } | ||||
|                 UIHandle.CreateAsChild<UIHandleBone>(bone.Value).Init(this, tags).WithLineRenderer(); ; | ||||
|             } | ||||
|         } | ||||
|         foreach (var bone in allBones.Values.Except(humanBones.Values)) | ||||
|         { | ||||
|             var tags = new List<SerializableBone.BoneTags>(); | ||||
|             UIHandle.CreateAsChild<UIHandleBone>(bone).Init(this, tags).WithLineRenderer(); ; | ||||
|         } | ||||
|  | ||||
|         _humanBones = humanBones; | ||||
|     } | ||||
|  | ||||
|     public void CreateMorphPanel() | ||||
|     { | ||||
|         if (MorphPanel != null) | ||||
|         { | ||||
|             Destroy(MorphPanel.gameObject); | ||||
|         } | ||||
|  | ||||
|         var morphRenderers = new Dictionary<SkinnedMeshRenderer, List<MorphHelper>>(); | ||||
|         foreach (var rend in gameObject.GetComponentsInChildren<SkinnedMeshRenderer>()) | ||||
|         { | ||||
|             if (rend.sharedMesh.blendShapeCount > 0) | ||||
|             { | ||||
|                 morphRenderers.Add(rend, new List<MorphHelper>()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (morphRenderers.Count == 0) return; | ||||
|  | ||||
|         MorphPanel = MorphPanel.Create(morphRenderers.Select(mr => mr.Key.sharedMesh.name).ToList()); | ||||
|         MorphPanel.name = $"{Data.Name} Morphs"; | ||||
|  | ||||
|         foreach (var rend in morphRenderers) | ||||
|         { | ||||
|             var mesh = rend.Key.sharedMesh; | ||||
|             for (int i = 0; i < mesh.blendShapeCount; i++) | ||||
|             { | ||||
|                 MorphPanel.CreateMorph(mesh.name, this, rend.Key, i, mesh.GetBlendShapeName(i)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         Morphs = morphRenderers; | ||||
|         EversoulInterface.Instance.SelectedObjectToolbar.AttachToThis(MorphPanel.GetComponent<UIElementDragger>()); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public T TryGet<T>(Dictionary<string, T> dict, string key) | ||||
|     { | ||||
|         if (dict.ContainsKey(key)) | ||||
|         { | ||||
|             return dict[key]; | ||||
|         } | ||||
|         return default(T); | ||||
|     } | ||||
|  | ||||
|     public override Vector3 GetCenter() | ||||
|     { | ||||
|         if (_humanBones.ContainsKey(HumanBodyBones.Hips)) | ||||
|         { | ||||
|             return _humanBones[HumanBodyBones.Hips].position; | ||||
|         } | ||||
|         return base.GetCenter(); | ||||
|     } | ||||
|  | ||||
|     protected override void OnDestroy() | ||||
|     { | ||||
|         if (_applicationQuitting) return; | ||||
|         if (MorphPanel != null) | ||||
|         { | ||||
|             Destroy(MorphPanel.gameObject); | ||||
|         } | ||||
|         base.OnDestroy(); | ||||
|     } | ||||
|  | ||||
|     public Animator GetAnimator() | ||||
|     { | ||||
|         return _animator; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 3622e2dc0c9881b4b87e74ba76f78a30 | ||||
| MonoImporter: | ||||
|   externalObjects: {} | ||||
|   serializedVersion: 2 | ||||
|   defaultReferences: [] | ||||
|   executionOrder: 0 | ||||
|   icon: {instanceID: 0} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
		Reference in New Issue
	
	Block a user