Announcement

Collapse
No announcement yet.

Turn Left and Turn Right Animations with BlendSpace

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

    Turn Left and Turn Right Animations with BlendSpace

    Hello,
    i have tried to make a BlendSpace. The goal is, that when the Ai from my Character goes Right, then the Blendspace or the BP should play the Turn Right Animation. But i won't work.

    Here are my Setting from the BlendSpace:
    Click image for larger version

Name:	Blend_Space.png
Views:	1
Size:	664.5 KB
ID:	1169410

    Here are my Setting from the AnimBP:
    Click image for larger version

Name:	AnimBP.png
Views:	1
Size:	594.0 KB
ID:	1169416

    I get a Error in the BP but i don't understand this Error-Message.

    Can someone please help me?
    Kind regards,
    halobungie
    Attached Files
    Last edited by halobungie; 12-30-2015, 12:28 PM.

    #2
    Hello,
    in this video you can see the Problem:
    https://www.youtube.com/watch?v=hCNkAgysEho

    There aren't smooth Turn's. But i have some good Turn-Left and Turn-Right Animations.

    Did someone know the solution how i can Play this (Turn-Left and Turn-Right)-Animations if the Spider goes left or Right?

    Kind regards,
    halobungie

    Comment


      #3
      On the character be sure to disable Use Controller Rotation Yaw. This is a property of ACharacter in C++ and in blueprint can be found by clicking the character itself.

      Also not sure why you're trying to cast to the anim blueprint there if you're already in the anim blueprint. Hard to see but it looks like you're trying to cast Get Pawn Owner to the Anim Blueprint which would in fact always fail. You already are in the anim blueprint and have a reference to self. The pawn owner is the ACharacter instance driving the blueprint.

      I did some things in C++ for my character and it includes aim offsets as well so they can aim around while standing without triggering a turn in place animation. This should be doable in blueprint as well.
      It works pretty well but I'm still working on smoothing it out a bit more.

      It works for a human controlled player and I think would work for an AI player as well if AI also calls FaceRotation;

      In the .h file
      Code:
              virtual void FaceRotation(FRotator NewControlRotation, float DeltaTime) override;
      
              /** get aim offsets */
      	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Animation)
      	FRotator GetAimOffsets() const;
      
              UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Animation)
      	float GetLeftMaxAimYawOffset() const;
      
      	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = Animation)
      	float GetRightMaxAimYawOffset() const;
      
      	UPROPERTY(BlueprintReadWrite, Category = Animation)
      	float DesiredYaw;
      
              //This is the value that is read in the animation blueprint to drive the turn in place blendspace
              //Still working on tweaking this, I currently have to multiply this by 10 in the anim blueprint to have it show up and it's not quite 100% right yet
      	UPROPERTY(BlueprintReadWrite, Category = Animation)
      	float YawSpeed;
      In the .cpp file
      Code:
      float AWRCharacter::GetLeftMaxAimYawOffset_Implementation() const
      {
      	//TODO: get this from the weapon.  Some weapons may want to limit this so when you look down your gun isn't clipping through your legs.
      	return 45.f;                 //My aim offsets are designed for 90 degrees but I limit it to 45 since the character is usually positioned very awkwardly and it's only there for the information
              //just use a value of 0 or don't even implement this function at all for characters like your spider which has no aim offsets
      }
      
      float AWRCharacter::GetRightMaxAimYawOffset_Implementation() const
      {
      	//TODO: get this from the weapon.  Some weapons may want to limit this so when you look down your gun isn't clipping through your legs.
      	return 45.f;                 //My aim offsets are designed for 90 degrees but I limit it to 45 since the character is usually positioned very awkwardly and it's only there for the information
              //just use a value of 0 or don't even implement this function at all for characters like your spider which has no aim offsets
      }
      
      //This was taken straight from the First Person Shooter example
      FRotator AWRCharacter::GetAimOffsets_Implementation() const
      {
      	const FVector AimDirWS = GetControlRotation().Vector();
      	const FVector AimDirLS = ActorToWorld().InverseTransformVectorNoScale(AimDirWS);
      	const FRotator AimRotLS = AimDirLS.Rotation();
      
      	return AimRotLS;
      }
      
      //This is an overridden function
      void AWRCharacter::FaceRotation(FRotator NewControlRotation, float DeltaTime)
      {
      	//if not standing still, always make yaw equal rotation
      	bool bStandingOnGround = false;
      	float InterpSpeed = 3.f;
      	float LastYaw = GetActorRotation().Yaw;
      	NewControlRotation.Yaw = FMath::UnwindDegrees(NewControlRotation.Yaw);
      
      	FRotator CurrentRot(GetActorRotation());
      
      	if (GetCharacterMovement()->IsMovingOnGround())
      	{
      		FVector2D HorzVelocity(GetVelocity());
      		if (HorzVelocity.SizeSquared() == 0.f)
      		{
      			bStandingOnGround = true;
      
      			float CurrentYawOffset = GetAimOffsets().Yaw;
      
      			//make character turn in place if twisted too far
      			if (CurrentYawOffset > GetRightMaxAimYawOffset())
      			{
      				CurrentRot.Yaw = FMath::UnwindDegrees(CurrentRot.Yaw + CurrentYawOffset - GetRightMaxAimYawOffset());
      				DesiredYaw = NewControlRotation.Yaw;
      			}
      			else if(-CurrentYawOffset > GetLeftMaxAimYawOffset())
      			{
      				CurrentRot.Yaw = FMath::UnwindDegrees(CurrentRot.Yaw + CurrentYawOffset + GetLeftMaxAimYawOffset());
      				DesiredYaw = NewControlRotation.Yaw;
      			}
      		}
      	}
      	
      	if (!bStandingOnGround)
      	{
      		DesiredYaw = NewControlRotation.Yaw;
      		InterpSpeed = 8.f;
      	}
      
      	FRotator DesiredRot(CurrentRot);
      	DesiredRot.Yaw = DesiredYaw;
      
      	if (!FMath::IsNearlyEqual(LastYaw, DesiredYaw, 2.0f))
      	{
      		SetActorRotation(FMath::RInterpTo(CurrentRot, DesiredRot, DeltaTime, InterpSpeed));
      
      		//first find shortest delta angle
      		YawSpeed = FMath::RadiansToDegrees(FMath::FindDeltaAngle(FMath::DegreesToRadians(LastYaw), FMath::DegreesToRadians(GetActorRotation().Yaw)));
      	}
      	else
      	{
      		SetActorRotation(DesiredRot);
      		YawSpeed = 0.f;
      	}
      }
      Last edited by illYay; 01-02-2016, 05:46 PM.

      Comment

      Working...
      X