유니티/기능
유니티 캐릭터 트레일 효과 만들기, 분신 효과
MJ_119
2024. 7. 14. 01:42
if (Input.GetKeyDown(KeyCode.R) && !isTrailActive)
{
Dash();
isTrailActive = true;
StartCoroutine(ActivateTrail(activeTime));
isTrailActive = false;
}
IEnumerator ActivateTrail(float timeActive)
{
while (timeActive > 0)
{
timeActive -= meshRefreshRate;
if(skinnedMeshRenderers == null)
{
skinnedMeshRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
}
for(int i = 0; i < skinnedMeshRenderers.Length; i++)
{
GameObject gObj = new GameObject();
gObj.transform.SetPositionAndRotation(transform.position, transform.rotation);
MeshRenderer mr = gObj.AddComponent<MeshRenderer>();
MeshFilter mf = gObj.AddComponent<MeshFilter>();
Mesh mesh = new Mesh();
skinnedMeshRenderers[i].BakeMesh(mesh);
mf.mesh = mesh;
mr.material = characterMaterial;
Destroy(gObj, meshDestroyDelay);
}
yield return new WaitForSeconds(meshRefreshRate);
}
}
public Material characterMaterial;
public string shaderVarRef;
public float shaderVarRate = 0.1f;
public float shaderVarRefreshRate = 0.05f;
IEnumerator ActivateTrail(float timeActive)
{
while (timeActive > 0)
{
timeActive -= meshRefreshRate;
if(skinnedMeshRenderers == null)
{
skinnedMeshRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
}
for(int i = 0; i < skinnedMeshRenderers.Length; i++)
{
GameObject gObj = new GameObject();
gObj.transform.SetPositionAndRotation(transform.position, transform.rotation);
MeshRenderer mr = gObj.AddComponent<MeshRenderer>();
MeshFilter mf = gObj.AddComponent<MeshFilter>();
Mesh mesh = new Mesh();
skinnedMeshRenderers[i].BakeMesh(mesh);
mf.mesh = mesh;
mr.material = characterMaterial;
StartCoroutine(AnimateMaterialFloat(mr.material, 0 ,shaderVarRate ,shaderVarRefreshRate));
Destroy(gObj, meshDestroyDelay);
}
yield return new WaitForSeconds(meshRefreshRate);
}
}
IEnumerator AnimateMaterialFloat(Material mat, float goal, float rate, float refreshRate)
{
float valueToAnimate = mat.GetFloat(shaderVarRef);
while (valueToAnimate > goal)
{
valueToAnimate -= rate;
mat.SetFloat(shaderVarRef, valueToAnimate);
yield return new WaitForSeconds(refreshRate);
}
}