/** * when this node becomes relevant, it selects an animation from its list based on the rotation of * the given bone relative to the rotation of the owning actor * * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved. */ class UDKAnimNodeSequenceByBoneRotation extends AnimNodeSequence; /** bone whose direction should be tested */ var() name BoneName; /** axis of that bone to check */ var() EAxis BoneAxis; /** list of animations to choose from */ struct AnimByRotation { /** desired rotation of the bone to play this animation */ var() rotator DesiredRotation; /** the animation to play */ var() name AnimName; }; var() array AnimList; event OnBecomeRelevant() { local vector BoneDirection; local int i; local float Diff, BestDiff; local name BestAnim; if (SkelComponent.Owner == None) { `warn("SkeletalMeshComponent has no Owner"); } else if (BoneAxis == AXIS_NONE || BoneAxis == AXIS_BLANK) { `warn("Invalid Axis specified"); } else { // get the bone's rotation relative to the owning actor BoneDirection = SkelComponent.GetBoneAxis(BoneName, BoneAxis) >> SkelComponent.Owner.Rotation; // find the animation in the list whose rotation is closest to the bone's BestDiff = -1.0; for (i = 0; i < AnimList.length; i++) { Diff = BoneDirection Dot vector(AnimList[i].DesiredRotation); if (Diff > BestDiff) { BestAnim = AnimList[i].AnimName; BestDiff = Diff; } } // set to the best animation and make sure it starts from the beginning SetAnim(BestAnim); SetPosition(0.0f, false); } } defaultproperties { BoneAxis=AXIS_X bCallScriptEventOnBecomeRelevant=TRUE }