124 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|