using System.Collections; using System.Collections.Generic; using System.Linq; using NaughtyAttributes; using UnityEngine; using UnityEngine.VFX; public class UpdateMesh : MonoBehaviour { public Animator skinnedMeshAnimator; public SkinnedMeshRenderer skinnedMesh; public VisualEffect effect; public NPC Npc; public Shader instanceDisable; public Material instancePreset; private Material _materialInstance; private static readonly int DAmount = Shader.PropertyToID("Vector1_393c81c15f434c19bf41187f07e7d7a4"); private static readonly int DWight = Shader.PropertyToID("Vector1_d7d572e8425e4147a2fd14f9c31724fc"); [SerializeField] private List colliders = new List(); public void Start() { Npc.OnDead += NpcOnOnDead; } private void NpcOnOnDead() { foreach (var _collider in colliders) { _collider.enabled = false; } DeadStart(); } public IEnumerator BeakProcess() { for (int i = 0; i < 300; i++) { yield return new WaitForSeconds(0.15f); SetSoulMesh(skinnedMesh, effect); } } public IEnumerator DeadProcess() { skinnedMeshAnimator.Play("D"); effect.gameObject.SetActive(true); var t = 0.0f; SetSoulMesh(skinnedMesh, effect); StartCoroutine(BeakProcess()); for (int i = 0; i < 300; i++) { var d = (i)/300.0f; d = Mathf.Clamp01(d); var d2 = Mathf.Clamp01(d+0.018f); yield return new WaitForSeconds(0.02f); skinnedMesh.material.SetFloat(DAmount, d); skinnedMesh.material.SetFloat(DWight, d2); t += Time.fixedDeltaTime; } effect.gameObject.SetActive(false); } public void SetSoulMesh(SkinnedMeshRenderer skinnedMesh, VisualEffect effect) { Mesh temp = new Mesh(); skinnedMesh.BakeMesh(temp); Vector3[] vertices = temp.vertices; Mesh m2 = new Mesh(); m2.vertices = vertices; effect.SetMesh("Mesh", m2); } [Button()] public void FindColl() { colliders = transform.parent.gameObject.GetComponentsInChildren().ToList(); } [Button()] public void DeadStart() { _materialInstance = new Material(instancePreset); skinnedMesh.material = _materialInstance; StartCoroutine(DeadProcess()); } // public GameObject targetRoot; // [Button()] // public void CopyCollidersTo() // { // foreach (var sourceCollider in colliders) // { // var targetTransform = FindDeepChildByName(targetRoot.transform, sourceCollider.transform.name); // if (targetTransform == null) // { // Debug.LogWarning($"No object with name found: {sourceCollider.transform.name}"); // continue; // } // var type = sourceCollider.GetType(); // var targetCollider = (Collider)targetTransform.gameObject.AddComponent(type); // UnityEditorInternal.ComponentUtility.CopyComponent(sourceCollider); // UnityEditorInternal.ComponentUtility.PasteComponentValues(targetCollider); // } // } private Transform FindDeepChildByName(Transform parent, string name) { foreach (Transform child in parent) { if (child.name == name) return child; var result = FindDeepChildByName(child, name); if (result != null) return result; } return null; } }