TG9six 03a642d635 first push
first push
2025-09-06 17:17:39 +04:00

124 lines
3.6 KiB
C#

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<Collider> colliders = new List<Collider>();
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<Collider>().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;
}
}