Files
BABA_YAGA/Assets/Third Parties/RealToon/RealToon Tools/SmearEffectHelper.cs
2026-05-01 15:08:59 +07:00

315 lines
10 KiB
C#

//RealToon - Smear Effect [Helper]
//MJQStudioWorks
//©2025
using UnityEngine;
using System.Collections.Generic;
namespace RealToon.Script
{
[ExecuteAlways]
[AddComponentMenu("RealToon/Tools/Smear Effect - Helper")]
public class SmearEffectHelper : MonoBehaviour
{
Queue<Vector3> recentPositions = new Queue<Vector3>();
[HideInInspector]
[SerializeField]
Transform[] SubTran;
[HideInInspector]
[SerializeField]
Material[] Mat;
[HideInInspector]
[SerializeField]
Transform[] attac;
[Header("Note: Smear Effect feature will be automatically enable\nOn the materials of the object/model that uses RealToon Shader.")]
[Space(25)]
[SerializeField]
[Tooltip("An object to control the smear effect.")]
public Transform SmearController;
[Space(10)]
[SerializeField]
[Tooltip("How long the distorted line trails stays on the previous position.")]
int Delay = 15;
[SerializeField]
[Tooltip("How large/small the trailing noise.")]
float NoiseSize = 100;
[SerializeField]
[Tooltip("How tall/short the trailing noise.")]
float TrailSize = 1.5f;
[Space(10)]
[SerializeField]
[Tooltip("Pause the current smear effect.")]
bool PauseSmear = false;
int coun_obj_wi_ralsha = 0;
int coun_obj_mat = 0;
int coun_obj_mat_arr = 0;
[HideInInspector]
[SerializeField]
bool checkstart = true;
string RT_Sha_Nam_URP = "Universal Render Pipeline/RealToon/Version 5/Default/Default";
string RT_Sha_Nam_HDRP = "HDRP/RealToon/Version 5/Default";
void Start()
{
if (checkstart == true)
{
InitStart();
checkstart = false;
}
}
void LateUpdate()
{
if (SmearController != null)
{
if (PauseSmear != true)
{
if (Mat != null)
{
foreach (Material mate in Mat)
{
if (mate != null)
{
mate.SetVector("_ObjPosi", SmearController.position);
recentPositions.Enqueue(SmearController.position);
if (recentPositions.Count > Delay)
mate.SetVector("_PrevPosition", recentPositions.Dequeue());
Set_Shad_Prop(mate);
}
}
}
}
}
}
void Reset()
{
if (Mat != null)
{
foreach (Material mate in Mat)
{
if (mate != null)
{
mate.SetVector("_ObjPosi", new Vector4(0, 0, 0, 0));
mate.SetVector("_PrevPosition", new Vector4(0, 0, 0, 0));
}
}
recentPositions.Dequeue();
recentPositions.Clear();
checkstart = true;
coun_obj_wi_ralsha = 0;
coun_obj_mat = 0;
coun_obj_mat_arr = 0;
Res_Shad_Prop();
InitStart();
checkstart = false;
}
}
void OnDisable()
{
recentPositions.Dequeue();
foreach (Material mate in Mat)
{
if (mate != null)
{
mate.SetVector("_ObjPosi", new Vector4(0, 0, 0, 0));
mate.SetVector("_PrevPosition", new Vector4(0, 0, 0, 0));
}
}
}
/* Remove Later
void OnDestroy()
{
recentPositions.Clear();
Res_Shad_Prop();
foreach (Material Mate in Mat)
{
if (Mate != null)
{
if (Mate.shader.name == RT_Sha_Nam_URP || Mate.shader.name == RT_Sha_Nam_HDRP)
{
Mate.SetVector("_ObjPosi", new Vector4(0, 0, 0, 0));
Mate.SetVector("_PrevPosition", new Vector4(0, 0, 0, 0));
Mate.SetFloat("_N_F_SE", 0.0f);
Mate.DisableKeyword("N_F_SE_ON");
}
}
}
}
*/
#region Init
void InitStart()
{
if (attac == null || attac.Length == 0)
{
attac = this.gameObject.GetComponentsInChildren<Transform>();
}
if (SmearController == null)
{
SmearController = this.gameObject.transform;
}
int x = 0;
foreach (Transform Trans in attac)
{
if (Trans.GetComponent<SkinnedMeshRenderer>() == true)
{
if (Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial != null)
{
if (Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_URP || Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_HDRP)
{
coun_obj_wi_ralsha++;
coun_obj_mat += Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length;
}
}
}
if (Trans.GetComponent<MeshRenderer>() == true)
{
if (Trans.GetComponent<MeshRenderer>().sharedMaterial != null)
{
if (Trans.GetComponent<MeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_URP || Trans.GetComponent<MeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_HDRP)
{
coun_obj_wi_ralsha++;
coun_obj_mat += Trans.GetComponent<MeshRenderer>().sharedMaterials.Length;
}
}
}
}
SubTran = new Transform[coun_obj_wi_ralsha];
foreach (Transform Trans in attac)
{
if (Trans.GetComponent<SkinnedMeshRenderer>() == true)
{
if (Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial != null)
{
if (Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_URP || Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_HDRP)
{
SubTran[x] = Trans;
x++;
}
}
}
if (Trans.GetComponent<MeshRenderer>() == true)
{
if (Trans.GetComponent<MeshRenderer>().sharedMaterial != null)
{
if (Trans.GetComponent<MeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_URP || Trans.GetComponent<MeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_HDRP)
{
SubTran[x] = Trans;
x++;
}
}
}
}
Mat = new Material[coun_obj_mat];
foreach (Transform Trans in SubTran)
{
if (Trans.GetComponent<SkinnedMeshRenderer>() == true)
{
if (Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial != null)
{
if (Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_URP || Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_HDRP)
{
for (int i = 0; i < Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterials.Length; i++)
{
Mat[coun_obj_mat_arr] = Trans.GetComponent<SkinnedMeshRenderer>().sharedMaterials[i];
coun_obj_mat_arr++;
}
}
}
}
if (Trans.GetComponent<MeshRenderer>() == true)
{
if (Trans.GetComponent<MeshRenderer>().sharedMaterial != null)
{
if (Trans.GetComponent<MeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_URP || Trans.GetComponent<MeshRenderer>().sharedMaterial.shader.name == RT_Sha_Nam_HDRP)
{
for (int i = 0; i < Trans.GetComponent<MeshRenderer>().sharedMaterials.Length; i++)
{
Mat[coun_obj_mat_arr] = Trans.GetComponent<MeshRenderer>().sharedMaterials[i];
coun_obj_mat_arr++;
}
}
}
}
}
foreach (Material Mat in Mat)
{
if (Mat != null)
{
Set_Shad_Prop(Mat);
}
}
}
#endregion
void Set_Shad_Prop(Material Mat)
{
if (Mat.IsKeywordEnabled("N_F_SE_ON") == true)
{
Mat.SetFloat("_NoiseSize", NoiseSize);
Mat.SetFloat("_TrailSize", TrailSize);
}
else if (Mat.IsKeywordEnabled("N_F_SE_ON") != true)
{
Mat.EnableKeyword("N_F_SE_ON");
Mat.SetInt("_N_F_SE", 1);
}
}
void Res_Shad_Prop()
{
NoiseSize = 100;
TrailSize = 1.5f;
Delay = 15;
}
}
}