- Home /
How to properly use blendshapes via script? (c#)
Hello, I need advice on how to script blendshape animations. What I try to do is, making a 25000 polygon female model blink with her eyes, in random intervals. The blendshapes are all showing up correctly on the mesh. I put the following script on it, but when I start the game view, the eyes are closing in big steps with no transition until they are almost completely shut and then unity crashes with the "unity editor stopped working"-message. I use this script, will try to comment my idea:
using UnityEngine;
using System.Collections;
public class BlinkControl : MonoBehaviour {
SkinnedMeshRenderer skinnedMeshRenderer;
float blink = 0.0f;
float blendSpeed = 1.0f;
bool eyesClosed = false;
void Awake()
{
skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
}
void Start()
{
StartCoroutine(Blink());
}
private IEnumerator Blink()
{
if(!eyesClosed && blink < 100.0f) //as long as the weight < 100 and eyes are open...
{
blendSpeed = 20.0f;
skinnedMeshRenderer.SetBlendShapeWeight(46, blink);
blink += blendSpeed; //...increase weight
}
else eyesClosed = true;
if(eyesClosed) //if eyes are closed...
{
blendSpeed = 10.0f;
skinnedMeshRenderer.SetBlendShapeWeight(46, blink);
blink -= blendSpeed; //...decrease weight
}
else
{
eyesClosed = false; //set eyesClosed to false to restart the cycle...
yield return new WaitForSeconds(Random.Range(1.0f,8.0f)); //...as soon as 1-8 seconds have passed
}
StartCoroutine("Blink"); //restart coroutine
}
}
I don't know what the problem is. Any idea?
Answer by WendelinReich · Dec 20, 2013 at 07:31 PM
The problem is with the final "StartCoroutine("Blink");" statement. Basically, it throws Unity into an endless loop, and since your game shares its main thread with the editor, the editor crashes.
You can easily fix this by replacing the statement with a "yield return null;". In addition, the entire body of the Blink() coroutine has to go into a loop, such as "while (true) { ... }". That should do it.
To learn more about coroutines, check out the following tutorial: http://unity3d.com/learn/tutorials/modules/intermediate/scripting/coroutines
Thank you! I'll keep that in $$anonymous$$d, anyhow, I use mecanim now to control blend shapes, because it's much easier!
best regards
Your answer
Follow this Question
Related Questions
Unexpected Co-Routine Behavior 1 Answer
Trouble with Iterative Coroutine 1 Answer
Can't start Coroutine since object is "Inactive" 1 Answer