You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
3.0 KiB
C#
75 lines
3.0 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace MalbersAnimations.Weapons
|
|
{
|
|
[CreateAssetMenu(menuName = "Malbers Animations/Weapons/Gun Combat IK")]
|
|
public class GunCombatIK : OldIKProfile
|
|
{
|
|
private static readonly Keyframe[] KeyFrames = { new Keyframe(0, 0.61f), new Keyframe(1.25f, 0.61f), new Keyframe(2, 0.4f) };
|
|
|
|
[Space]
|
|
public Vector3 RightHandOffset;
|
|
public Vector3 LeftHandOffset;
|
|
public float Smoothness = 2;
|
|
public float HandDistance = 1;
|
|
public AnimationCurve HandIKDistance = new AnimationCurve(KeyFrames);
|
|
|
|
|
|
public override void OnAnimator_IK(IMWeaponOwner RC)
|
|
{
|
|
float DeltaTime = RC.Anim.updateMode == AnimatorUpdateMode.AnimatePhysics ? Time.fixedDeltaTime : Time.deltaTime;
|
|
|
|
bool isRightHand = RC.Weapon.IsRightHanded;
|
|
Vector3 RayOrigin = isRightHand ? RC.RightShoulder.position : RC.LeftShoulder.position;
|
|
Vector3 AimDirection = RC.AimDirection;
|
|
|
|
Ray RayHand = new Ray(RayOrigin, AimDirection);
|
|
|
|
Debug.DrawRay(RayHand.origin, RayHand.direction * 20, Color.clear);
|
|
|
|
RC.WeaponIKW = Mathf.MoveTowards(RC.WeaponIKW, RC.Aim ? 1 : 0, DeltaTime * Smoothness);
|
|
// RC.IKWeight = RC.Aim ? 1:0 ;
|
|
|
|
var Action = Mathf.Abs(RC.WeaponAction);
|
|
if (Action == WA.Reload) RC.WeaponIKW = 0;
|
|
var HandIK = 1;
|
|
if (Action == WA.Fire_Projectile) HandIK = 0;
|
|
|
|
|
|
if (HandIK != 0)
|
|
{
|
|
float Hand_Distance = isRightHand ? HandIKDistance.Evaluate(RC.HorizontalAngle) : HandIKDistance.Evaluate(-RC.HorizontalAngle); //Values for the Distance of the Arm while rotating
|
|
|
|
Hand_Distance *= HandDistance;
|
|
|
|
//Vector3 LookDirection = RC.MainCamera.transform.forward;
|
|
//Vector3 HandPosition = isRightHand ? RC.RightHand.position : RC.LeftHand.position;
|
|
Vector3 HandOffset = isRightHand ? RightHandOffset : LeftHandOffset;
|
|
|
|
Vector3 IKPoint = RayHand.GetPoint(Hand_Distance);
|
|
//Vector3 LookDirectionFromHand = (RC.Aimer.AimHit.point - HandPosition).normalized;
|
|
|
|
var HandRotation =
|
|
Quaternion.LookRotation(AimDirection) * Quaternion.Euler(HandOffset); //Set the Aim Look Rotation for the Right or Left Hand
|
|
|
|
var ikGoal = isRightHand ? AvatarIKGoal.RightHand : AvatarIKGoal.LeftHand; //Set the IK goal acording the Right or Left Hand
|
|
|
|
//Arm IK
|
|
RC.Anim.SetIKPosition(ikGoal, IKPoint);
|
|
RC.Anim.SetIKPositionWeight(ikGoal, HandIK);
|
|
|
|
RC.Anim.SetIKRotation(ikGoal, HandRotation);
|
|
RC.Anim.SetIKRotationWeight(ikGoal, HandIK);
|
|
}
|
|
|
|
|
|
if (RC.WeaponIKW != 0 && RC.Aim)
|
|
{
|
|
//HeadIK
|
|
RC.Anim.SetLookAtPosition(RayHand.GetPoint(10));
|
|
RC.Anim.SetLookAtWeight(1 * RC.WeaponIKW, 0.1f * RC.WeaponIKW , 1 * RC.WeaponIKW);
|
|
}
|
|
}
|
|
}
|
|
} |