Copying and Pasting cs Code
In cs, like in almost any computer programming language, reading data from a file can be tricky. You add extra lines of code to tell the computer what to do. Sometimes you can copy and paste these lines from other peoples’ code.
For example, you can follow the pattern in this listing: public static void AddKey(this AnimationCurve curve, Keyframe keyframe, TimelineKey lastKey)
{
var keys = curve.keys;
//Early out - if this is the first key on this curve just add it
if (keys.Length == 0)
{
curve.AddKey(keyframe);
return;
}
if (lastKey == null)
{
Debug.Log(string.Format("ERROR: NULL lastkey passed to AddKey when curve contains {0} keys", keys.Length));
return;
}
//Get the last keyframe
Keyframe lastKeyframe = keys[keys.Length - 1];
//If no TimelineKey is supplied, default to Linear curve
CurveType curveType = lastKey.CurveType;
switch (curveType)
{
case CurveType.Instant:
lastKeyframe.outTangent = 0;
curve.MoveKey(keys.Length - 1, lastKeyframe);
keyframe.inTangent = float.PositiveInfinity;
curve.AddKey(keyframe);
break;
case CurveType.Linear:
var val = (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
lastKeyframe.outTangent = val;
curve.MoveKey(keys.Length - 1, lastKeyframe);
keyframe.inTangent = val;
curve.AddKey(keyframe);
break;
case CurveType.Quadratic:
{
//Increase to cubic
var c1 = (2 * lastKey.CurveParams[0]) / 3;
var c2 = 1 - (2 * lastKey.CurveParams[0] + 1) / 3;
//Convert [0,1] into unity-acceptable tangents
c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
//Set the out tangent for the previous frame and update
lastKeyframe.outTangent = c1;
curve.MoveKey(keys.Length - 1, lastKeyframe);
//Set the in tangent for the current frame and add
keyframe.inTangent = c2;
curve.AddKey(keyframe);
break;
}
case CurveType.Cubic:
{
//Get curve parameters
var c1 = lastKey.CurveParams[0];
var c2 = 1 - lastKey.CurveParams[1];
//Convert [0,1] into unity-acceptable tangents
c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
//Set the out tangent for the previous frame and update
lastKeyframe.outTangent = c1;
curve.MoveKey(keys.Length - 1, lastKeyframe);
//Set the in tangent for the current frame and add
keyframe.inTangent = c2;
curve.AddKey(keyframe);
break;
}
default:
Debug.LogWarning("CurveType " + curveType.ToString() + " not yet supported!");
break;
}
}
{
var keys = curve.keys;
//Early out - if this is the first key on this curve just add it
if (keys.Length == 0)
{
curve.AddKey(keyframe);
return;
}
if (lastKey == null)
{
Debug.Log(string.Format("ERROR: NULL lastkey passed to AddKey when curve contains {0} keys", keys.Length));
return;
}
//Get the last keyframe
Keyframe lastKeyframe = keys[keys.Length - 1];
//If no TimelineKey is supplied, default to Linear curve
CurveType curveType = lastKey.CurveType;
switch (curveType)
{
case CurveType.Instant:
lastKeyframe.outTangent = 0;
curve.MoveKey(keys.Length - 1, lastKeyframe);
keyframe.inTangent = float.PositiveInfinity;
curve.AddKey(keyframe);
break;
case CurveType.Linear:
var val = (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
lastKeyframe.outTangent = val;
curve.MoveKey(keys.Length - 1, lastKeyframe);
keyframe.inTangent = val;
curve.AddKey(keyframe);
break;
case CurveType.Quadratic:
{
//Increase to cubic
var c1 = (2 * lastKey.CurveParams[0]) / 3;
var c2 = 1 - (2 * lastKey.CurveParams[0] + 1) / 3;
//Convert [0,1] into unity-acceptable tangents
c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
//Set the out tangent for the previous frame and update
lastKeyframe.outTangent = c1;
curve.MoveKey(keys.Length - 1, lastKeyframe);
//Set the in tangent for the current frame and add
keyframe.inTangent = c2;
curve.AddKey(keyframe);
break;
}
case CurveType.Cubic:
{
//Get curve parameters
var c1 = lastKey.CurveParams[0];
var c2 = 1 - lastKey.CurveParams[1];
//Convert [0,1] into unity-acceptable tangents
c1 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
c2 *= 3 * (keyframe.value - lastKeyframe.value) / (keyframe.time - lastKeyframe.time);
//Set the out tangent for the previous frame and update
lastKeyframe.outTangent = c1;
curve.MoveKey(keys.Length - 1, lastKeyframe);
//Set the in tangent for the current frame and add
keyframe.inTangent = c2;
curve.AddKey(keyframe);
break;
}
default:
Debug.LogWarning("CurveType " + curveType.ToString() + " not yet supported!");
break;
}
}