Синтаксис:
Используется csharp
void LateUpdate (){
if (Time.deltaTime == 0 || targetTransform == null || !targetTransform.gameObject.active)
return;
target = targetTransform.position;
// Remember initial directions of joints that should not be affected
Vector3[] jointDirections = new Vector3[nonAffectedJoints.Length];
for (float i=0; i<nonAffectedJoints.Length; i++) {
for (Transform child in nonAffectedJoints[i].joint) {
jointDirections[i] = child.position - nonAffectedJoints[i].joint.position;
break;
}
}
// Handle each segment
foreach(BendingSegment segment in segments) {
Transform t = segment.lastTransform;
if (overrideAnimation) {
for (i=segment.chainLength-1; i>=0; i--) {
t.localRotation = segment.origRotations[i];
t = t.parent;
}
}
Quaternion parentRot = segment.firstTransform.parent.rotation;
Quaternion parentRotInv = Quaternion.Inverse(parentRot);
// Desired look direction in world space
Vector3 lookDirWorld = (target - segment.lastTransform.position).normalized;
// Desired look directions in neck parent space
Vector3 lookDirGoal = (parentRotInv * lookDirWorld);
// Get the horizontal and vertical rotation angle to look at the target
float hAngle = AngleAroundAxis(
segment.referenceLookDir, lookDirGoal, segment.referenceUpDir
);
Vector3 rightOfTarget = Vector3.Cross(segment.referenceUpDir, lookDirGoal);
Vector3 lookDirGoalinHPlane =
lookDirGoal - Vector3.Project(lookDirGoal, segment.referenceUpDir);
float vAngle = AngleAroundAxis(
lookDirGoalinHPlane, lookDirGoal, rightOfTarget
);
// Handle threshold angle difference, bending multiplier,
// and max angle difference here
float hAngleThr = Mathf.Max(
0, Mathf.Abs(hAngle) - segment.thresholdAngleDifference
) * Mathf.Sign(hAngle);
float vAngleThr = Mathf.Max(
0, Mathf.Abs(vAngle) - segment.thresholdAngleDifference
) * Mathf.Sign(vAngle);
hAngle = Mathf.Max(
Mathf.Abs(hAngleThr) * Mathf.Abs(segment.bendingMultiplier),
Mathf.Abs(hAngle) - segment.maxAngleDifference
) * Mathf.Sign(hAngle) * Mathf.Sign(segment.bendingMultiplier);
vAngle = Mathf.Max(
Mathf.Abs(vAngleThr) * Mathf.Abs(segment.bendingMultiplier),
Mathf.Abs(vAngle) - segment.maxAngleDifference
) * Mathf.Sign(vAngle) * Mathf.Sign(segment.bendingMultiplier);
// Handle max bending angle here
hAngle = Mathf.Clamp(hAngle, -segment.maxBendingAngle, segment.maxBendingAngle);
vAngle = Mathf.Clamp(vAngle, -segment.maxBendingAngle, segment.maxBendingAngle);
Vector3 referenceRightDir =
Vector3.Cross(segment.referenceUpDir, segment.referenceLookDir);
// Lerp angles
segment.angleH = Mathf.Lerp(
segment.angleH, hAngle, Time.deltaTime * segment.responsiveness
);
segment.angleV = Mathf.Lerp(
segment.angleV, vAngle, Time.deltaTime * segment.responsiveness
);
// Get direction
lookDirGoal = Quaternion.AngleAxis(segment.angleH, segment.referenceUpDir)
* Quaternion.AngleAxis(segment.angleV, referenceRightDir)
* segment.referenceLookDir;
// Make look and up perpendicular
Vector3 upDirGoal = segment.referenceUpDir;
Vector3.OrthoNormalize(lookDirGoal, upDirGoal);
// Interpolated look and up directions in neck parent space
Vector3 lookDir = lookDirGoal;
segment.dirUp = Vector3.Slerp(segment.dirUp, upDirGoal, Time.deltaTime*5);
Vector3.OrthoNormalize(lookDir, segment.dirUp);
// Look rotation in world space
Quaternion lookRot = (
(parentRot * Quaternion.LookRotation(lookDir, segment.dirUp))
* Quaternion.Inverse(
parentRot * Quaternion.LookRotation(
segment.referenceLookDir, segment.referenceUpDir
)
)
);
// Distribute rotation over all joints in segment
Quaternion dividedRotation =
Quaternion.Slerp(Quaternion.identity, lookRot, effect / segment.chainLength);
t = segment.lastTransform;
for (i=0; i<segment.chainLength; i++) {
t.rotation = dividedRotation * t.rotation;
t = t.parent;
}
}
// Handle non affected joints
for (i=0; i<nonAffectedJoints.Length; i++) {
Vector3 newJointDirection = Vector3.zero;
for (Transform child in nonAffectedJoints[i].joint) {
newJointDirection = child.position - nonAffectedJoints[i].joint.position;
break;
}
Vector3 combinedJointDirection = Vector3.Slerp(
jointDirections[i], newJointDirection, nonAffectedJoints[i].effect
);
nonAffectedJoints[i].joint.rotation = Quaternion.FromToRotation(
newJointDirection, combinedJointDirection
) * nonAffectedJoints[i].joint.rotation;
}
}
if (Time.deltaTime == 0 || targetTransform == null || !targetTransform.gameObject.active)
return;
target = targetTransform.position;
// Remember initial directions of joints that should not be affected
Vector3[] jointDirections = new Vector3[nonAffectedJoints.Length];
for (float i=0; i<nonAffectedJoints.Length; i++) {
for (Transform child in nonAffectedJoints[i].joint) {
jointDirections[i] = child.position - nonAffectedJoints[i].joint.position;
break;
}
}
// Handle each segment
foreach(BendingSegment segment in segments) {
Transform t = segment.lastTransform;
if (overrideAnimation) {
for (i=segment.chainLength-1; i>=0; i--) {
t.localRotation = segment.origRotations[i];
t = t.parent;
}
}
Quaternion parentRot = segment.firstTransform.parent.rotation;
Quaternion parentRotInv = Quaternion.Inverse(parentRot);
// Desired look direction in world space
Vector3 lookDirWorld = (target - segment.lastTransform.position).normalized;
// Desired look directions in neck parent space
Vector3 lookDirGoal = (parentRotInv * lookDirWorld);
// Get the horizontal and vertical rotation angle to look at the target
float hAngle = AngleAroundAxis(
segment.referenceLookDir, lookDirGoal, segment.referenceUpDir
);
Vector3 rightOfTarget = Vector3.Cross(segment.referenceUpDir, lookDirGoal);
Vector3 lookDirGoalinHPlane =
lookDirGoal - Vector3.Project(lookDirGoal, segment.referenceUpDir);
float vAngle = AngleAroundAxis(
lookDirGoalinHPlane, lookDirGoal, rightOfTarget
);
// Handle threshold angle difference, bending multiplier,
// and max angle difference here
float hAngleThr = Mathf.Max(
0, Mathf.Abs(hAngle) - segment.thresholdAngleDifference
) * Mathf.Sign(hAngle);
float vAngleThr = Mathf.Max(
0, Mathf.Abs(vAngle) - segment.thresholdAngleDifference
) * Mathf.Sign(vAngle);
hAngle = Mathf.Max(
Mathf.Abs(hAngleThr) * Mathf.Abs(segment.bendingMultiplier),
Mathf.Abs(hAngle) - segment.maxAngleDifference
) * Mathf.Sign(hAngle) * Mathf.Sign(segment.bendingMultiplier);
vAngle = Mathf.Max(
Mathf.Abs(vAngleThr) * Mathf.Abs(segment.bendingMultiplier),
Mathf.Abs(vAngle) - segment.maxAngleDifference
) * Mathf.Sign(vAngle) * Mathf.Sign(segment.bendingMultiplier);
// Handle max bending angle here
hAngle = Mathf.Clamp(hAngle, -segment.maxBendingAngle, segment.maxBendingAngle);
vAngle = Mathf.Clamp(vAngle, -segment.maxBendingAngle, segment.maxBendingAngle);
Vector3 referenceRightDir =
Vector3.Cross(segment.referenceUpDir, segment.referenceLookDir);
// Lerp angles
segment.angleH = Mathf.Lerp(
segment.angleH, hAngle, Time.deltaTime * segment.responsiveness
);
segment.angleV = Mathf.Lerp(
segment.angleV, vAngle, Time.deltaTime * segment.responsiveness
);
// Get direction
lookDirGoal = Quaternion.AngleAxis(segment.angleH, segment.referenceUpDir)
* Quaternion.AngleAxis(segment.angleV, referenceRightDir)
* segment.referenceLookDir;
// Make look and up perpendicular
Vector3 upDirGoal = segment.referenceUpDir;
Vector3.OrthoNormalize(lookDirGoal, upDirGoal);
// Interpolated look and up directions in neck parent space
Vector3 lookDir = lookDirGoal;
segment.dirUp = Vector3.Slerp(segment.dirUp, upDirGoal, Time.deltaTime*5);
Vector3.OrthoNormalize(lookDir, segment.dirUp);
// Look rotation in world space
Quaternion lookRot = (
(parentRot * Quaternion.LookRotation(lookDir, segment.dirUp))
* Quaternion.Inverse(
parentRot * Quaternion.LookRotation(
segment.referenceLookDir, segment.referenceUpDir
)
)
);
// Distribute rotation over all joints in segment
Quaternion dividedRotation =
Quaternion.Slerp(Quaternion.identity, lookRot, effect / segment.chainLength);
t = segment.lastTransform;
for (i=0; i<segment.chainLength; i++) {
t.rotation = dividedRotation * t.rotation;
t = t.parent;
}
}
// Handle non affected joints
for (i=0; i<nonAffectedJoints.Length; i++) {
Vector3 newJointDirection = Vector3.zero;
for (Transform child in nonAffectedJoints[i].joint) {
newJointDirection = child.position - nonAffectedJoints[i].joint.position;
break;
}
Vector3 combinedJointDirection = Vector3.Slerp(
jointDirections[i], newJointDirection, nonAffectedJoints[i].effect
);
nonAffectedJoints[i].joint.rotation = Quaternion.FromToRotation(
newJointDirection, combinedJointDirection
) * nonAffectedJoints[i].joint.rotation;
}
}
пишет что ошибка в парсере