├── .gitattributes ├── .gitignore ├── Content ├── BoneData │ ├── BD_Disable_Arm_Both.uasset │ ├── BD_Disable_Arm_L.uasset │ ├── BD_Disable_Arm_R.uasset │ ├── BD_Disable_Hand_Both.uasset │ ├── BD_Disable_Hand_L.uasset │ ├── BD_Disable_Hand_R.uasset │ ├── BD_Disable_Leg_Both.uasset │ ├── BD_Disable_Leg_L.uasset │ └── BD_Disable_Leg_R.uasset ├── Demo │ ├── Characters │ │ ├── Mannequin_UE4 │ │ │ ├── Animations │ │ │ │ └── Jog_Fwd.uasset │ │ │ ├── Materials │ │ │ │ ├── Layers │ │ │ │ │ ├── ML_Latex_Black.uasset │ │ │ │ │ ├── ML_ShinyPlastic_Beige.uasset │ │ │ │ │ ├── ML_ShinyPlastic_Beige_Logo.uasset │ │ │ │ │ └── ML_SoftMetal.uasset │ │ │ │ ├── M_MannequinUE4_Body.uasset │ │ │ │ └── M_MannequinUE4_ChestLogo.uasset │ │ │ ├── Meshes │ │ │ │ ├── SK_Mannequin.uasset │ │ │ │ ├── SK_Mannequin_PhysicsAsset.uasset │ │ │ │ └── SK_Mannequin_Skeleton.uasset │ │ │ ├── Rigs │ │ │ │ ├── IK_UE4_Mannequin.uasset │ │ │ │ ├── RTG_UE4Manny_UE5Manny.uasset │ │ │ │ └── RTG_UE5Manny_UE4Manny.uasset │ │ │ └── Textures │ │ │ │ ├── T_ML_Aluminum01.uasset │ │ │ │ ├── T_ML_Aluminum01_N.uasset │ │ │ │ ├── T_ML_Rubber_Blue_01_D.uasset │ │ │ │ ├── T_ML_Rubber_Blue_01_N.uasset │ │ │ │ ├── T_UE4_Mannequin_MAT_MASKA.uasset │ │ │ │ ├── T_UE4_Mannequin__normals.uasset │ │ │ │ ├── T_UELogo_Mask.uasset │ │ │ │ └── T_UELogo_N_TGA.uasset │ │ ├── Mannequins │ │ │ ├── Animations │ │ │ │ ├── ABP_Manny.uasset │ │ │ │ ├── ABP_Quinn.uasset │ │ │ │ ├── Manny │ │ │ │ │ ├── BS_MM_WalkRun.uasset │ │ │ │ │ ├── MM_Fall_Loop.uasset │ │ │ │ │ ├── MM_Idle.uasset │ │ │ │ │ ├── MM_Jump.uasset │ │ │ │ │ ├── MM_Land.uasset │ │ │ │ │ ├── MM_Run_Fwd.uasset │ │ │ │ │ ├── MM_T_Pose.uasset │ │ │ │ │ ├── MM_Walk_Fwd.uasset │ │ │ │ │ └── MM_Walk_InPlace.uasset │ │ │ │ └── Quinn │ │ │ │ │ ├── BS_MF_Unarmed_WalkRun.uasset │ │ │ │ │ ├── MF_Idle.uasset │ │ │ │ │ ├── MF_Run_Fwd.uasset │ │ │ │ │ └── MF_Walk_Fwd.uasset │ │ │ ├── Materials │ │ │ │ ├── Functions │ │ │ │ │ ├── CA_Mannequin.uasset │ │ │ │ │ ├── ChromaticCurve.uasset │ │ │ │ │ ├── MF_Diffraction.uasset │ │ │ │ │ ├── MF_logo3layers.uasset │ │ │ │ │ └── ML_BaseColorFallOff.uasset │ │ │ │ ├── Instances │ │ │ │ │ ├── Manny │ │ │ │ │ │ ├── MI_Manny_01.uasset │ │ │ │ │ │ └── MI_Manny_02.uasset │ │ │ │ │ └── Quinn │ │ │ │ │ │ ├── MI_Quinn_01.uasset │ │ │ │ │ │ └── MI_Quinn_02.uasset │ │ │ │ └── M_Mannequin.uasset │ │ │ ├── Meshes │ │ │ │ ├── Mannequin_LODSettings.uasset │ │ │ │ ├── SKM_Manny.uasset │ │ │ │ ├── SKM_Manny_Simple.uasset │ │ │ │ ├── SKM_Quinn.uasset │ │ │ │ ├── SKM_Quinn_Simple.uasset │ │ │ │ └── SK_Mannequin.uasset │ │ │ ├── Rigs │ │ │ │ ├── ABP_Manny_PostProcess.uasset │ │ │ │ ├── ABP_Quinn_PostProcess.uasset │ │ │ │ ├── CR_Mannequin_BasicFootIK.uasset │ │ │ │ ├── CR_Mannequin_Body.uasset │ │ │ │ ├── CR_Mannequin_Procedural.uasset │ │ │ │ ├── IK_Mannequin.uasset │ │ │ │ ├── PA_Mannequin.uasset │ │ │ │ ├── Poses │ │ │ │ │ ├── Manny │ │ │ │ │ │ ├── Manny_calf_l_anim.uasset │ │ │ │ │ │ ├── Manny_calf_l_pose.uasset │ │ │ │ │ │ ├── Manny_calf_r_anim.uasset │ │ │ │ │ │ ├── Manny_calf_r_pose.uasset │ │ │ │ │ │ ├── Manny_clavicle_l_anim.uasset │ │ │ │ │ │ ├── Manny_clavicle_l_pose.uasset │ │ │ │ │ │ ├── Manny_clavicle_r_anim.uasset │ │ │ │ │ │ ├── Manny_clavicle_r_pose.uasset │ │ │ │ │ │ ├── Manny_foot_l_anim.uasset │ │ │ │ │ │ ├── Manny_foot_l_pose.uasset │ │ │ │ │ │ ├── Manny_foot_r_anim.uasset │ │ │ │ │ │ ├── Manny_foot_r_pose.uasset │ │ │ │ │ │ ├── Manny_hand_l_anim.uasset │ │ │ │ │ │ ├── Manny_hand_l_pose.uasset │ │ │ │ │ │ ├── Manny_hand_r_anim.uasset │ │ │ │ │ │ ├── Manny_hand_r_pose.uasset │ │ │ │ │ │ ├── Manny_lowerarm_l_anim.uasset │ │ │ │ │ │ ├── Manny_lowerarm_l_pose.uasset │ │ │ │ │ │ ├── Manny_lowerarm_r_anim.uasset │ │ │ │ │ │ ├── Manny_lowerarm_r_pose.uasset │ │ │ │ │ │ ├── Manny_thigh_l_anim.uasset │ │ │ │ │ │ ├── Manny_thigh_l_pose.uasset │ │ │ │ │ │ ├── Manny_thigh_r_anim.uasset │ │ │ │ │ │ ├── Manny_thigh_r_pose.uasset │ │ │ │ │ │ ├── Manny_upperarm_l_anim.uasset │ │ │ │ │ │ ├── Manny_upperarm_l_pose.uasset │ │ │ │ │ │ ├── Manny_upperarm_r_anim.uasset │ │ │ │ │ │ └── Manny_upperarm_r_pose.uasset │ │ │ │ │ └── Quinn │ │ │ │ │ │ ├── Quinn_calf_l_anim.uasset │ │ │ │ │ │ ├── Quinn_calf_l_pose.uasset │ │ │ │ │ │ ├── Quinn_calf_r_anim.uasset │ │ │ │ │ │ ├── Quinn_calf_r_pose.uasset │ │ │ │ │ │ ├── Quinn_clavicle_l_anim.uasset │ │ │ │ │ │ ├── Quinn_clavicle_l_pose.uasset │ │ │ │ │ │ ├── Quinn_clavicle_r_anim.uasset │ │ │ │ │ │ ├── Quinn_clavicle_r_pose.uasset │ │ │ │ │ │ ├── Quinn_foot_l_anim.uasset │ │ │ │ │ │ ├── Quinn_foot_l_pose.uasset │ │ │ │ │ │ ├── Quinn_foot_r_anim.uasset │ │ │ │ │ │ ├── Quinn_foot_r_pose.uasset │ │ │ │ │ │ ├── Quinn_hand_l_anim.uasset │ │ │ │ │ │ ├── Quinn_hand_l_pose.uasset │ │ │ │ │ │ ├── Quinn_hand_r_anim.uasset │ │ │ │ │ │ ├── Quinn_hand_r_pose.uasset │ │ │ │ │ │ ├── Quinn_lowerarm_l_anim.uasset │ │ │ │ │ │ ├── Quinn_lowerarm_l_pose.uasset │ │ │ │ │ │ ├── Quinn_lowerarm_r_anim.uasset │ │ │ │ │ │ ├── Quinn_lowerarm_r_pose.uasset │ │ │ │ │ │ ├── Quinn_thigh_l_anim.uasset │ │ │ │ │ │ ├── Quinn_thigh_l_pose.uasset │ │ │ │ │ │ ├── Quinn_thigh_r_anim.uasset │ │ │ │ │ │ ├── Quinn_thigh_r_pose.uasset │ │ │ │ │ │ ├── Quinn_upperarm_l_anim.uasset │ │ │ │ │ │ ├── Quinn_upperarm_l_pose.uasset │ │ │ │ │ │ ├── Quinn_upperarm_r_anim.uasset │ │ │ │ │ │ └── Quinn_upperarm_r_pose.uasset │ │ │ │ └── RTG_Mannequin.uasset │ │ │ └── Textures │ │ │ │ ├── Manny │ │ │ │ ├── T_Manny_01_ASAOPMASK_MSK.uasset │ │ │ │ ├── T_Manny_01_BN.uasset │ │ │ │ ├── T_Manny_01_CCRCCPlastic_MSK.uasset │ │ │ │ ├── T_Manny_01_D.uasset │ │ │ │ ├── T_Manny_01_MSR_MSK.uasset │ │ │ │ ├── T_Manny_01_N.uasset │ │ │ │ ├── T_Manny_01_Tan.uasset │ │ │ │ ├── T_Manny_02_ASAOPMASK_MSK.uasset │ │ │ │ ├── T_Manny_02_BN.uasset │ │ │ │ ├── T_Manny_02_CCRCCPlastic_MSK.uasset │ │ │ │ ├── T_Manny_02_D.uasset │ │ │ │ ├── T_Manny_02_MSR_MSK.uasset │ │ │ │ ├── T_Manny_02_N.uasset │ │ │ │ └── T_Manny_02_Tan.uasset │ │ │ │ ├── Quinn │ │ │ │ ├── T_Quinn_01ID_BN.uasset │ │ │ │ ├── T_Quinn_01ID_D.uasset │ │ │ │ ├── T_Quinn_01ID_MSR_MSK.uasset │ │ │ │ ├── T_Quinn_01ID_N.uasset │ │ │ │ ├── T_Quinn_01ID_Tan.uasset │ │ │ │ ├── T_Quinn_01_ASAOMASK_MSK.uasset │ │ │ │ ├── T_Quinn_01_CCRCCPlastic_MSK.uasset │ │ │ │ ├── T_Quinn_02ID_BN.uasset │ │ │ │ ├── T_Quinn_02ID_D.uasset │ │ │ │ ├── T_Quinn_02ID_MSR_MSK.uasset │ │ │ │ ├── T_Quinn_02ID_N.uasset │ │ │ │ ├── T_Quinn_02ID_Tan.uasset │ │ │ │ ├── T_Quinn_02_ASAOMASK_MSK.uasset │ │ │ │ └── T_Quinn_02_CCRCCPlastic_MSK.uasset │ │ │ │ └── Shared │ │ │ │ └── T_UE_Logo_M.uasset │ │ ├── TargetDummy │ │ │ ├── ABP_TargetDummy.uasset │ │ │ ├── Animations │ │ │ │ ├── AM_TargetDummy_Attack.uasset │ │ │ │ ├── ANS_TargetDummy.uasset │ │ │ │ ├── TargetDummy_Attack_L.uasset │ │ │ │ ├── TargetDummy_Attack_R.uasset │ │ │ │ └── TargetDummy_Idle.uasset │ │ │ ├── MI_TargetDummy.uasset │ │ │ ├── M_TargetDummy.uasset │ │ │ ├── PHAT_TargetDummy.uasset │ │ │ ├── SKM_TargetDummy.uasset │ │ │ └── SK_TargetDummy.uasset │ │ └── Turret │ │ │ ├── Animations │ │ │ └── ABP_Turret.uasset │ │ │ ├── Meshes │ │ │ ├── SKM_Dolly.uasset │ │ │ ├── SKM_Turret.uasset │ │ │ ├── SK_Dolly.uasset │ │ │ └── SK_Turret.uasset │ │ │ └── Rigs │ │ │ ├── CR_Turret.uasset │ │ │ ├── PA_Dolly.uasset │ │ │ └── PA_Turret.uasset │ ├── LevelPrototyping │ │ ├── BP_DemoTrigger.uasset │ │ ├── BP_DemoTrigger_Gather.uasset │ │ ├── BP_DemoTrigger_RateOfFire.uasset │ │ ├── M_BorderCircle.uasset │ │ ├── Materials │ │ │ ├── MF_ProcGrid.uasset │ │ │ ├── MI_PrototypeGrid_Gray.uasset │ │ │ ├── MI_PrototypeGrid_Gray_02.uasset │ │ │ ├── MI_PrototypeGrid_TopDark.uasset │ │ │ ├── MI_Solid_Blue.uasset │ │ │ ├── M_PrototypeGrid.uasset │ │ │ └── M_Solid.uasset │ │ ├── Meshes │ │ │ ├── SM_ChamferCube.uasset │ │ │ ├── SM_Cube.uasset │ │ │ ├── SM_Cylinder.uasset │ │ │ ├── SM_QuarterCylinder.uasset │ │ │ └── SM_Ramp.uasset │ │ ├── T_BorderCircle.uasset │ │ └── Textures │ │ │ └── T_GridChecker_A.uasset │ └── ThirdPerson │ │ ├── Blueprints │ │ ├── BP_HitReact.uasset │ │ ├── BP_ProcCharacter.uasset │ │ ├── BP_ProcGameMode.uasset │ │ ├── BP_TargetDummy.uasset │ │ ├── ProcDemoGatherInterface.uasset │ │ └── Turret │ │ │ ├── BP_Projectile.uasset │ │ │ ├── BP_Turret.uasset │ │ │ ├── HRP_Turret.uasset │ │ │ └── Niagara │ │ │ ├── NS_Impact.uasset │ │ │ ├── NS_MuzzleFlash.uasset │ │ │ └── NS_Projectile.uasset │ │ ├── Input │ │ ├── Actions │ │ │ ├── IA_Jump.uasset │ │ │ ├── IA_Look.uasset │ │ │ └── IA_Move.uasset │ │ └── IMC_Default.uasset │ │ └── Maps │ │ ├── ThirdPersonMap.umap │ │ └── ThirdPersonMap_BuiltData.uasset ├── Profiles │ ├── HRP_BumpPawn.uasset │ ├── HRP_Flop.uasset │ ├── HRP_Melee.uasset │ ├── HRP_Shot.uasset │ └── HRP_Twitch.uasset ├── __ExternalActors__ │ └── Demo │ │ └── ThirdPerson │ │ └── Maps │ │ └── ThirdPersonMap │ │ ├── 0 │ │ ├── OU │ │ │ └── V8W7EAV4PE8HYLYHWE1BFG.uasset │ │ └── YK │ │ │ └── O8E9V9IDTRXF1ETZH9OOHJ.uasset │ │ ├── 1 │ │ ├── L4 │ │ │ └── JMTTG3MWOLLOTLPAHXQHYY.uasset │ │ └── ZF │ │ │ └── F9G3LWUOD7FZUVWSDBE38Y.uasset │ │ ├── 2 │ │ ├── E7 │ │ │ └── ILVQ4NVQJ8BBLBT4ZEX6YP.uasset │ │ ├── IM │ │ │ └── KN2TFLL64RPMWHY0Q8RUZ5.uasset │ │ ├── PJ │ │ │ └── MHZSVHCYGNHN41G0IRBK6O.uasset │ │ └── X2 │ │ │ └── 33S0YQO88EK32OL5YL3O75.uasset │ │ ├── 5 │ │ ├── 92 │ │ │ └── 4XGTOV24YATY0FVC9GJJIC.uasset │ │ └── D4 │ │ │ └── RW9D2RBUGBR4ZLG3LY847P.uasset │ │ ├── 6 │ │ ├── BX │ │ │ └── XE9V76PIYYD9HR60CIWO07.uasset │ │ ├── DE │ │ │ └── Z5DOE7DWG12GZ6RDLX8M3Z.uasset │ │ └── DI │ │ │ └── OH1XK318WTJ2ZF2ZI5M57T.uasset │ │ ├── 7 │ │ ├── 2A │ │ │ └── W9IF8HM1VI7NYT2VBJNI01.uasset │ │ ├── 2S │ │ │ └── J3F0PQCUXA1SRVA5TW5TWH.uasset │ │ ├── 5X │ │ │ └── R92IWXHMSMYU133H31ESEB.uasset │ │ ├── AQ │ │ │ └── PWJD3YWQOKLF9IH9ZAPOS7.uasset │ │ ├── PN │ │ │ └── K4ERFCTA6OD46HO1684V9I.uasset │ │ ├── SA │ │ │ └── Q96MZTFYX26H3AJTA19OJW.uasset │ │ ├── SX │ │ │ └── TAHSYHQGXS8GAC7N204KIJ.uasset │ │ └── VW │ │ │ └── 0TDJFG734G8RPIAL4EHWLZ.uasset │ │ ├── 8 │ │ ├── 12 │ │ │ └── 4MHTVI1KLYNA3W1933ZTUC.uasset │ │ ├── 52 │ │ │ └── D0TFNJXJI8UM40XUUF5Y58.uasset │ │ ├── 0V │ │ │ └── ROO2Z7CKT0QK8VCSJZMJZU.uasset │ │ ├── 7F │ │ │ └── UCIHEW9XQMILGO2E11UW5L.uasset │ │ ├── EU │ │ │ └── XWS7JVMTJFGIHIPRLHJ8PW.uasset │ │ └── V8 │ │ │ └── SQZ03RME7YXIXAGFU1K2IS.uasset │ │ ├── 9 │ │ ├── 63 │ │ │ └── VZGJK44VD8ED6FZZD60SUS.uasset │ │ ├── 3H │ │ │ └── 3VK59LR2KF9O27WHI3U7A6.uasset │ │ ├── A0 │ │ │ └── J61NKK9S0NAWRLKYWMS346.uasset │ │ └── VS │ │ │ └── WR24AO0I8ISOTKXAQIR00Q.uasset │ │ ├── A │ │ └── YJ │ │ │ └── D0PC47YR5IP0I94DVGO84V.uasset │ │ ├── B │ │ ├── 54 │ │ │ └── XSVB99TPKWX6Q8Q8HESA2S.uasset │ │ ├── 0S │ │ │ └── 4YQLX9QS87U2KPKK5NW68J.uasset │ │ └── IK │ │ │ └── 7WWTAITBNZECNYGDTM2RDV.uasset │ │ ├── C │ │ ├── 6R │ │ │ └── E3F86GZFY81HSQ7Y6DGO04.uasset │ │ ├── 8Q │ │ │ └── 6KDRD5560AXASK2GXOK40W.uasset │ │ ├── 8T │ │ │ └── H0XS3LMV9E0WYBTW9K1OPI.uasset │ │ ├── BZ │ │ │ └── C6OTQI7E8LDKE0YXQOAHUK.uasset │ │ ├── EX │ │ │ └── EE9BN6JN24AQUFTYCF6S4J.uasset │ │ ├── HE │ │ │ └── U5SSMJ6TPIZNNXFQIFBNST.uasset │ │ ├── KS │ │ │ └── 9BWVBUY4TNURUGRVJ0TA9S.uasset │ │ ├── U0 │ │ │ └── V8ZE42CWEWWBMJ2ZKTH4YK.uasset │ │ ├── WR │ │ │ └── E0NJBC8FHWRYXUN44XM1BH.uasset │ │ └── Z3 │ │ │ └── 091YTWFTT7XU7ZF747Y7FY.uasset │ │ ├── D │ │ ├── 6C │ │ │ └── DL7STRHC35TRLWM4IZD3RS.uasset │ │ ├── 7Q │ │ │ └── P7EW8Y5BX8XFCB3Y7RADS9.uasset │ │ ├── H0 │ │ │ └── CZ8CUPGLOZAL0W84HKMNJX.uasset │ │ └── VA │ │ │ └── Y4HEDMA9MQR327W2NV57QY.uasset │ │ └── E │ │ ├── 2M │ │ └── DNB29QR322TMHBW51XPORF.uasset │ │ └── FU │ │ └── 62YK1IOKUG4KNGE5WB8AMZ.uasset └── __ExternalObjects__ │ └── Demo │ └── ThirdPerson │ └── Maps │ └── ThirdPersonMap │ ├── 1 │ └── WD │ │ └── JMFTTL7B7WOZUFNU8LO50D.uasset │ ├── 3 │ └── YN │ │ └── MY59M61W68VQP3F6OWN0TT.uasset │ ├── 4 │ ├── 66 │ │ └── AX9BIEAQ4U3T7EHENMDV8L.uasset │ └── BD │ │ └── 2YIHOUJBBHV3NCBKDV6OA8.uasset │ ├── A │ └── 64 │ │ └── ESHYDG1072464R441J7N3K.uasset │ └── B │ └── QN │ └── 7AH46JIG06NFTE1QH5GMVW.uasset ├── LICENSE ├── ProcHitReact.uplugin ├── README.md ├── Resources ├── Icon128.png └── Icon256.png └── Source ├── ProcHitReact ├── Private │ ├── HitReact.cpp │ ├── HitReactProfile.cpp │ ├── HitReactStatics.cpp │ ├── HitReactTags.cpp │ ├── HitReactTypes.cpp │ ├── Params │ │ ├── HitReactImpulse.cpp │ │ └── HitReactTrigger.cpp │ ├── Physics │ │ ├── HitReactPhysics.cpp │ │ └── HitReactPhysicsState.cpp │ ├── ProcHitReact.cpp │ └── ThirdParty │ │ └── AsyncMixinProc.cpp ├── ProcHitReact.Build.cs └── Public │ ├── HitReact.h │ ├── HitReactBoneData.h │ ├── HitReactProfile.h │ ├── HitReactStatics.h │ ├── HitReactTags.h │ ├── HitReactTypes.h │ ├── Params │ ├── HitReactImpulse.h │ ├── HitReactParams.h │ └── HitReactTrigger.h │ ├── Physics │ ├── HitReactPhysics.h │ └── HitReactPhysicsState.h │ ├── ProcHitReact.h │ ├── System │ └── HitReactVersioning.h │ └── ThirdParty │ └── AsyncMixinProc.h └── ProcHitReactEditor ├── Private ├── HitReactDetailsCustomization.cpp ├── HitReactDetailsCustomization.h └── ProcHitReactEditor.cpp ├── ProcHitReactEditor.Build.cs └── Public └── ProcHitReactEditor.h /.gitattributes: -------------------------------------------------------------------------------- 1 | *.tif filter=lfs diff=lfs merge=lfs -text 2 | *.cubemap filter=lfs diff=lfs merge=lfs -text 3 | *.tga filter=lfs diff=lfs merge=lfs -text 4 | *.png filter=lfs diff=lfs merge=lfs -text 5 | *.raw filter=lfs diff=lfs merge=lfs -text 6 | *.wav filter=lfs diff=lfs merge=lfs -text 7 | *.psd filter=lfs diff=lfs merge=lfs -text 8 | *.mov filter=lfs diff=lfs merge=lfs -text 9 | *.mb filter=lfs diff=lfs merge=lfs -text 10 | *.duf filter=lfs diff=lfs merge=lfs -text 11 | *.jpg filter=lfs diff=lfs merge=lfs -text 12 | *.hdr filter=lfs diff=lfs merge=lfs -text 13 | *.bin.fbx filter=lfs diff=lfs merge=lfs -text 14 | 15 | *.uasset filter=lfs diff=lfs merge=lfs -text 16 | *.umap filter=lfs diff=lfs merge=lfs -text 17 | *.upk filter=lfs diff=lfs merge=lfs -text 18 | *.udk filter=lfs diff=lfs merge=lfs -text 19 | *.sh text eol=lf 20 | 21 | *.dll filter=lfs diff=lfs merge=lfs -text -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | DerivedDataCache 2 | Saved 3 | Script 4 | Intermediate 5 | Binaries 6 | .idea 7 | .vs 8 | *.sln -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Arm_Both.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6ca4e70a6cd8cc80a61c49a32f68a66d8d52932f4f0cf557feb9aa56fa06534d 3 | size 1868 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Arm_L.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d2624e2332b0f7ed8a1ec2f6246a99ea52db01fedac1b92ff4ef5a6fb119330c 3 | size 1737 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Arm_R.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0fef13cbb6592f286ec502323c811bd52dde72e7510da92cda8cf815a2cd08f8 3 | size 1737 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Hand_Both.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a9824157f6913a188cc5ea1455b51ec5f4f9ff676500da6317df77a87688e5bf 3 | size 1865 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Hand_L.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:18fdb5cb4c1102782804deafae9b2232976e90d257b6dadb96060167ad7ff32b 3 | size 1738 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Hand_R.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:165696fc59052c2f59fd7e0fe2c28aa0e9b48a6927e2f4ca8eae061a8e43849d 3 | size 1738 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Leg_Both.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7952e999095ddc57981e87c617615c5deb142c0f4987bf9800889efe6a7017a7 3 | size 1862 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Leg_L.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37faecd2a113c775eb324ae8441259b0a05b58247325135e1430f0d82767c5c3 3 | size 1734 4 | -------------------------------------------------------------------------------- /Content/BoneData/BD_Disable_Leg_R.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b5873d2ce2c4106383cc9b882d21f93d9fa4dedceb8651b66b1275c980dc4282 3 | size 1734 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Animations/Jog_Fwd.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b1bfc927cd4a7eb3cf0f1642bde03269489374920cb03e8f1ead28b06cc7a133 3 | size 360733 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Materials/Layers/ML_Latex_Black.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4cfdf3fb6c673c427f9861cbe093a0bb9eb5e26bc7d510f6496905492cb2f317 3 | size 14075 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Materials/Layers/ML_ShinyPlastic_Beige.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cec2025a908f109c841f87bcca645212d0cbbe6d9991fe0dc2ca7235b06c19eb 3 | size 10838 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Materials/Layers/ML_ShinyPlastic_Beige_Logo.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e1ab20daf2d995b90bc6c4245b7fb0a2c7c4901c00f1f96c73cb76ac2370965c 3 | size 11664 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Materials/Layers/ML_SoftMetal.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2f60240d5933078c8130a2391fa3d05942acd9098e2d0fb3a71900516cb11147 3 | size 14984 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Materials/M_MannequinUE4_Body.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a354b38f0326a06cf854ae11ff7a1479cc0ae2c817f844020ce94f6641f05efb 3 | size 28559 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Materials/M_MannequinUE4_ChestLogo.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2a52a91fdeddeda41cdc50337df03908df46b101f0d508bacb2baa8cfc22ee3e 3 | size 11545 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Meshes/SK_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:033001f1635dca248d6746df8b90c04741f636fb4b876f742d56a9946f04f7d2 3 | size 6014796 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Meshes/SK_Mannequin_PhysicsAsset.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:462de1decb6b9a48e73a0920a35ecc9e8eb0c0f384253a21b406a8ac52b38058 3 | size 46354 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Meshes/SK_Mannequin_Skeleton.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a291508ae57bf1bc13448336048bc9c2d4a0f09914057f88f4604d4108d451d6 3 | size 23076 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Rigs/IK_UE4_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:aa2a1aa4c1343b29dc024ca2fbc9b4e83f081c2819a698a22de3aa6d46590405 3 | size 69035 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Rigs/RTG_UE4Manny_UE5Manny.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:04bfa73bad53933b7d8729bbf5c4f6b851709888faca46053b10f27869adba5c 3 | size 24093 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Rigs/RTG_UE5Manny_UE4Manny.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3f80978c4e2316d4f03dc6c226660f3b1d10b80acb361d7476493f355d19a0bc 3 | size 19452 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_ML_Aluminum01.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ebbdee08147cd19ae999c014a4f509806c3367eba4645610b6a46b52833e9123 3 | size 393016 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_ML_Aluminum01_N.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:53e935b12a5cf673de8743080123f8e0d44d5b3c1d2a15c2225eea0009289b80 3 | size 404419 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_ML_Rubber_Blue_01_D.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:45b0dd411213e74d95b6fb4c6f425d288d9d91c9cbb11c7f324fa91247eede04 3 | size 427439 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_ML_Rubber_Blue_01_N.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e89ddfbb80d3f622e3f02772af5f75ac6559f890ed469fd4c56d9db54f99a0b0 3 | size 358460 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_UE4_Mannequin_MAT_MASKA.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6cd355f1e9d7fb2a03276ca67fcc608c43d4c5f2c3b8276934c9ff8add9beb57 3 | size 207012 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_UE4_Mannequin__normals.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d8092030e20422bfa883ff3a289829f3b861ea3baa8a5c5317e60757d6c45619 3 | size 5423314 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_UELogo_Mask.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cb2954d2026c9d147519602494a5c0a8093780ec4da4d8355d9f4de0e125d8a1 3 | size 41216 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequin_UE4/Textures/T_UELogo_N_TGA.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1eee3ad3291b45c3f1ea22d856dce45200dd54d1a12a689e2cedbd488a262b95 3 | size 55595 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/ABP_Manny.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:89c224c9920712d861d35eeba2f8c9e55c7bcf242e78656403cadcb82a2a5066 3 | size 351664 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/ABP_Quinn.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:32a30ecf21fdd40a70b7903e60fca80272a2dd53fbfdecce73bf04ed1e42409d 3 | size 39813 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/BS_MM_WalkRun.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:006e5887e68d0870906b09f5e782e6f2e48cfe682ab6d7cecd3cabb4eb6dcaef 3 | size 9221 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Fall_Loop.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5280e354bd0ad47a49181efdc93f56513f5d987be00881042b80987928744bbf 3 | size 973286 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Idle.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:36f0fa71ad5b820d66ca6610f38e2edf1dc4b3643196bf6cf07b2f32c6122967 3 | size 1464290 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Jump.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9d8800df2fbc269c7260b0f448da704f65e51daf4581ec9e2f57f92f53762dfa 3 | size 451570 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Land.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d6e6c16075772c3f6f25bc963d5c8587b79a6af3ddfd0c9c52f22dda20765ebb 3 | size 457487 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Run_Fwd.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:69b133953bed71bff5891102448aeb2e294635cb8f40f892040de22d64c0e18b 3 | size 509896 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_T_Pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9d8c82c5ce88a821c3325f3c658a92b4680d820d30778f2ec805d50e6f7ef892 3 | size 117377 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Walk_Fwd.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8b4b8e2fdeb1904d8f0bb1094dde7c0cab9e34738e7899a725252025de8e24fc 3 | size 576651 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Manny/MM_Walk_InPlace.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c9cf34ac94acc053a76455df69fe1524a3b502dfc3e2dfccf2e9117321265591 3 | size 762451 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Quinn/BS_MF_Unarmed_WalkRun.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:84ee59c67dd86e19602c73a547f92cd77773a6f593750dcecb3f1554e0e941a3 3 | size 9261 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Quinn/MF_Idle.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8fe4145116a0a9be22d3448c9ebc90afe50ec605cb3b44c5bd4ad218e21798b2 3 | size 1000149 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Quinn/MF_Run_Fwd.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0dbc36955ba3ef3bc1dde388e950987eb5a4a44074d448cd6f79abfa976654af 3 | size 550498 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Animations/Quinn/MF_Walk_Fwd.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:86da6aa9c4098cbb5823894496798a84df562eb8d1b4b0d6017d592ddc8aa362 3 | size 567181 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Functions/CA_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:00394956e5b526fe8ea91f983898592471a9e9db1dab58d0811b2168535f9efb 3 | size 5020 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Functions/ChromaticCurve.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:95ef73bd6a7c9f0876bc9b58828f8ff0006195796642d52bc260c90f96e5864a 3 | size 6449 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Functions/MF_Diffraction.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:63268d6c6ee7acf46b9f452c84c701fa50dde863ba0dbd986d85a3256d0e81c0 3 | size 32083 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Functions/MF_logo3layers.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0c5b6fbf0b020f882e311885cf74ca33f9eff6e81fb1f9202dfc58aa8255fd05 3 | size 56034 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Functions/ML_BaseColorFallOff.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:eb04c1f975fefb84a64b7f587f665d48e3a03e41687d8128f979c172e67dd16f 3 | size 13753 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Instances/Manny/MI_Manny_01.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b47e3935044e97c06199eb225286b98250639495330f31c4fd88b7c627123f99 3 | size 21596 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Instances/Manny/MI_Manny_02.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:aee4772138fc294d6fed7a45d8f5c0544b32d60b9d80f9f309f6eea5bc8835ae 3 | size 24632 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Instances/Quinn/MI_Quinn_01.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a627bc555e2b913ee29804fcbf91a97559f7cfe5ccddb3a11135c235e25951db 3 | size 19637 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/Instances/Quinn/MI_Quinn_02.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:32e056307206e779905dbbb3dd4e93b8cffc03036fc5a9719c83d65eb5f2c320 3 | size 24991 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Materials/M_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3f5819a23b7d7b394634c9d2ebaad88557dbaf02d9002ef56e9b3521819183df 3 | size 83407 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Meshes/Mannequin_LODSettings.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4804ae70d51343793c90a07af71c8e8ece8759bec842bc016c118e581ea3a956 3 | size 19145 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Meshes/SKM_Manny.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7896fbabd5b2ef4fada15e5fc6f08359b044e8d4e5c874f9180008b1ac1d0a4d 3 | size 35975227 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fca00ba983c5cb0c471b66e0bed5e86899c03b097889cedfcf67b87e8dc20a22 3 | size 19381201 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Meshes/SKM_Quinn.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:88244a9d73cfc1837989c8d9026775500c316f7b6b2afc1901a2259674219838 3 | size 37869428 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d52ce08eedabca2ca886a3c6efdb9ce4c6cb5fb1bdf69e0940ad21cbbb763025 3 | size 20192707 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Meshes/SK_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fe3a360adacb30c1c777fc9fd54b027db5eae2c99811a1349619b5ae2416a603 3 | size 158262 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/ABP_Manny_PostProcess.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5b7a62aba671946a50b06dedf36e37f7b4e171b1f7165034b40dbd0ba013698c 3 | size 422910 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/ABP_Quinn_PostProcess.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:683e12d8dfa4237248e2c33d3cb5175900d9852eeb197bdbcf7343e966fdb5ac 3 | size 422708 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/CR_Mannequin_BasicFootIK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:df062d8d111aeefa5978f20b19e5d83239251b988f0dd0d76bd1d26ef370fe18 3 | size 652199 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cc88d02d96b36f39f786b3e6d0167ccf1ca3668669ec1ca625dc7cb8b7a9148c 3 | size 17395336 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8584fdaa53c86b87b888a815acb7ec66418982aaeac8ff168ab8755ecbd7cb26 3 | size 2353069 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/IK_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d4ea66fc8843ff2d097674b228bfefbf9f9c33de8b83f4372c02c0873cf93714 3 | size 143590 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/PA_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ac4dce26561f36062fd90001f2e84d5ae534675faed3bc9d90bb9168ee6147bb 3 | size 291167 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3e8a466734702cc52d6817937d78edb7b489ca557f977a404b76cf1929ac2982 3 | size 237244 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ef4c19bcb926462b6de19edbebb6aca500a5e0e03521163c3cb2c6034aa5d7f9 3 | size 207589 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:85d86fdeca79b22d7da49605e92efe27caae15b14c8e87e0da92103071e52d6d 3 | size 237254 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c4d0ec6bc171c42f7f52629e43c33f58635c589b671215ae6e16aaea29428228 3 | size 207589 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_clavicle_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1c88485ea060071b6140f78aa19b3c83f6ac297f1f0615343c9204b72ce9c0b1 3 | size 236800 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_clavicle_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2b47fdf46e91ce5cd36cc8e264d8c6992dc64fbe95c5a8339c5424faa2435bb5 3 | size 205895 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_clavicle_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1c287190daad51a40d5898134e23e3d005caf3d77a33d83e564aff373ddee952 3 | size 236642 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_clavicle_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3053033cc9e798e4792788a5905d4b821e73cba378eb0f5ea7fa0f311071ccda 3 | size 206497 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_foot_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5e726d403a2136c58ad9a5a0e4fb70b08898591360f5ee18bc3f203ac154a17c 3 | size 232900 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_foot_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:86c2ef7baf2f0fce34344e9ff7a7dcad48ac2937bfc2e623212aa3a29b530f5f 3 | size 132335 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_foot_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:392aa4602400e82247b7aad05e8e56849d2c7e8ada6b38114cc2c815b3cdfe18 3 | size 232998 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_foot_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:369d25afeca69c45f466c99fc8343a79fa283553c96f81d6ce48a31c483a790d 3 | size 132335 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_hand_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8f9f4d11345ca96cd84522b8c78d2054e0bc75166ec25841812a2c3c8e8c6f15 3 | size 234148 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_hand_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cc96e30d7222d26fd74961af1be6604a59ca607d9c74b1171e6a2b83e6857ec2 3 | size 169365 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_hand_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fce1fc3607e9819af759fb378d2ea2dbbfa5e1ecf6730469f48696209e8aa7cd 3 | size 234150 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_hand_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:899866522f287d36afbf923ab80e101ce9bc5be71bf65b186f5fda3ad1cf1537 3 | size 169365 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_lowerarm_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ff285fb2bc9a3fe7c9a3fa0797c49915cda7dce5be5d8168e9451dfa2eab1eae 3 | size 281209 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_lowerarm_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:391133e9c1bcbc0485c0a0e0b4623eb5eace45478e17da06c1ec99ec19794199 3 | size 361807 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_lowerarm_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1471a5c96e20a7ddfe4e58daaf24c671f0395c004efcd5b91857fdb341b51303 3 | size 242818 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_lowerarm_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c5fc945788e66021d79320177fa51147447603cbbb16ca7085eca97fe6a2b586 3 | size 361807 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_thigh_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:be8f85cafacf06a07cf5d00b7c0edef47991be6e3b567c222b4afe861745e49c 3 | size 259822 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_thigh_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c43d4f136ff4d5840fe92715d37c623d3868aab38a3fbb39142d5128e0162637 3 | size 558132 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_thigh_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:42d695b1a50d9168a407e0d654fcc5bb033ab14e3ba708767a02cc8d4573f25c 3 | size 259824 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_thigh_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:035068432408d7217f5a6ea7ffb50c240518e816cc80a474eed340743c49c4f0 3 | size 558132 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_upperarm_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:11a163992732da3ce4452fd01dace3390481ce70c9ef2775ea61cd5daed08489 3 | size 264515 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_upperarm_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3bedad3ba807a2fb4aef4b615193de9edbcd0d6ce1dc25fdb896065b18945d08 3 | size 641796 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_upperarm_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e81b3ad7e5b0f479246e9a84e0ead1907d032eca486abfa26cd4863c2fa2010e 3 | size 265029 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_upperarm_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:048b042cec609664b36fce5bc0203e7f808d9f81454e7ccd63958114bd88dcb1 3 | size 630358 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_calf_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:04627f376dc70bea18ca97fa5859794d51d8a8b1959b45ee050cb3a35086a451 3 | size 281029 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_calf_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:97593a090f654061f7a76fa1712b2235d251fca18c1fc5ea58b0248340969d94 3 | size 245330 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_calf_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6ef09d28e11af86d8876016f183fef7a7cf9e5417f5dec8b2f299dd584f961a0 3 | size 319054 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_calf_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7b5fc3d0d5137c2f5614931a91fbc2778c8b11050e1c8d32bcceee6a4895f397 3 | size 245411 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_clavicle_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fb551cee900df4ff26c767e75bc91b4c6da02a50bce8bee64c5c8c47b9166adf 3 | size 317390 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_clavicle_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ec061d4a1a7f093d84a9b45dee397ecce24a5d5aaeee09ae308f8d302724ed3e 3 | size 206082 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_clavicle_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4f1b26c1099889cf76ece6511031939b3924f3f0167e138dd3037b8edb5982d5 3 | size 278785 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_clavicle_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bcf0c840cf08e9e4d094b48b58c4b58c63003247a8227fd7df396a5075baef66 3 | size 206183 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_foot_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d8f1fa950a77b331db37fb8dae378299148b99a3e038314f094a2fc50e47ff73 3 | size 275139 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_foot_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:095bf9f759409f4f36728de041a3ed1359f8f5d26af7b91870552255e318a692 3 | size 132322 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_foot_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:482263528028ba70d8b36297a26ecbb3e82b0a94cecd811c2d9e2667788afa6e 3 | size 275141 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_foot_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:18ab230de5c83e330894cc5b401c2c0d339075d93daaa159e4603127b15e7a47 3 | size 132322 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_hand_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6fc58635ad2969310d42adc07f2ad8815552386371f902bb44a9b34963cd5a0e 3 | size 276291 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_hand_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bd60245d572c5e58080eb3719bcd601b41e3afaf3e0da0553bd46999095daefa 3 | size 169352 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_hand_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:77374d22b08633b543d547c0779b6ed7a8f8c6123cca4f1f32c7cfafc6f04e78 3 | size 257191 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_hand_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a8733dd1f3c6f83928d0bf7cfc6480d08eca1e2c8696d18f718e9627639b5402 3 | size 169352 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_lowerarm_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:55a1f7f79949b4bdc48cb97830163139d173249a57402872e05f055c694ea1d9 3 | size 264963 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_lowerarm_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cd56ffc59fef65f888a4d3a42d24a7dd9561fc4d683751d6fc0944dfa2ccf553 3 | size 399732 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_lowerarm_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:85b5a0c739cc13da5460b53b57bbaf485ce339abe2144038ca3c389c243d0e63 3 | size 264645 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_lowerarm_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a199dcec61f89724256474f7260ea30b2dae376544b61909f0ad7abd94805556 3 | size 399732 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_thigh_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5935e469eca2a8e39c29359a1c52e6091e52d9a68673445710f2b2357240af46 3 | size 279727 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_thigh_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:dc2e42cb7abd5229ed12b6a891d42556661c675324a9da7950221ee9744fb578 3 | size 557818 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_thigh_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d3e955e63a55dee91e7dc3688150b177d5e220c7c51ebee6e8020c1a82975e6d 3 | size 279729 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_thigh_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bae2b24970e28cce7d22c572bcd6e19b066f808ff0ca0c244ddf95988407b4cc 3 | size 557818 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_upperarm_l_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d354d83b2b56a5f4664827f9997cd37a5aecf69b535762b8abce30e10f4cfa3c 3 | size 274500 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_upperarm_l_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:06f6b1b0c3b1d3eb567c1a6420532d4c052b0037df4e585e139f9740102fc720 3 | size 485643 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_upperarm_r_anim.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2aacf0be76800f4ac5444fe0b3d7ff24a7708b35523b1cafa9a1bb57d67669a8 3 | size 270662 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/Poses/Quinn/Quinn_upperarm_r_pose.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:580eb60e5eab2723014a46f4992445367e13b1d6d5992f16144fa93f1b4a8575 3 | size 488653 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Rigs/RTG_Mannequin.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:121cca8c7ac895a19c9bd59e8d4323b6dcca2531c0597e666be4c481cbd4bc99 3 | size 23790 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_ASAOPMASK_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f21c4896d0302904d612e47045711f38979a1457aa82f2688db37a2540f574c5 3 | size 3612756 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:925a5e33f044b65d6ab93d51cf3e8757daccc704f4ce01906eecca606f7c1a8c 3 | size 18514308 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_CCRCCPlastic_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5b5e55621f7a3197bf1ffd0f5c899758cecd72a7af4f006384ec240ed41f49ee 3 | size 10272126 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5da0975340fd066dc0a70bb26a2667960a01f43bf2d8798751499fe66d034946 3 | size 5740494 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_MSR_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e90b866cdc95b6dc51bec9d57354063a8d22112de82f6d356149980d5a5d3e1f 3 | size 11038329 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_N.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:80226120a2ca4cd2f86ecd5cd6f7c0498435e270aee66b91cca6e6431d5d7bad 3 | size 7198390 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_01_Tan.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:39272092f4ae99d0c274e78518653fbd3344594a0f7e9512740a2ec640bdeb46 3 | size 1357911 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_ASAOPMASK_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9a9152c823683c665b01a4be4610edffc5efb4de412d9f5c91c13d8057c22e97 3 | size 8336284 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:81460892d139b8666f9f7dd0fec4c47e02ac7289cad233d91ce152b7bb7cef7e 3 | size 21135878 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_CCRCCPlastic_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3eeacc7a9b888ccea83168611d399aa201d40e77b6d36ae8b288c0d84c918cba 3 | size 13137581 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:af6b047fac584d88698d9df74215752955f8329ca8f2a00d7022a9b4839c0b2c 3 | size 9028826 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_MSR_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:80d2dbcf1e5a9d366a168fea048a0c04886da32c818dc10faaed8eb9dbb15f5f 3 | size 13673446 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:122a6c094b781268ff36729d01836698ded2591d17366ee9a937483136e01251 3 | size 7269476 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Manny/T_Manny_02_Tan.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3454d1d617a3f4d86b2d249c2a3717e3e38cf9d1814c495f5bccd9c78c6a2005 3 | size 2151618 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01ID_BN.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2550bb95a64c4e66837114a1a3e8706041add1d0f03df73d640b8520b09a3800 3 | size 16108741 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01ID_D.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2e0109aa81095ef57bae8a7867c1ebff1e090c608ddd78ac18d8474be314f4ca 3 | size 4711276 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01ID_MSR_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6317f024748e1a85b780650bdd39a6ccf46bb4ae3cbaad14220146bfb7bfc9da 3 | size 11656288 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01ID_N.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:281002a34b1323ced93163703c542ba64b1aa16109009bea77015333eebc4051 3 | size 5217817 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01ID_Tan.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:198c5363bd0e599de01eefb1946b1f12c074bd56adc14f81e4a5dbeebbb5df48 3 | size 1104770 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01_ASAOMASK_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:44812d487df8619ff0c16329aedc3d64454abf8ee1e4e1ff70f8df0ea6afbc3f 3 | size 5834984 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_01_CCRCCPlastic_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f9c7e4d3fbc3cc1292df156ee8f3058830100c538d9be673f71c081d0668e08e 3 | size 12400080 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02ID_BN.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:668bbbd1d91ba08c5b89e37ed1671bcb30edb0f89a056a3d75f1aad845bc43da 3 | size 19707025 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02ID_D.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:30f1375b5044f21a52f6b14a7dc2f70f3a4065b48bf836a35fa1a01c70f4a75b 3 | size 6732644 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02ID_MSR_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0ed41257b2c69fed2372ae7f36eeccc1a051a0ab568da4773cd1ce10328ff274 3 | size 13169918 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02ID_N.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4e7b0c5e89701bc1e4fc83a86e9ac8384f7ccaf92f2f6906cafcb12102820e5e 3 | size 5217817 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02ID_Tan.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:09ad42e099f65a4f8286607f95683a7ed2dd7796741e5a0fba17d7127f479d6b 3 | size 1758637 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02_ASAOMASK_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e526749679219748c76ec76897b5a29f9d00bd6cdec3532f3bbfa8f27776e204 3 | size 6902123 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Quinn/T_Quinn_02_CCRCCPlastic_MSK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:47a7586a3676c118f78d2d0a00e285ccbb795d095101825aff120bf2d4a98cbc 3 | size 13428012 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:05df865a9b9c11768e40aecda86800799f46498a40b7b3bb4c98f0f87aad8f04 3 | size 70099 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/ABP_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2f599acdf6ff6b9b45d71ca64eb245f4954cc3227ad06b4491ca7ab4930a7628 3 | size 114091 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/Animations/AM_TargetDummy_Attack.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:81aed92706b889f944b2c5af7c9b2c67c35e944fe79a092fb85616f4c1c3d800 3 | size 9716 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/Animations/ANS_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:63120e7494f0d298426d775a48a1f29007bbcabfa6ab81480b59685490652ac2 3 | size 40717 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/Animations/TargetDummy_Attack_L.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e6afc604415adea0fd73749a7adc0a2a5efcf74c4ca1ad0a8d2a9cd200e60c33 3 | size 69663 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/Animations/TargetDummy_Attack_R.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5dae89206dfd647429f382a90b8e6a1fb233be06169e3fbc5522578d5ad830bd 3 | size 69694 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/Animations/TargetDummy_Idle.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:83df5ecdc1b6b78fa6524135849133872c142eae85bf950ae228000bf59cf51f 3 | size 23367 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/MI_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:035f0562be7607fa82a7b191abf51be07762957da49c28199ea88f1157e6d400 3 | size 8945 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/M_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e75559a1d63dabcf2ee01bcb94e97c7b52bf6d82b0f6f47731e98a813dd9af23 3 | size 10030 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/PHAT_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:01ccfd8443f6fbb4e91692887aa397d0b396695bb49aaf7285dfe672ef123ac2 3 | size 13249 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/SKM_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2bbfd81ef2f578c412c376cbe0f912cfe61bbae55ca1e4e9ebed5a5d80946701 3 | size 2160488 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/TargetDummy/SK_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0f3de8a9893f13a34737acfe9b3efb89613b24dec8b5239f36a12f13e4b94391 3 | size 7608 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Animations/ABP_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6263d6b6f04bf42e1768fb3af3ee6ef83b810997ed43cc9790d6e760583002ef 3 | size 70345 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Meshes/SKM_Dolly.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:581c45bce2f9a53767a6da1bc5611bc44bc18ec0bc7a85c69654e5746f8f7bc3 3 | size 3831182 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Meshes/SKM_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a9d52a9bb495e0c8cf031872a1db18c62d3e70ead9e46ee9123f3ac799c3954d 3 | size 4613823 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Meshes/SK_Dolly.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7ed8276f4d1beab542ecf733fe4ab161c2e137177f57ed867065d162a1cdd48c 3 | size 6264 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Meshes/SK_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2303ff8133e89d3b5fbfec7f96fc95aad466e3bfd9d2cf33d264d4a3edba0a9b 3 | size 6911 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Rigs/CR_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ef474d49c844cae5870175d9bdecd180718d7aaafa4f106d06c1c6f1a17e2201 3 | size 196624 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Rigs/PA_Dolly.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:170ae9357deb7e0eed21cfa4b0f757ee7d56c3bd0dc30fb0af9953cf250befba 3 | size 7157 4 | -------------------------------------------------------------------------------- /Content/Demo/Characters/Turret/Rigs/PA_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:69adc4cd2292ac07fcc735a15b357f7bf3f26d30457d7a64124de1aa74c36c5d 3 | size 11635 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/BP_DemoTrigger.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:71743500378991df8cadb0514233e9d7a5961badbcb827ae5245c6503068dd8f 3 | size 115045 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/BP_DemoTrigger_Gather.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cc390b0ed3ab3c7fc30aaca406539ec78ead55a243c821234bd41f92e1c068ad 3 | size 107172 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/BP_DemoTrigger_RateOfFire.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:da8b857ec1d193e05b69e0453ff71bef7f57c68574eeaefe8a9037e18d7b7c7d 3 | size 34797 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/M_BorderCircle.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e84e87d863c317aad4e2cb9c50bfa15445e93d5e21fd84c3dede65f9b00677f8 3 | size 10540 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/MF_ProcGrid.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7e1d4f9940aabaf8150491afeb0e0cc85225c3cb02f49b3c0e459c1a1a801e33 3 | size 48351 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0b7a615f6db39ee0f7c4b185d19131471ff04e871e84d08be060c84c87fed244 3 | size 13226 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:24003f057abe59566ddd784bf307ba167c47033292772abb82ac61dbcee3710b 3 | size 12401 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3ad76ecf5b6e8c80726240fb830e83fda0e87f866927417caa0364f5ccee8a3e 3 | size 12436 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/MI_Solid_Blue.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d6fa0bdfc0e3e948eee4e56d80655ab3460b84e6f072a0722bd72a17cf3fa3af 3 | size 9108 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/M_PrototypeGrid.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:84883d788fd387fa05db453b8abe7402e634e0ca8690474b7e78bc66dbaec343 3 | size 40094 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Materials/M_Solid.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:766ba2559a731c283ef8473be34a5c1216dcd80eedf98dafa1c76d67bc098df9 3 | size 10070 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Meshes/SM_ChamferCube.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:02f69abae722c718fcf706dc62fae585f67b91b4d1d276fb9a4235812854e59e 3 | size 23309 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Meshes/SM_Cube.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:234b958c6cd924dae157fd082747c8e7e2acb199346477996048b39ba6d53b68 3 | size 17448 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Meshes/SM_Cylinder.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c3e61e6ea3f9ec7a374fb6c2ff01cd3a7a2600b9b866f699234b3605b36b8c10 3 | size 20644 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e1ce97312dc498cf3301b29ea0abd88c61c7d6f573bee60e9d7c7113d5ba589c 3 | size 18555 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Meshes/SM_Ramp.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0b7ee08bc85c29e665add1b3236997b811c226cb79948936abba4bca42f68346 3 | size 17583 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/T_BorderCircle.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f92392ae75d04fb7fbd0ebdb59db381247d0c830f9e390a3929f94514fae786f 3 | size 29158 4 | -------------------------------------------------------------------------------- /Content/Demo/LevelPrototyping/Textures/T_GridChecker_A.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6171f758ff87221d5ff58bfe6a0ecd689d037b193e54e99007509e13673e1bdb 3 | size 9731 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/BP_HitReact.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:da35b81c5eb884355c342b5f0fe4f27704b0be3f24dfd69a5f92847f27bfc786 3 | size 15793 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/BP_ProcCharacter.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:84cadf49cfd5ef2a20d8e1ed78fd37927195259a9729e4ce0896cebe91fbaa06 3 | size 335607 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/BP_ProcGameMode.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3822b68ed8b27410a052b0cd091ee57e83ec5047382081964457e459a26a5741 3 | size 18890 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/BP_TargetDummy.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:295f0d6800349e37681b930545da3c0eb55f0b600a58e66b3a32de1582c4955e 3 | size 409244 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/ProcDemoGatherInterface.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b4429b88576b2ee4d960e4225af25d8096c79191f50ec4a231a2e1052fe4f827 3 | size 12009 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/Turret/BP_Projectile.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:73f90181372be58679778ddfe3689729fa4c96b0797f18ef412995b9f39aa439 3 | size 102215 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/Turret/BP_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fde78641b4d1fba1ef3cc12da363754b6283212cfc57873db00c38c67e5e27ba 3 | size 637391 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/Turret/HRP_Turret.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:97ef7a3b8bf13b7d1c9568684606a8439acd2c73968bcc4c5bcc74102508ff85 3 | size 2078 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/Turret/Niagara/NS_Impact.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e04d497020f4b1fe69adb21a54075984136eadd5cf78f40de76bf45ff5ea0872 3 | size 565654 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/Turret/Niagara/NS_MuzzleFlash.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cfad7f7fef70a26e2a493df68f7723abcbbafce932f44b74f9dbfcba68e0b474 3 | size 559787 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Blueprints/Turret/Niagara/NS_Projectile.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c2b56bb8441bc93352ff6170200880d573b3114689245af15fda90ee5f138136 3 | size 817001 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Input/Actions/IA_Jump.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d2e2733ddde04ef8fdbc165c627072c63867a7aae9a537e94a552ea30ae8f40a 3 | size 1380 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Input/Actions/IA_Look.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bf9c1161acefeca814f5d9af2bca930aa9288cee3805af4add5a1617b8f6be88 3 | size 1527 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Input/Actions/IA_Move.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bc575c237a6e900ebb5722b8e7af9124acffe762b6cf329683fa7fde4a95142c 3 | size 1527 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Input/IMC_Default.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:581aa718ea410dd6159b0ce0bd5ff1ac530b136823ea90e5300727a29e5b97f6 3 | size 14177 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Maps/ThirdPersonMap.umap: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8b789b70f498e1dcd4f76a30cf040aa9f4d125a35aa7544c97bd2a7a0226fa54 3 | size 19576 4 | -------------------------------------------------------------------------------- /Content/Demo/ThirdPerson/Maps/ThirdPersonMap_BuiltData.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:66912f10acf03f2dce192dd5b6d97e2db4d31b4c02a790cb2d6a24d953025f70 3 | size 3601971 4 | -------------------------------------------------------------------------------- /Content/Profiles/HRP_BumpPawn.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d41c82fdf6a3e040524fbd4184ca21694c4afcbfffe660aee83f98a170e7266e 3 | size 3543 4 | -------------------------------------------------------------------------------- /Content/Profiles/HRP_Flop.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f2dded509e98686c53c07c8570fd4a56c1288a1ca23d825ac098ed8e22aa5f0f 3 | size 2145 4 | -------------------------------------------------------------------------------- /Content/Profiles/HRP_Melee.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3cb473120bf9b652d4494773456d0b89726604378f998badf0dfaef7a9636aaa 3 | size 3431 4 | -------------------------------------------------------------------------------- /Content/Profiles/HRP_Shot.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a75665edd7803d87c971d2aac1841d16451ed78dc195f2238dd1163f338f2f29 3 | size 3366 4 | -------------------------------------------------------------------------------- /Content/Profiles/HRP_Twitch.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:878aa5266b041e5f83d8cccc08950eab04d5c14a3f5217f6cbdd29c3b6d1bbfb 3 | size 2930 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/0/OU/V8W7EAV4PE8HYLYHWE1BFG.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:20ddb37e150ca481b9866b5b3ce96883ea5f180111a989c32f3f30d5f0360ef9 3 | size 4576 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/0/YK/O8E9V9IDTRXF1ETZH9OOHJ.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e3623503ccbd500b5166d8fe3959fcc7daee5928e1086dce6aa3ca801a19cacf 3 | size 4464 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/1/L4/JMTTG3MWOLLOTLPAHXQHYY.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:13306012b96257a0f227fa75b49cbaa3b06cde18cec4dbf6b61072e9cc75f61a 3 | size 7921 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/1/ZF/F9G3LWUOD7FZUVWSDBE38Y.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:24a4c14e8deb29b19d678b8f14bc5eb243d25fcfd9fbde6c4dfa3318c467666e 3 | size 12560 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/2/E7/ILVQ4NVQJ8BBLBT4ZEX6YP.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:85c62c8f694f15df3ba54b481cd630d3340071f6b4fcd3c02a043bb9eb9a70c5 3 | size 4526 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/2/IM/KN2TFLL64RPMWHY0Q8RUZ5.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3f72a625b706152c136ff957f5234b26e095bcf7f35b413fc031fc4489d10316 3 | size 8379 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/2/PJ/MHZSVHCYGNHN41G0IRBK6O.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:921b27ef75e0281253e35eca903d64e317cce996caf0b3e039f0f8410e6b0526 3 | size 4638 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/2/X2/33S0YQO88EK32OL5YL3O75.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1d5ed2f000fd7360c4b510a37799d0e6c339c576aa5f28e58da58efda45f8ce9 3 | size 4364 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/5/92/4XGTOV24YATY0FVC9GJJIC.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:102fff3c652112aff6f172a155e2d123b93d376d5346b82fdffad148e59bc61e 3 | size 4576 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/5/D4/RW9D2RBUGBR4ZLG3LY847P.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2518d66b7b26426cc6794b46d27e6697ac9c999b7db67b6cfa1b13636c4889d3 3 | size 4518 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/6/BX/XE9V76PIYYD9HR60CIWO07.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3e3eb2447ab3025015d7e2810e3151537f866ba391d100c34fbcabff5f47cc15 3 | size 4464 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/6/DE/Z5DOE7DWG12GZ6RDLX8M3Z.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0a9f5b791cc3114f1e78fc3d87fe2bdf4a4bc570788ddae78b20e19df9820ad6 3 | size 4922 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/6/DI/OH1XK318WTJ2ZF2ZI5M57T.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:78570d4daa1be422327bda88ec272e874ced01fc2a96a552184887fd8ab87a59 3 | size 2399 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/2A/W9IF8HM1VI7NYT2VBJNI01.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ee0a0bfe898a0ce8d9e1a6ee6ae5ffa446d2d859c5961655f78f285c710fb31e 3 | size 4466 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/2S/J3F0PQCUXA1SRVA5TW5TWH.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5c8c60e32455cd151e1fff73b9ecdb3f2c494994f852b1fab2dd7c3b7f21ce6e 3 | size 4488 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/5X/R92IWXHMSMYU133H31ESEB.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:25949915674e6c4b90fa0292da2df553f0551cbd94b34dc3817e4f3c440807aa 3 | size 4578 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/AQ/PWJD3YWQOKLF9IH9ZAPOS7.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:00815789751c89ea376e71b7bb4c39afce7e5417781a769da133c8376ddd38a5 3 | size 4578 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/PN/K4ERFCTA6OD46HO1684V9I.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b250652a1aab2a015531395b57e8858d6b0a1312b76c5be2a414335273b8d6fb 3 | size 3920 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/SA/Q96MZTFYX26H3AJTA19OJW.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1cdba1a9080669209ab2dab5af6426905d5927005d09c2699c2e666eab8bff9d 3 | size 7915 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/SX/TAHSYHQGXS8GAC7N204KIJ.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:df2393f93ca27b56a667a2b26283efe2fefdb4fef5fbe93fda3c0b44bf51ed65 3 | size 4460 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/7/VW/0TDJFG734G8RPIAL4EHWLZ.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6df553044d09d1f1506fbd1946dccb6f28c162298469906db6b02de0fee60fd3 3 | size 4640 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/8/0V/ROO2Z7CKT0QK8VCSJZMJZU.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6df97c35fb6e4d509e3df8dd6f3de5a8c3073c89ae197c3460f3ffc915f6187b 3 | size 2508 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/8/12/4MHTVI1KLYNA3W1933ZTUC.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c99cc7f79b759197ec8b53d531ac1071d3814f0efc69562366c61434330169d2 3 | size 8974 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/8/52/D0TFNJXJI8UM40XUUF5Y58.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c4380286348b4f2a523eb61645f3c401ac2869420e4c65aa7a743fe8f389c15e 3 | size 4540 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/8/7F/UCIHEW9XQMILGO2E11UW5L.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6b8d34927a83c3239cf4759153004c7cb9874de1a274db6da54b4191db59d106 3 | size 4638 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/8/EU/XWS7JVMTJFGIHIPRLHJ8PW.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5aedeff4933f9866abf4f674b97554c23307621a7664d4b2001e27c46430f286 3 | size 4640 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/8/V8/SQZ03RME7YXIXAGFU1K2IS.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:63b2846a5e511a6b1267b8e1053d64b7455bbfe064e8bc3d7f4dfdf7d4997ac7 3 | size 4934 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/9/3H/3VK59LR2KF9O27WHI3U7A6.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:20fdd70d8b4929b1ef6cb34b5070a04f7471dadf36274a6d00339f8ebad3e420 3 | size 4638 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/9/63/VZGJK44VD8ED6FZZD60SUS.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:fe76be37111707f6342be57549c119a2f02354a9e62866ff84fbd6f312eddcab 3 | size 4922 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/9/A0/J61NKK9S0NAWRLKYWMS346.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:81354ab98227c174a5f2e98d8e3979d93b9b688af38e99663d87adcc4e83f28b 3 | size 11514 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/9/VS/WR24AO0I8ISOTKXAQIR00Q.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b70b58f99bd7836ec6946f3363d91a7345df27258a9505b2f66c79b4c9759c6f 3 | size 11512 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/A/YJ/D0PC47YR5IP0I94DVGO84V.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:25616e9820851059d09dfaa3c6f6963404a33d759a9082a19503755fe05eb71f 3 | size 4073 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/B/0S/4YQLX9QS87U2KPKK5NW68J.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:763b2ead819ec800b54656e742ebb9fc2a35cc2deba66d66b2e702cf42522a37 3 | size 5328 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/B/54/XSVB99TPKWX6Q8Q8HESA2S.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c115ffcca48a2ba8dcdd5b5b2da3ec28e6727a18716ae20eadc9da64d101c6c9 3 | size 3691 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/B/IK/7WWTAITBNZECNYGDTM2RDV.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:039c2bd705ad604da17cd18cecb113c1c5c93dd182f3c41f777d04582c9ad04c 3 | size 4466 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/6R/E3F86GZFY81HSQ7Y6DGO04.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:020e22952c7c686078a65da4b42f10b81691a8670d043bfdb7d345324b159ead 3 | size 11514 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/8Q/6KDRD5560AXASK2GXOK40W.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7953eaa591b663b9b5b66a4ee06bb3fc5e9572762c84a23963a3fb706122c320 3 | size 8877 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/8T/H0XS3LMV9E0WYBTW9K1OPI.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:345b9db2f45480f58f740dbd577b85f199241be84544978c31efb43c3e7bf5f6 3 | size 4580 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/BZ/C6OTQI7E8LDKE0YXQOAHUK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ddc800f93a648f639b742cbf6395d0dac9fd0363a1a33b3e7a42761c981b7d65 3 | size 4466 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/EX/EE9BN6JN24AQUFTYCF6S4J.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:69e7210b225e8f4409eff2a7b965b7db3bc258b0864f6b580a0c55c02660b597 3 | size 4464 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/HE/U5SSMJ6TPIZNNXFQIFBNST.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4bccdd59d9c536bea62c917ac4e95b21437390feaa96d5ff20def42e9ffdc680 3 | size 4638 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/KS/9BWVBUY4TNURUGRVJ0TA9S.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7bd162cc4c08f3d868b2d86de34258bdf773cea78f1fac3e1427e88fa50bdb03 3 | size 9184 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/U0/V8ZE42CWEWWBMJ2ZKTH4YK.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0254929b7c09efa2d06396214188d3bb6ab4376c1bcf6496fbd25b54c2aa6860 3 | size 7784 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/WR/E0NJBC8FHWRYXUN44XM1BH.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1697ae831565c3f1c0e70007150358fbed65cdb23f86658644ab634992af881c 3 | size 4464 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/C/Z3/091YTWFTT7XU7ZF747Y7FY.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b93127476ac9c1c656605636f9175f49a997a53fcbcc5bfe98066b5e396749a3 3 | size 4640 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/D/6C/DL7STRHC35TRLWM4IZD3RS.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6e6cd80dc7990b8760b0c173ce9257d32d7ed1f2dd04b8903e33c6f3de581308 3 | size 3705 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/D/7Q/P7EW8Y5BX8XFCB3Y7RADS9.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3505104a524331c491e49f9694ac73f8c5885c61e20c5047c37f2d16b152f954 3 | size 3711 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/D/H0/CZ8CUPGLOZAL0W84HKMNJX.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b13c3950fd3c97b0716ae54ae416186846567e146498afa19298706379d9000d 3 | size 9374 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/D/VA/Y4HEDMA9MQR327W2NV57QY.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:921ff1e7412bb64a87710fafd2c223777b43b51490904e826f201f400e35f294 3 | size 4806 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/E/2M/DNB29QR322TMHBW51XPORF.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:91bd13d6eca69b541fb6d9bf70fd438c6ce938c44e037d0c41b2e235c827c411 3 | size 4462 4 | -------------------------------------------------------------------------------- /Content/__ExternalActors__/Demo/ThirdPerson/Maps/ThirdPersonMap/E/FU/62YK1IOKUG4KNGE5WB8AMZ.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:519593f51bb5886e3a08a7c3eba7832f37322c86707e24587feb8a0bd7cdaa7e 3 | size 4524 4 | -------------------------------------------------------------------------------- /Content/__ExternalObjects__/Demo/ThirdPerson/Maps/ThirdPersonMap/1/WD/JMFTTL7B7WOZUFNU8LO50D.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0e57172b990247c8e6b588f5ed2d0f0ee77cb545db1f21fcdc6f9384be7be2a4 3 | size 2335 4 | -------------------------------------------------------------------------------- /Content/__ExternalObjects__/Demo/ThirdPerson/Maps/ThirdPersonMap/3/YN/MY59M61W68VQP3F6OWN0TT.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7fddca51c465c4deedcc73567635a0d1b85690070156c041447f4b718f0bfd7a 3 | size 2329 4 | -------------------------------------------------------------------------------- /Content/__ExternalObjects__/Demo/ThirdPerson/Maps/ThirdPersonMap/4/66/AX9BIEAQ4U3T7EHENMDV8L.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e13e9fdd74d0d4b510978cc74420594a6a6338f84a1ba7d5d443db86912a3080 3 | size 2329 4 | -------------------------------------------------------------------------------- /Content/__ExternalObjects__/Demo/ThirdPerson/Maps/ThirdPersonMap/4/BD/2YIHOUJBBHV3NCBKDV6OA8.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ac9e7e69857ff9a250eaa7f5cbd668070eb4adb12e9f91d379bef6f5b279aa07 3 | size 2331 4 | -------------------------------------------------------------------------------- /Content/__ExternalObjects__/Demo/ThirdPerson/Maps/ThirdPersonMap/A/64/ESHYDG1072464R441J7N3K.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f495c8f150c803529c861164cbb6d78a72a2568c8a5ab88a05a4e812b847bb05 3 | size 2331 4 | -------------------------------------------------------------------------------- /Content/__ExternalObjects__/Demo/ThirdPerson/Maps/ThirdPersonMap/B/QN/7AH46JIG06NFTE1QH5GMVW.uasset: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5aebf9c9dc420f30d6b6de5c54797bdcec815996a09652290fe2176adfe8d674 3 | size 2329 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Jared Taylor 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ProcHitReact.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "1.0.0", 5 | "FriendlyName": "ProcHitReact", 6 | "Description": "Procedural physics-driven hit reactions on skeletal meshes. The most powerful hit reaction system you'll ever need.", 7 | "Category": "Animation", 8 | "CreatedBy": "Jared Taylor (Vaei)", 9 | "CreatedByURL": "", 10 | "DocsURL": "https://github.com/Vaei/ProcHitReact/wiki", 11 | "MarketplaceURL": "", 12 | "CanContainContent": true, 13 | "IsBetaVersion": true, 14 | "IsExperimentalVersion": false, 15 | "Installed": false, 16 | "Modules": [ 17 | { 18 | "Name": "ProcHitReact", 19 | "Type": "Runtime", 20 | "LoadingPhase": "PreDefault" 21 | }, 22 | { 23 | "Name": "ProcHitReactEditor", 24 | "Type": "Editor", 25 | "LoadingPhase": "PreDefault" 26 | } 27 | ], 28 | "Plugins": [ 29 | { 30 | "Name": "GameplayAbilities", 31 | "Enabled": false, 32 | "Optional": true 33 | } 34 | ] 35 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Proc Hit React 2 | 3 | > [!IMPORTANT] 4 | > **Procedural physics-driven hit reactions for skeletal meshes!** 5 | >
High levels of customization and extendability 6 | >
Fully extendable in Blueprint 7 | >
And its **Free!** 8 | 9 | > [!WARNING] 10 | > Use `git clone` instead of downloading as a zip, or you will not receive content 11 | >
[Or download the pre-compiled binaries here](https://github.com/Vaei/ProcHitReact/wiki/How-to-Use) 12 | >
Install this as a project plugin, not an engine plugin 13 | 14 | > [!TIP] 15 | > Suitable for both singleplayer and multiplayer games 16 | >
Supports UE5.3+ 17 | 18 | > [!CAUTION] 19 | > Many features are still in beta 20 | >
ProcHitReact is sufficiently feature rich that every use-case can't feasibly be tested 21 | 22 | ## Watch Me 23 | 24 | > [!TIP] 25 | > [Showcase Video](https://youtu.be/y_BLLSzCjd4) 26 | 27 | ## How to Use 28 | > [!IMPORTANT] 29 | > [Read the Wiki to Learn How to use Hit React](https://github.com/Vaei/ProcHitReact/wiki/How-to-Use) 30 | 31 | ## Why Make a Hit Reaction Plugin? 32 | 33 | ProcHitReact addresses all these common limitations: 34 | 35 | * Supports multiple overlapping hit reactions 36 | * Repeated hit reacts are handled seamlessly without snapping 37 | * Child bone blend weights are not overwritten by parent bones 38 | * Seamlessly blends differing profiles and parameters 39 | * Option to disable blend weights or physics sim on individual bones 40 | * Supports holding weapons 41 | * Consideration for real-world application in complex projects 42 | 43 | ## Features 44 | ### Ease of Use 45 | In many cases, all it takes is putting a component on your character, assigning profiles, and calling `HitReact()` on it. 46 | 47 | When setting up something out of the ordinary further setup is necessary, but it can be done even in blueprint. 48 | 49 | ### Impulses 50 | Supports Linear, Angular, and Radial impulses. 51 | 52 | ### Per-Bone Tuning 53 | Supports disabling physics or using custom blend weights on child bones of the simulated bone. 54 | 55 | This means we can disable physics only on the arms for our character who is aiming a rifle! 56 | 57 | Blacklist bones that don't simulate well, such as the pelvis which can cause the entire mesh to simulate! 58 | 59 | ### Profiles 60 | Supports extendable data-asset profiles, simply specify the profile you want to use when triggering a Hit React. 61 | 62 | The included HitReact component has many profiles setup for you out of the box with tested defaults. 63 | 64 | ### Global Toggle 65 | You can toggle the entire system on and off, with or without interpolation. 66 | 67 | If you have the Gameplay Abilities (GAS) plugin enabled in your project, you can use tags to enable and disable the system. This is an optional dependency, ProcHitReact does not require that your project uses GAS and will not enable it for you. 68 | 69 | ### Sleep & Wake 70 | The system automatically stops itself from ticking when it doesn't need to. 71 | 72 | ### Powerful Blending 73 | Featuring a purpose-built interpolation framework, you can customize the blending to your liking. 74 | 75 | The available states are: Blend In, Hold, and Blend Out. Hold will maintain your physics at max blend weight for the duration. 76 | 77 | Reapplication can be throttled by setting a Cooldown. 78 | 79 | Physics bodies have custom simulation behaviour, nothing so primitive as using `SetAllBodiesBelowPhysicsBlendWeight()` 80 | 81 | ### Networking 82 | Generally hit reacts are entirely cosmetic and should be applied via gameplay cues or other generalized multicast/replication events. 83 | 84 | The data types used by ProcHitReact, including the application parameters, are net serialized for you, so you can replicate these too. 85 | 86 | Dedicated servers don't process hit reacts, unless you enable the setting. 87 | 88 | ProcHitReact was designed with multiplayer games in mind. 89 | 90 | ### Debugging Capability 91 | See the [debugging section on the Wiki](https://github.com/Vaei/ProcHitReact/wiki/Debugging) to learn how to Debug ProcHitReact. 92 | 93 | ## Changelog 94 | 95 | ### 1.0.0 96 | * Initial Release 97 | -------------------------------------------------------------------------------- /Resources/Icon128.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6aa6c639683dc2028ac574535405eb54b2a61b9924238e5cb131d04ee28126bf 3 | size 32016 4 | -------------------------------------------------------------------------------- /Resources/Icon256.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:03b11912baa5abfc1d5718dfd8ed42860f39725c0604e09d1856c85825c02fad 3 | size 107128 4 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/HitReactProfile.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "HitReactProfile.h" 5 | 6 | #include "Misc/DataValidation.h" 7 | 8 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactProfile) 9 | 10 | #define LOCTEXT_NAMESPACE "HitReactProfile" 11 | 12 | #if WITH_EDITOR 13 | #if UE_5_03_OR_LATER 14 | EDataValidationResult UHitReactProfile::IsDataValid(class FDataValidationContext& Context) const 15 | #else 16 | EDataValidationResult UHitReactProfile::IsDataValid(class FDataValidationContext& Context) 17 | #endif 18 | { 19 | // Subsequent impulse scalars must be in ascending order 20 | for (int32 i = 1; i < SubsequentImpulseScalars.Num(); i++) 21 | { 22 | if (SubsequentImpulseScalars[i].ElapsedTime <= SubsequentImpulseScalars[i - 1].ElapsedTime) 23 | { 24 | Context.AddError(FText::Format( 25 | LOCTEXT("HitReactProfile_SubsequentImpulseScalarsOrderError", "Subsequent impulse scalars must be in ascending order. Index {0} has an elapsed time of {1} which is less than or equal to the previous index's elapsed time of {2}"), 26 | i, SubsequentImpulseScalars[i].ElapsedTime, SubsequentImpulseScalars[i - 1].ElapsedTime)); 27 | return EDataValidationResult::Invalid; 28 | } 29 | } 30 | 31 | // Cannot have a total time of zero 32 | if (BlendParams.GetTotalTime() < 0.01f) 33 | { 34 | Context.AddError(LOCTEXT("HitReactProfile_TotalTimeZeroError", "Total time must be greater than 0.01")); 35 | return EDataValidationResult::Invalid; 36 | } 37 | 38 | return Super::IsDataValid(Context); 39 | } 40 | #endif 41 | 42 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/HitReactStatics.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "HitReactStatics.h" 5 | 6 | #include "PhysicsEngine/PhysicsAsset.h" 7 | #include "Components/SkeletalMeshComponent.h" 8 | #include "Engine/SkeletalMesh.h" 9 | #include "Logging/MessageLog.h" 10 | 11 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactStatics) 12 | 13 | #define LOCTEXT_NAMESPACE "HitReactStatics" 14 | 15 | bool UHitReactStatics::DoAnyPhysicsBodiesHaveWeight(const USkeletalMeshComponent* Mesh) 16 | { 17 | for (const FBodyInstance* Body : Mesh->Bodies) 18 | { 19 | if (Body && Body->PhysicsBlendWeight > 0.f) 20 | { 21 | return true; 22 | } 23 | } 24 | return false; 25 | } 26 | 27 | bool UHitReactStatics::ShouldBlendPhysicsBones(const USkeletalMeshComponent* Mesh) 28 | { 29 | return (Mesh->Bodies.Num() > 0) && 30 | (CollisionEnabledHasPhysics(Mesh->GetCollisionEnabled())) && 31 | (Mesh->bBlendPhysics || DoAnyPhysicsBodiesHaveWeight(Mesh)); 32 | } 33 | 34 | bool UHitReactStatics::ShouldRunEndPhysicsTick(const USkeletalMeshComponent* Mesh) 35 | { 36 | return (Mesh->bEnablePhysicsOnDedicatedServer || !Mesh->IsNetMode(NM_DedicatedServer)) && // Early out if we are on a dedicated server and not running physics. 37 | ((Mesh->IsSimulatingPhysics() && Mesh->RigidBodyIsAwake()) || ShouldBlendPhysicsBones(Mesh)); 38 | } 39 | 40 | bool UHitReactStatics::ShouldRunClothTick(const USkeletalMeshComponent* Mesh) 41 | { 42 | if (Mesh->bDisableClothSimulation) 43 | { 44 | return false; 45 | } 46 | 47 | if (Mesh->CanSimulateClothing()) 48 | { 49 | return true; 50 | } 51 | 52 | return false; 53 | } 54 | 55 | void UHitReactStatics::UpdateEndPhysicsTickRegisteredState(USkeletalMeshComponent* Mesh) 56 | { 57 | Mesh->RegisterEndPhysicsTick(Mesh->PrimaryComponentTick.IsTickFunctionRegistered() && ShouldRunEndPhysicsTick(Mesh)); 58 | } 59 | 60 | void UHitReactStatics::UpdateClothTickRegisteredState(USkeletalMeshComponent* Mesh) 61 | { 62 | Mesh->RegisterClothTick(Mesh->PrimaryComponentTick.IsTickFunctionRegistered() && ShouldRunClothTick(Mesh)); 63 | } 64 | 65 | FName UHitReactStatics::GetBoneName(const USkeletalMeshComponent* Mesh, const FBodyInstance* BI) 66 | { 67 | return Mesh->GetBoneName(BI->InstanceBoneIndex); 68 | } 69 | 70 | int32 UHitReactStatics::ForEach(USkeletalMeshComponent* Mesh, FName BoneName, bool bIncludeSelf, const TFunctionRef& Func) 71 | { 72 | // Same as USkeletalMeshComponent::ForEachBodyBelow but supports early-exit and doesn't require bSkipCustomType 73 | 74 | if (BoneName == NAME_None && bIncludeSelf) 75 | { 76 | for (FBodyInstance* BI : Mesh->Bodies) 77 | { 78 | if (!Func(BI)) // If lambda returns false, break early 79 | { 80 | return 1; 81 | } 82 | } 83 | return Mesh->Bodies.Num(); 84 | } 85 | else 86 | { 87 | UPhysicsAsset* const PhysicsAsset = Mesh->GetPhysicsAsset(); 88 | if (!PhysicsAsset || !Mesh->GetSkeletalMeshAsset()) 89 | { 90 | return 0; 91 | } 92 | 93 | if (!Mesh->IsPhysicsStateCreated() || !Mesh->bHasValidBodies) 94 | { 95 | FMessageLog("PIE").Warning(LOCTEXT("InvalidBodies", "Invalid Bodies: Make sure collision is enabled or root bone has a body in PhysicsAsset.")); 96 | return 0; 97 | } 98 | 99 | TArray BodyIndices; 100 | BodyIndices.Reserve(Mesh->Bodies.Num()); 101 | PhysicsAsset->GetBodyIndicesBelow(BodyIndices, BoneName, Mesh->GetSkeletalMeshAsset(), bIncludeSelf); 102 | 103 | int32 NumBodiesFound = 0; 104 | for (const int32 BodyIdx : BodyIndices) 105 | { 106 | FBodyInstance* BI = Mesh->Bodies[BodyIdx]; 107 | ++NumBodiesFound; 108 | if (!Func(BI)) // Early exit if lambda returns false 109 | { 110 | return NumBodiesFound; 111 | } 112 | } 113 | 114 | return NumBodiesFound; 115 | } 116 | } 117 | 118 | void UHitReactStatics::FinalizeMeshPhysics(USkeletalMeshComponent* Mesh) 119 | { 120 | if (Mesh->IsSimulatingPhysics()) 121 | { 122 | Mesh->SetRootBodyIndex(Mesh->RootBodyData.BodyIndex); //Update the root body data cache in case animation has moved root body relative to root joint 123 | } 124 | 125 | Mesh->bBlendPhysics = false; 126 | 127 | UpdateEndPhysicsTickRegisteredState(Mesh); 128 | UpdateClothTickRegisteredState(Mesh); 129 | } 130 | 131 | bool UHitReactStatics::AccumulateBlendWeight(const USkeletalMeshComponent* Mesh, const FName& BoneName, 132 | float BlendWeight, float ClampBlendWeight, float Alpha) 133 | { 134 | const FBodyInstance* BI = Mesh->GetBodyInstance(BoneName); 135 | if (!BI) 136 | { 137 | return false; 138 | } 139 | 140 | return SetBlendWeight(Mesh, BoneName, BI->PhysicsBlendWeight + BlendWeight, ClampBlendWeight, Alpha); 141 | } 142 | 143 | bool UHitReactStatics::SetBlendWeight(const USkeletalMeshComponent* Mesh, const FName& BoneName, float BlendWeight, 144 | float ClampBlendWeight, float Alpha) 145 | { 146 | TRACE_CPUPROFILER_EVENT_SCOPE(UHitReactStatics::SetBlendWeight); 147 | 148 | FBodyInstance* BI = Mesh->GetBodyInstance(BoneName); 149 | if (!BI) 150 | { 151 | return false; 152 | } 153 | 154 | // Clamp the blend weight 155 | BI->PhysicsBlendWeight = FMath::Clamp(BlendWeight, 0.f, ClampBlendWeight); 156 | 157 | // Scale the blend weight by alpha 158 | BI->PhysicsBlendWeight *= Alpha; 159 | 160 | // Apply thresholds 161 | if (FMath::IsNearlyEqual(BI->PhysicsBlendWeight, ClampBlendWeight)) 162 | { 163 | BI->PhysicsBlendWeight = ClampBlendWeight; 164 | } 165 | else if (FMath::IsNearlyZero(BI->PhysicsBlendWeight)) 166 | { 167 | BI->PhysicsBlendWeight = 0.f; 168 | } 169 | 170 | // Set simulate physics if necessary 171 | const bool bWantsSim = BI->PhysicsBlendWeight > 0.f; 172 | if (bWantsSim != BI->bSimulatePhysics) 173 | { 174 | BI->SetInstanceSimulatePhysics(bWantsSim, false, true); 175 | } 176 | 177 | return true; 178 | } 179 | 180 | float UHitReactStatics::GetBoneBlendWeight(const USkeletalMeshComponent* Mesh, const FName& BoneName) 181 | { 182 | TRACE_CPUPROFILER_EVENT_SCOPE(UHitReactStatics::GetBoneBlendWeight); 183 | 184 | const UPhysicsAsset* PhysicsAsset = Mesh->GetPhysicsAsset(); 185 | if (!PhysicsAsset) 186 | { 187 | return 0.f; 188 | } 189 | 190 | const FBodyInstance* BI = Mesh->GetBodyInstance(BoneName); 191 | return BI ? BI->PhysicsBlendWeight : 0.f; 192 | } 193 | 194 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/HitReactTags.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "HitReactTags.h" 5 | 6 | namespace FHitReactTags 7 | { 8 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Default, "HitReact.Profile.Default", "Default hit react profile"); 9 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Default_NoArms, "HitReact.Profile.Default.NoArms", "Blend weight for arms is ignored"); 10 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Default_NoLegs, "HitReact.Profile.Default.NoLegs", "Blend weight for legs is ignored"); 11 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Default_NoLimbs, "HitReact.Profile.Default.NoLimbs", "Blend weight for arms and legs are ignored"); 12 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_BumpPawn, "HitReact.Profile.BumpPawn", "Designed for bumping into other pawns, a very slow and lazy hit react"); 13 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_TakeHit, "HitReact.Profile.TakeHit", "Designed for getting hit by a weapon or a slow firing projectile"); 14 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_TakeHit_NoArms, "HitReact.Profile.TakeHit.NoArms", "Designed for getting hit by a weapon or a slow firing projectile, while ignoring arm bones"); 15 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_TakeHit_NoLegs, "HitReact.Profile.TakeHit.NoLegs", "Designed for getting hit by a weapon or a slow firing projectile, while ignoring leg bones"); 16 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_TakeHit_NoLimbs, "HitReact.Profile.TakeHit.NoLimbs", "Designed for getting hit by a weapon or a slow firing projectile, while ignoring arm and leg bones"); 17 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Twitch, "HitReact.Profile.Twitch", "Designed for rapid re-application of hit reacts, such as taking multiple shots from a fast firing weapon"); 18 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Twitch_NoArms, "HitReact.Profile.Twitch.NoArms", "Designed for rapid re-application of hit reacts, such as taking multiple shots from a fast firing weapon, while ignoring arm bones"); 19 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Twitch_NoLegs, "HitReact.Profile.Twitch.NoLegs", "Designed for rapid re-application of hit reacts, such as taking multiple shots from a fast firing weapon, while ignoring leg bones"); 20 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Twitch_NoLimbs, "HitReact.Profile.Twitch.NoLimbs", "Designed for rapid re-application of hit reacts, such as taking multiple shots from a fast firing weapon, while ignoring arm and leg bones"); 21 | UE_DEFINE_GAMEPLAY_TAG_COMMENT(HitReact_Profile_Flop, "HitReact.Profile.Flop", "Makes the character as floppy as possible, primarily for testing purposes"); 22 | } -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/HitReactTypes.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "HitReactTypes.h" 5 | 6 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactTypes) 7 | 8 | DEFINE_LOG_CATEGORY(LogHitReact); 9 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/Params/HitReactImpulse.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "Params/HitReactImpulse.h" 5 | 6 | #include "HitReactProfile.h" 7 | 8 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactImpulse) 9 | 10 | FHitReactPendingImpulse::FHitReactPendingImpulse(const FHitReactImpulseParams& InImpulse, 11 | const FHitReactImpulse_WorldParams& InWorld, float InImpulseScalar, 12 | const TObjectPtr& InProfile, FName InImpulseBoneName) 13 | : Impulse(InImpulse) 14 | , World(InWorld) 15 | , ImpulseScalar(InImpulseScalar) 16 | , Profile(InProfile) 17 | , ImpulseBoneName(InImpulseBoneName) 18 | {} 19 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/Params/HitReactTrigger.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "Params/HitReactTrigger.h" 5 | 6 | 7 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactTrigger) 8 | 9 | FHitReactImpulse& FHitReactTrigger::GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) 10 | { 11 | switch (ImpulseType) 12 | { 13 | case EHitReactImpulseType::Linear: 14 | return Impulse.LinearImpulse; 15 | case EHitReactImpulseType::Angular: 16 | return Impulse.AngularImpulse; 17 | case EHitReactImpulseType::Radial: 18 | return Impulse.RadialImpulse; 19 | } 20 | return Impulse.LinearImpulse; 21 | } 22 | 23 | const FHitReactImpulse& FHitReactTrigger::GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) const 24 | { 25 | switch (ImpulseType) 26 | { 27 | case EHitReactImpulseType::Linear: 28 | return Impulse.LinearImpulse; 29 | case EHitReactImpulseType::Angular: 30 | return Impulse.AngularImpulse; 31 | case EHitReactImpulseType::Radial: 32 | return Impulse.RadialImpulse; 33 | } 34 | return Impulse.LinearImpulse; 35 | } -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/Physics/HitReactPhysics.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "Physics/HitReactPhysics.h" 5 | 6 | #include "HitReactProfile.h" 7 | #include "PhysicsEngine/PhysicsAsset.h" 8 | 9 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactPhysics) 10 | 11 | 12 | void FHitReactPhysics::HitReact(USkeletalMeshComponent* InMesh, const TObjectPtr& InProfile, 13 | const FName& BoneName, const TArray& InDisabledBones, const TMap& InBoneWeightScalars) 14 | { 15 | TRACE_CPUPROFILER_EVENT_SCOPE(FHitReactPhysics::HitReact); 16 | 17 | // Reset physics states 18 | PhysicsState = {}; 19 | 20 | // Assign properties 21 | Mesh = InMesh; 22 | SimulatedBoneName = BoneName; 23 | Profile = InProfile; 24 | DisabledBones = InDisabledBones; 25 | BoneWeightScalars = InBoneWeightScalars; 26 | 27 | // Activate the physics state 28 | PhysicsState.Params = Profile->BlendParams; 29 | PhysicsState.Activate(); 30 | } 31 | 32 | void FHitReactPhysics::Tick(float DeltaTime) 33 | { 34 | TRACE_CPUPROFILER_EVENT_SCOPE(FHitReactPhysics::Tick); 35 | 36 | // Reset blend weight request 37 | RequestedBlendWeight = 0.f; 38 | MaxBlendWeight = 0.f; 39 | 40 | // Update existing physics states 41 | if (!PhysicsState.IsActive() || !Profile) 42 | { 43 | return; 44 | } 45 | 46 | // Interpolate the physics state 47 | PhysicsState.Tick(DeltaTime); 48 | 49 | // Determine physics blend weight 50 | const float StateAlpha = PhysicsState.GetBlendStateAlpha(); 51 | float BlendWeight = 0.f; 52 | switch (PhysicsState.GetBlendState()) 53 | { 54 | case EHitReactBlendState::BlendIn: 55 | BlendWeight = StateAlpha; 56 | break; 57 | case EHitReactBlendState::BlendHold: 58 | BlendWeight = 1.f; 59 | break; 60 | case EHitReactBlendState::BlendOut: 61 | BlendWeight = 1.f - StateAlpha; 62 | break; 63 | default: break; 64 | } 65 | 66 | // Clamp the blend weight 67 | MaxBlendWeight = Profile->MaxBlendWeight; 68 | RequestedBlendWeight = FMath::Min(BlendWeight, MaxBlendWeight); 69 | } 70 | 71 | bool FHitReactPhysics::IsActive() const 72 | { 73 | return PhysicsState.IsActive(); 74 | } 75 | 76 | bool FHitReactPhysics::HasCompleted() const 77 | { 78 | return PhysicsState.HasCompleted(); 79 | } 80 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/Physics/HitReactPhysicsState.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "Physics/HitReactPhysicsState.h" 5 | 6 | #include "HitReactProfile.h" 7 | 8 | #include UE_INLINE_GENERATED_CPP_BY_NAME(HitReactPhysicsState) 9 | 10 | void FHitReactPhysicsState::UpdateBlendState() 11 | { 12 | if (BlendState == EHitReactBlendState::Completed) 13 | { 14 | return; 15 | } 16 | 17 | if (ElapsedTime < Params.BlendIn.BlendTime) 18 | { 19 | BlendState = EHitReactBlendState::BlendIn; 20 | } 21 | else if (ElapsedTime < Params.BlendIn.BlendTime + Params.BlendHoldTime) 22 | { 23 | BlendState = EHitReactBlendState::BlendHold; 24 | } 25 | else if (ElapsedTime < GetTotalTime()) 26 | { 27 | BlendState = EHitReactBlendState::BlendOut; 28 | } 29 | else 30 | { 31 | BlendState = EHitReactBlendState::Completed; 32 | } 33 | } 34 | 35 | FString FHitReactPhysicsState::GetBlendStateString() const 36 | { 37 | switch (BlendState) 38 | { 39 | case EHitReactBlendState::Pending: return "Pending"; 40 | case EHitReactBlendState::BlendIn: return "BlendIn"; 41 | case EHitReactBlendState::BlendHold: return "BlendHold"; 42 | case EHitReactBlendState::BlendOut: return "BlendOut"; 43 | case EHitReactBlendState::Completed: return "Completed"; 44 | default: return "Unknown"; 45 | } 46 | } 47 | 48 | void FHitReactPhysicsState::Reset() 49 | { 50 | BlendState = EHitReactBlendState::Pending; 51 | ElapsedTime = 0.f; 52 | } 53 | 54 | bool FHitReactPhysicsState::CanActivate(const FHitReactPhysicsStateParams& WithParams) 55 | { 56 | // Avoid division by zero and non-sane values 57 | if (WithParams.GetTotalTime() <= 0.f) 58 | { 59 | return false; 60 | } 61 | 62 | return true; 63 | } 64 | 65 | void FHitReactPhysicsState::Activate() 66 | { 67 | BlendState = EHitReactBlendState::BlendIn; 68 | ElapsedTime = 0.f; 69 | } 70 | 71 | void FHitReactPhysicsState::Finish() 72 | { 73 | BlendState = EHitReactBlendState::Completed; 74 | ElapsedTime = GetTotalTime(); 75 | } 76 | 77 | float FHitReactPhysicsState::GetBlendTime() const 78 | { 79 | switch (BlendState) 80 | { 81 | case EHitReactBlendState::Pending: return 0.f; 82 | case EHitReactBlendState::BlendIn: return Params.BlendIn.BlendTime; 83 | case EHitReactBlendState::BlendHold: return Params.BlendHoldTime; 84 | case EHitReactBlendState::BlendOut: return Params.BlendOut.BlendTime; 85 | case EHitReactBlendState::Completed: return 0.f; 86 | default: return 0.f; 87 | } 88 | } 89 | 90 | void FHitReactPhysicsState::SetElapsedTime(float InElapsedTime) 91 | { 92 | ElapsedTime = FMath::Clamp(InElapsedTime, 0.f, GetTotalTime()); 93 | UpdateBlendState(); 94 | } 95 | 96 | float FHitReactPhysicsState::GetTotalStateTime() const 97 | { 98 | switch (BlendState) 99 | { 100 | case EHitReactBlendState::BlendIn: 101 | return Params.BlendIn.BlendTime; 102 | case EHitReactBlendState::BlendHold: 103 | return Params.BlendHoldTime; 104 | case EHitReactBlendState::BlendOut: 105 | return Params.BlendOut.BlendTime; 106 | default: 107 | return 0.f; 108 | } 109 | } 110 | 111 | float FHitReactPhysicsState::GetElapsedStateTime() const 112 | { 113 | switch (BlendState) 114 | { 115 | case EHitReactBlendState::BlendIn: 116 | return FMath::Clamp(ElapsedTime, 0.f, Params.BlendIn.BlendTime); 117 | case EHitReactBlendState::BlendHold: 118 | return FMath::Clamp(ElapsedTime - Params.BlendIn.BlendTime, 0.f, Params.BlendHoldTime); 119 | case EHitReactBlendState::BlendOut: 120 | return FMath::Clamp(ElapsedTime - Params.BlendIn.BlendTime - Params.BlendHoldTime, 0.f, Params.BlendOut.BlendTime); 121 | default: 122 | return 0.f; 123 | } 124 | } 125 | 126 | void FHitReactPhysicsState::SetElapsedAlpha(float InAlpha) 127 | { 128 | const float TotalStateTime = GetTotalTime(); 129 | if (TotalStateTime <= 0.f) 130 | { 131 | return; 132 | } 133 | SetElapsedTime(InAlpha * TotalStateTime); 134 | } 135 | 136 | float FHitReactPhysicsState::GetBlendStateAlpha() const 137 | { 138 | const float ElapsedStateTime = GetElapsedStateTime(); 139 | const float TotalStateTime = GetTotalStateTime(); 140 | if (TotalStateTime <= 0.f) 141 | { 142 | return 0.f; 143 | } 144 | const float Alpha = ElapsedStateTime / TotalStateTime; 145 | 146 | // Perform our easing function here 147 | if (const FHitReactBlendParams* BlendParams = GetBlendParams()) 148 | { 149 | return FMath::Clamp(BlendParams->Ease(Alpha), 0.f, 1.f); 150 | } 151 | return Alpha; 152 | } 153 | 154 | float FHitReactPhysicsState::GetElapsedAlpha() const 155 | { 156 | const float TotalStateTime = GetTotalTime(); 157 | if (TotalStateTime <= 0.f) 158 | { 159 | return 0.f; 160 | } 161 | return FMath::Clamp(ElapsedTime / TotalStateTime, 0.f, 1.f); 162 | } 163 | 164 | const FHitReactBlendParams* FHitReactPhysicsState::GetBlendParams() const 165 | { 166 | switch (BlendState) 167 | { 168 | case EHitReactBlendState::BlendIn: return &Params.BlendIn; 169 | case EHitReactBlendState::BlendOut: return &Params.BlendOut; 170 | default: return nullptr; 171 | } 172 | } 173 | 174 | bool FHitReactPhysicsState::Tick(float DeltaTime) 175 | { 176 | TRACE_CPUPROFILER_EVENT_SCOPE(FHitReactPhysicsState::Tick); 177 | 178 | // Nothing to do if we're completed 179 | if (HasCompleted()) 180 | { 181 | return true; 182 | } 183 | 184 | // Process the decay state 185 | if (IsDecaying()) 186 | { 187 | const float PrevDecayTime = DecayTime; 188 | 189 | // We want to retain the remaining delta time after decay is clamped, otherwise we'll lose time 190 | const float TargetDecayTime = DecayTime - DeltaTime; 191 | 192 | // Clamp the decay time 193 | DecayTime = FMath::Clamp(TargetDecayTime, 0.f, Params.MaxAccumulatedDecayTime); 194 | 195 | // Calculate the remaining delta time after decay 196 | DeltaTime = FMath::Max(0.f, TargetDecayTime - DecayTime); 197 | 198 | // Update the elapsed time to account for the decay 199 | const float DecayDelta = PrevDecayTime - DecayTime; 200 | SetElapsedTime(ElapsedTime - DecayDelta); 201 | 202 | if (!IsDecaying()) 203 | { 204 | // ReSharper disable once CppExpressionWithoutSideEffects 205 | OnDecayComplete.ExecuteIfBound(); 206 | } 207 | 208 | // DeltaTime is now the remaining time after decay, but may be zero 209 | if (DeltaTime < 1e-6f) 210 | { 211 | return HasCompleted(); 212 | } 213 | } 214 | 215 | // Process the blend states 216 | if (!IsDecaying()) 217 | { 218 | SetElapsedTime(ElapsedTime + DeltaTime); 219 | } 220 | 221 | // Notify if we've completed 222 | return HasCompleted(); 223 | } 224 | 225 | bool FHitReactPhysicsStateSimple::Tick(float DeltaTime) 226 | { 227 | TRACE_CPUPROFILER_EVENT_SCOPE(FHitReactPhysicsStateSimple::Tick); 228 | 229 | if (HasCompleted()) 230 | { 231 | return true; 232 | } 233 | 234 | if (bToggleEnabled) 235 | { 236 | SetElapsedTime(ElapsedTime + DeltaTime); 237 | } 238 | else 239 | { 240 | SetElapsedTime(ElapsedTime - DeltaTime); 241 | } 242 | 243 | return HasCompleted(); 244 | } 245 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Private/ProcHitReact.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #include "ProcHitReact.h" 4 | 5 | #define LOCTEXT_NAMESPACE "FProcHitReactModule" 6 | 7 | void FProcHitReactModule::StartupModule() 8 | { 9 | // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module 10 | } 11 | 12 | void FProcHitReactModule::ShutdownModule() 13 | { 14 | // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, 15 | // we call this function before unloading the module. 16 | } 17 | 18 | #undef LOCTEXT_NAMESPACE 19 | 20 | IMPLEMENT_MODULE(FProcHitReactModule, ProcHitReact) -------------------------------------------------------------------------------- /Source/ProcHitReact/ProcHitReact.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | using UnrealBuildTool; 4 | using EpicGames.Core; 5 | 6 | public class ProcHitReact : ModuleRules 7 | { 8 | public ProcHitReact(ReadOnlyTargetRules Target) : base(Target) 9 | { 10 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 11 | 12 | PublicDependencyModuleNames.AddRange( 13 | new string[] 14 | { 15 | "Core", 16 | "GameplayTags", 17 | } 18 | ); 19 | 20 | 21 | PrivateDependencyModuleNames.AddRange( 22 | new string[] 23 | { 24 | "CoreUObject", 25 | "Engine", 26 | "PhysicsCore", 27 | } 28 | ); 29 | 30 | if (Target.bBuildEditor) 31 | { 32 | // FNotificationInfo & FSlateNotificationManager 33 | PrivateDependencyModuleNames.Add("Slate"); 34 | } 35 | 36 | // Add pre-processor macros for the GameplayAbilities plugin based on enabled state (optional plugin) 37 | PublicDefinitions.Add("WITH_GAMEPLAY_ABILITIES=0"); 38 | if (JsonObject.TryRead(Target.ProjectFile, out var rawObject)) 39 | { 40 | if (rawObject.TryGetObjectArrayField("Plugins", out var pluginObjects)) 41 | { 42 | foreach (JsonObject pluginObject in pluginObjects) 43 | { 44 | pluginObject.TryGetStringField("Name", out var pluginName); 45 | 46 | pluginObject.TryGetBoolField("Enabled", out var pluginEnabled); 47 | 48 | if (pluginName == "GameplayAbilities" && pluginEnabled) 49 | { 50 | PrivateDependencyModuleNames.Add("GameplayAbilities"); 51 | PublicDefinitions.Add("WITH_GAMEPLAY_ABILITIES=1"); 52 | PublicDefinitions.Remove("WITH_GAMEPLAY_ABILITIES=0"); 53 | } 54 | } 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/HitReact.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "GameplayTagContainer.h" 7 | #include "HitReactTypes.h" 8 | #include "Physics/HitReactPhysics.h" 9 | #include "Components/ActorComponent.h" 10 | #include "Params/HitReactImpulse.h" 11 | #include "Params/HitReactParams.h" 12 | #include "Params/HitReactTrigger.h" 13 | #include "ThirdParty/AsyncMixinProc.h" 14 | #include "System/HitReactVersioning.h" 15 | #include "HitReact.generated.h" 16 | 17 | class UHitReactProfile; 18 | class UPhysicalAnimationComponent; 19 | 20 | DECLARE_DYNAMIC_DELEGATE(FOnHitReactInitialized); 21 | DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHitReactToggleStateChanged, EHitReactToggleState, NewState); 22 | 23 | /** 24 | * Component for applying hit reactions to a skeletal mesh 25 | */ 26 | UCLASS(Config=Game, ClassGroup=(Custom), Blueprintable, meta=(BlueprintSpawnableComponent)) 27 | class PROCHITREACT_API UHitReact : public UActorComponent, public FAsyncMixinProc 28 | { 29 | GENERATED_BODY() 30 | 31 | public: 32 | /** 33 | * Rate at which to update the hit react simulation 34 | * Higher values will result in more accurate simulation, but may be more expensive 35 | * 60 recommended for balanced quality 36 | * @warning Values below 60fps can look jittery 37 | */ 38 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact, meta=(EditCondition="bUseFixedSimulationRate", UIMin="1", ClampMin="1", UIMax="120", Delta="1")) 39 | float SimulationRate = 60.f; 40 | 41 | /** Hit react profiles available for use when applying hit reacts */ 42 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact) 43 | TArray> AvailableProfiles; 44 | 45 | /** Hit react bone data available for use when applying hit reacts */ 46 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact) 47 | TArray> AvailableBoneData; 48 | 49 | /** If true, update at the SimulationRate instead of each Tick */ 50 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact, meta=(InlineEditConditionToggle)) 51 | bool bUseFixedSimulationRate = true; 52 | 53 | /** 54 | * Hit reacts will not trigger until Cooldown has lapsed 55 | * This affects every HitReact regardless of profile 56 | */ 57 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact, meta=(UIMin="0", ClampMin="0", UIMax="1", Delta="0.01", ForceUnits="s")) 58 | float Cooldown = 0.f; 59 | 60 | /** 61 | * These bones cannot be simulated 62 | * Attempting to simulate these bones will not necessarily fail, 63 | * because the system will attempt to simulate the parent bone 64 | */ 65 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact) 66 | TArray BlacklistedBones = { "root", "pelvis" }; 67 | 68 | /** Whether to apply hit reacts on dedicated servers */ 69 | UPROPERTY(Config, EditDefaultsOnly, BlueprintReadOnly, AdvancedDisplay, Category=HitReact) 70 | bool bApplyHitReactOnDedicatedServer = false; 71 | 72 | /** Global interp toggle parameters for enabling and disabling the hit react system */ 73 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 74 | FHitReactGlobalToggle GlobalToggle; 75 | 76 | protected: 77 | /** Bones currently being simulated */ 78 | UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category=HitReact) 79 | TArray PhysicsBlends; 80 | 81 | /** We interpolate the amount of active per-bone blends for averaging, so changes in PhysicsBlends don't cause a snap */ 82 | UPROPERTY() 83 | TMap SmoothedBoneWeights; 84 | 85 | /** Pending impulse to apply on the next Tick */ 86 | UPROPERTY() 87 | FHitReactPendingImpulse PendingImpulse; 88 | 89 | /** Loaded profiles from AvailableProfiles ready to be used */ 90 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 91 | TArray> ActiveProfiles; 92 | 93 | /** Loaded bone data from AvailableBoneData ready to be used */ 94 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 95 | TArray> ActiveBoneData; 96 | 97 | UPROPERTY() 98 | uint64 CurrentId = 0; 99 | 100 | /** True if the profiles have been loaded */ 101 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 102 | bool bProfilesLoaded = false; 103 | 104 | /** True if the hit react system has completed it's initialization */ 105 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 106 | bool bHasInitialized = false; 107 | 108 | /** Last time a hit reaction was applied - prevent rapid application causing poor results */ 109 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 110 | float LastHitReactTime = -1.f; 111 | 112 | /** Last time a hit reaction was applied for a specific profile */ 113 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 114 | TMap, float> LastProfileHitReactTimes; 115 | 116 | /** True if the physical animation profile was changed, and should be removed upon completion of all hit reacts */ 117 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 118 | bool bPhysicalAnimationProfileChanged; 119 | 120 | /** True if the constraint profile was changed, and should be removed upon completion of all hit reacts */ 121 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 122 | bool bConstraintProfileChanged; 123 | 124 | /** True if the collision was changed, and should be reverted upon completion of all hit reacts */ 125 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadOnly, Category="HitReact|Internal") 126 | bool bCollisionEnabledChanged; 127 | 128 | /** Default collision state to revert to when hit reacts are completed */ 129 | UPROPERTY() 130 | TEnumAsByte DefaultCollisionEnabled; 131 | 132 | /** Mesh to simulate hit reactions on */ 133 | UPROPERTY(Transient, DuplicateTransient, BlueprintReadOnly, Category="HitReact|References") 134 | TObjectPtr Mesh; 135 | 136 | /** Owner Pawn, if the owner is actually a Pawn, otherwise nullptr */ 137 | UPROPERTY(Transient, DuplicateTransient, BlueprintReadOnly, Category="HitReact|References") 138 | TObjectPtr OwnerPawn; 139 | 140 | /** Physical animation component to apply physical animation profiles */ 141 | UPROPERTY(Transient, DuplicateTransient, BlueprintReadOnly, Category="HitReact|References") 142 | TObjectPtr PhysicalAnimation; 143 | 144 | #if WITH_GAMEPLAY_ABILITIES 145 | TWeakObjectPtr AbilitySystemComponent; 146 | #endif 147 | 148 | public: 149 | /** Called when the hit react system is toggled on or off */ 150 | UPROPERTY(BlueprintAssignable, Category=HitReact) 151 | FOnHitReactToggleStateChanged OnHitReactToggleStateChanged; 152 | 153 | public: 154 | const TArray& GetPhysicsBlends() const { return PhysicsBlends; } 155 | 156 | public: 157 | UHitReact(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); 158 | 159 | /** 160 | * Trigger a hit reaction on the specified bone 161 | * @param Params The hit react input parameters 162 | * @param Impulse The impulse parameters to apply 163 | * @param World The world space parameters to apply 164 | * @param ImpulseScalar Universal scalar to apply to all impulses included in ImpulseParams 165 | * @return True if the hit react was applied 166 | */ 167 | UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category=HitReact) 168 | bool HitReact(const FHitReactInputParams& Params, FHitReactImpulseParams Impulse, 169 | const FHitReactImpulse_WorldParams& World, float ImpulseScalar = 1.f); 170 | 171 | /** 172 | * Trigger a hit reaction on the specified bone using FHitReactTrigger Params 173 | * Typically used when replicating FHitReactApplyParams, for convenience 174 | * @param Params The hit react trigger parameters 175 | * @param World The world space parameters to apply 176 | * @param ImpulseScalar The scalar to apply to the impulse 177 | * @return True if the hit react was applied 178 | */ 179 | UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category=HitReact, meta=(DisplayName="Hit React Trigger")) 180 | bool HitReactTrigger(const FHitReactTrigger& Params, const FHitReactImpulse_WorldParams& World, 181 | float ImpulseScalar = 1.f); 182 | 183 | /** 184 | * Trigger a hit reaction on the specified bone using ApplyParamsLinear 185 | * Typically used when replicating FHitReactApplyParamsLinear, for convenience 186 | * @param Params The hit react trigger parameters 187 | * @param World The world space parameters to apply 188 | * @param ImpulseScalar The scalar to apply to the impulse 189 | * @return True if the hit react was applied 190 | */ 191 | UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category=HitReact, meta=(DisplayName="Hit React Trigger (Linear)")) 192 | bool HitReactTrigger_Linear(const FHitReactTrigger_Linear& Params, const FHitReactImpulse_WorldParams& World, 193 | float ImpulseScalar = 1.f); 194 | 195 | /** 196 | * Trigger a hit reaction on the specified bone using ApplyParamsAngular 197 | * Typically used when replicating FHitReactApplyParamsAngular, for convenience 198 | * @param Params The hit react trigger parameters 199 | * @param World The world space parameters to apply 200 | * @param ImpulseScalar The scalar to apply to the impulse 201 | * @return True if the hit react was applied 202 | */ 203 | UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category=HitReact, meta=(DisplayName="Hit React Trigger (Angular)")) 204 | bool HitReactTrigger_Angular(const FHitReactTrigger_Angular& Params, const FHitReactImpulse_WorldParams& World, 205 | float ImpulseScalar = 1.f); 206 | 207 | /** 208 | * Trigger a hit reaction on the specified bone using ApplyParamsRadial 209 | * Typically used when replicating FHitReactApplyParamsRadial, for convenience 210 | * @param Params The hit react trigger parameters 211 | * @param World The world space parameters to apply 212 | * @param ImpulseScalar The scalar to apply to the impulse 213 | * @return True if the hit react was applied 214 | */ 215 | UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category=HitReact, meta=(DisplayName="Hit React Trigger (Radial)")) 216 | bool HitReactTrigger_Radial(const FHitReactTrigger_Radial& Params, const FHitReactImpulse_WorldParams& World, 217 | float ImpulseScalar = 1.f); 218 | 219 | virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; 220 | 221 | void TickGlobalToggle(float DeltaTime); 222 | 223 | void ApplyImpulse(const FHitReactPendingImpulse& Impulse) const; 224 | 225 | void ApplyImpulse(const FHitReactImpulseParams& Impulse, const FHitReactImpulse_WorldParams& World, float ImpulseScalar, 226 | const UHitReactProfile* Profile, FName ImpulseBoneName) const; 227 | 228 | public: 229 | /** 230 | * Called prior to Activating the hit react system 231 | * Convenient location to cast and cache the owner 232 | * @param bReset - Whether we will reset the system before activating 233 | */ 234 | UFUNCTION(BlueprintNativeEvent, Category=HitReact) 235 | void PreActivate(bool bReset); 236 | virtual void PreActivate_Implementation(bool bReset) {} 237 | 238 | virtual void Activate(bool bReset) override; 239 | virtual void Deactivate() override; 240 | 241 | virtual void OnFinishedLoading() override; 242 | 243 | /** Called when the hit react system is initialized */ 244 | UFUNCTION(BlueprintCallable, Category=HitReact) 245 | bool OnHitReactInitialized(FOnHitReactInitialized Delegate); 246 | 247 | protected: 248 | TArray> RegisteredInitDelegates; 249 | 250 | public: 251 | /** 252 | * Instantly disables the system entirely if currently running, clearing all active hit reacts, if false 253 | * To disable the system smoothly use ToggleHitReactSystem instead 254 | * Consider using IsAnyHitReactInProgress to check if the system is currently running 255 | * @return False if no hit reacts can be applied 256 | */ 257 | UFUNCTION(BlueprintNativeEvent, BlueprintCosmetic, Category=HitReact) 258 | bool CanHitReact() const; 259 | virtual bool CanHitReact_Implementation() const { return true; } 260 | 261 | public: 262 | /** 263 | * Toggle the hit react system on or off 264 | * @param bEnabled - Whether to enable or disable the hit react system 265 | * @param bInterpolateState - Whether to interpolate the state change 266 | * @param bUseDefaultBlendParams - Whether to use the default blend parameters, if False, BlendParams will be used 267 | * @param BlendParams - Interpolation parameters to use - will not be applied if bInterpolateState is false - requires bUseDefaultBlendParams to be false 268 | */ 269 | UFUNCTION(BlueprintCallable, BlueprintCosmetic, Category=HitReact) 270 | void ToggleHitReactSystem(bool bEnabled, bool bInterpolateState = true, bool bUseDefaultBlendParams = true, 271 | FHitReactPhysicsStateParamsSimple BlendParams = FHitReactPhysicsStateParamsSimple()); 272 | 273 | /** Current toggle state of the hit react system */ 274 | UFUNCTION(BlueprintPure, BlueprintCosmetic, Category=HitReact) 275 | EHitReactToggleState GetHitReactToggleState() const; 276 | 277 | /** @return True if the hit react system is enabled or enabling */ 278 | UFUNCTION(BlueprintPure, BlueprintCosmetic, Category=HitReact) 279 | bool IsHitReactSystemEnabled() const 280 | { 281 | return GetHitReactToggleState() == EHitReactToggleState::Enabled || GetHitReactToggleState() == EHitReactToggleState::Enabling; 282 | } 283 | 284 | /** @return True if the hit react system is currently enabling or disabling */ 285 | UFUNCTION(BlueprintPure, BlueprintCosmetic, Category=HitReact) 286 | bool IsHitReactSystemToggleInProgress() const 287 | { 288 | return GetHitReactToggleState() == EHitReactToggleState::Enabling || GetHitReactToggleState() == EHitReactToggleState::Disabling; 289 | } 290 | 291 | /** @return True if the hit react system is disabled or disabling */ 292 | UFUNCTION(BlueprintPure, BlueprintCosmetic, Category=HitReact) 293 | bool IsHitReactSystemDisabled() const { return !IsHitReactSystemEnabled(); } 294 | 295 | protected: 296 | /** 297 | * Stop ticking if True 298 | * Will wake up when hit reacts are applied or global toggle state changes 299 | */ 300 | virtual bool ShouldSleep() const; 301 | 302 | /** Is tick disabled */ 303 | bool IsSleeping() const; 304 | 305 | /** Resume ticking */ 306 | virtual void WakeHitReact(); 307 | 308 | /** Disable ticking */ 309 | virtual void SleepHitReact(); 310 | 311 | public: 312 | /** 313 | * Mesh needs to use QueryAndPhysics or PhysicsOnly for CollisionEnabled 314 | * @return True if mesh needs to change to valid collision properties 315 | */ 316 | bool NeedsCollisionEnabled() const; 317 | 318 | public: 319 | /** Get the mesh to simulate from the owner */ 320 | UFUNCTION(BlueprintNativeEvent, BlueprintCosmetic, Category=HitReact) 321 | USkeletalMeshComponent* GetMeshFromOwner() const; 322 | 323 | /** Get the cached mesh to simulate */ 324 | UFUNCTION(BlueprintPure, BlueprintCosmetic, Category=HitReact) 325 | USkeletalMeshComponent* GetMesh() const { return Mesh; } 326 | 327 | /** Get the PhysicalAnimationComponent from the owner */ 328 | UFUNCTION(BlueprintNativeEvent, BlueprintCosmetic, Category=HitReact) 329 | UPhysicalAnimationComponent* GetPhysicalAnimationComponentFromOwner() const; 330 | 331 | /** 332 | * Get the PhysicalAnimationComponent 333 | * Can be null if the owner does not have a PhysicalAnimationComponent 334 | * Used to set animation profiles and apply physical animation settings 335 | */ 336 | UFUNCTION(BlueprintPure, BlueprintCosmetic, Category=HitReact) 337 | UPhysicalAnimationComponent* GetPhysicalAnimationComponent() const { return PhysicalAnimation; } 338 | 339 | protected: 340 | UFUNCTION() 341 | virtual void OnMeshPoseInitialized(); 342 | 343 | virtual void ResetHitReactSystem(); 344 | 345 | protected: 346 | bool ShouldCVarDrawDebug(int32 CVarValue) const; 347 | bool IsLocallyControlledPlayer() const; 348 | 349 | uint64 GetUniqueDrawDebugKey(int32 Offset) const { return (GetUniqueID() + Offset) % UINT32_MAX; } 350 | 351 | private: 352 | /** 353 | * Notify user of the result of a hit react 354 | * Useful for debugging 355 | */ 356 | void DebugHitReactResult(const FString& Result, bool bFailed) const; 357 | 358 | #if WITH_EDITOR 359 | #if UE_5_03_OR_LATER 360 | virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override; 361 | #else 362 | virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) override; 363 | #endif 364 | #endif 365 | }; 366 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/HitReactBoneData.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Engine/DataAsset.h" 7 | #include "Params/HitReactParams.h" 8 | #include "HitReactBoneData.generated.h" 9 | 10 | /** 11 | * Contains per-bone data that can be reused regardless of the chosen profile 12 | * Joined with the profile's params 13 | */ 14 | UCLASS() 15 | class PROCHITREACT_API UHitReactBoneData : public UDataAsset 16 | { 17 | GENERATED_BODY() 18 | 19 | public: 20 | /** 21 | * Bone-specific override params 22 | * Will be joined with the profile's params 23 | */ 24 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Bones) 25 | TMap BoneOverrides; 26 | }; 27 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/HitReactProfile.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Engine/DataAsset.h" 7 | #include "Params/HitReactParams.h" 8 | #include "System/HitReactVersioning.h" 9 | #include "HitReactProfile.generated.h" 10 | 11 | /** 12 | * Profiles define how hit reactions are applied to a skeletal mesh 13 | */ 14 | UCLASS(Blueprintable, BlueprintType) 15 | class PROCHITREACT_API UHitReactProfile : public UDataAsset 16 | { 17 | GENERATED_BODY() 18 | 19 | public: 20 | #if WITH_EDITORONLY_DATA 21 | /** Description of this profile -- editor only */ 22 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact, meta=(MultiLine="true")) 23 | FString Description; 24 | #endif 25 | 26 | /** 27 | * The blend parameters to apply 28 | * Interpolation state handling for hit reactions 29 | */ 30 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact) 31 | FHitReactPhysicsStateParams BlendParams; 32 | 33 | /** Maximum weight provided to physical animation (0 is disabled, 1 is full) */ 34 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(UIMin="0", ClampMin="0", UIMax="1", ClampMax="1", Delta="0.05", ForceUnits="%")) 35 | float MaxBlendWeight; 36 | 37 | /** 38 | * How fast bones blend to the target weight -- this is averaged between all active hit reacts 39 | * This is typically blending a value of 0-1 so lower values are used 40 | * 41 | * Values exceeding 10.f typically experience snapping as a result of almost no blending 42 | * Generally you want this as high as possible without snapping 43 | * 44 | * Blending bones is required because if we have multiple hit reacts, we have to either sum average, but the averaging 45 | * calculation changes the position when hit reacts start or end causing a snap, and sum isn't a good result, 46 | * so the only way to prevent this is to blend the bones 47 | */ 48 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Bones, meta=(UIMin="0", ClampMin="0", UIMax="12", Delta="1.0", ForceUnits="x")) 49 | float BoneBlendRate; 50 | 51 | /** 52 | * Hit reacts will not trigger until Cooldown has lapsed when repeating this profile 53 | * Trigger may still be prevented by global cooldown even if this is met -- global cooldown overrides this one 54 | */ 55 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact, meta=(UIMin="0", ClampMin="0", UIMax="1", Delta="0.01", ForceUnits="s")) 56 | float Cooldown; 57 | 58 | /** 59 | * How to handle the application of this profile when the maximum number of physics blends are active 60 | */ 61 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact) 62 | EHitReactMaxBlendHandling MaxBlendHandling; 63 | 64 | /** 65 | * Handle the application of this profile based on MaxBlendHandling if there are too many blends already simulating 66 | */ 67 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=HitReact, meta=(UIMin="1", ClampMin="1", EditCondition="MaxBlendHandling != EHitReactMaxBlendHandling::Disabled", EditConditionHides)) 68 | int32 MaxActiveBlends; 69 | 70 | /** 71 | * Scale the impulse based on the number of times the bone has been hit prior to completing the hit react 72 | * The first array element is the scalar for the first subsequent hit, and so on 73 | * This is used to throttle the impulse applied to the bone as it is hit multiple times 74 | */ 75 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics) 76 | TArray SubsequentImpulseScalars; 77 | 78 | /** 79 | * Remap the bone name to a different bone name 80 | * This is useful for remapping bones that don't look good simulating on their own 81 | * e.g. remapping hand_r and lowerarm_r to upperarm_r 82 | * 83 | * @note This does not stop them from simulating, if you remap a bone to it's parent, the parent will simulate 84 | * its child bones including this one. Blacklist the bone to prevent simulation if required 85 | */ 86 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Bones) 87 | TMap RemapSimulatedBones; 88 | 89 | /** Bone-specific override params */ 90 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Bones) 91 | TMap BoneOverrides; 92 | 93 | /** 94 | * Physical animation profile to apply to this bone and any below 95 | * Requires a Physical Animation Component to exist on the owning actor 96 | */ 97 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Physics) 98 | FName PhysicalAnimProfile; 99 | 100 | /** 101 | * Constraint profile to apply to all bones 102 | * This is applied to the physics asset on the mesh 103 | */ 104 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Physics) 105 | FName ConstraintProfile; 106 | 107 | /* 108 | * Max LOD that this hit react is allowed to run 109 | * For example if you have LODThreshold to be 2, it will run until LOD 2 (based on 0 index) 110 | * when the component LOD becomes 3, it will stop update/evaluate 111 | * currently transition would be issue and that has to be re-visited 112 | */ 113 | UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=Performance, meta=(DisplayName="LOD Threshold", ClampMin="-1", UIMin="-1")) 114 | int32 LODThreshold; 115 | 116 | public: 117 | UHitReactProfile() 118 | : MaxBlendWeight(0.4f) 119 | , BoneBlendRate(10.f) 120 | , Cooldown(0.05f) 121 | , MaxBlendHandling(EHitReactMaxBlendHandling::Disabled) 122 | , MaxActiveBlends(50) 123 | , SubsequentImpulseScalars({ 124 | { 0.1f, 0.35f }, 125 | { 0.25f, 0.5f }, 126 | { 0.35f, 0.7f }, 127 | { 0.5f, 0.9f } }) 128 | , PhysicalAnimProfile(NAME_None) 129 | , ConstraintProfile(NAME_None) 130 | , LODThreshold(-1) 131 | {} 132 | 133 | #if WITH_EDITOR 134 | #if UE_5_03_OR_LATER 135 | virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override; 136 | #else 137 | virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) override; 138 | #endif 139 | #endif 140 | }; 141 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/HitReactStatics.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Kismet/BlueprintFunctionLibrary.h" 7 | #include "HitReactStatics.generated.h" 8 | 9 | struct FHitReactGlobals; 10 | struct FHitReactBone; 11 | struct FHitReactPhysics; 12 | enum class EHitReactBlendState : uint8; 13 | class UHitReact; 14 | class USkeletalMeshComponent; 15 | struct FBodyInstance; 16 | /** 17 | * Function library for HitReact with common utility functions 18 | */ 19 | UCLASS() 20 | class PROCHITREACT_API UHitReactStatics : public UBlueprintFunctionLibrary 21 | { 22 | GENERATED_BODY() 23 | 24 | protected: 25 | static bool DoAnyPhysicsBodiesHaveWeight(const USkeletalMeshComponent* Mesh); 26 | static bool ShouldBlendPhysicsBones(const USkeletalMeshComponent* Mesh); 27 | static bool ShouldRunEndPhysicsTick(const USkeletalMeshComponent* Mesh); 28 | static bool ShouldRunClothTick(const USkeletalMeshComponent* Mesh); 29 | static void UpdateEndPhysicsTickRegisteredState(USkeletalMeshComponent* Mesh); 30 | static void UpdateClothTickRegisteredState(USkeletalMeshComponent* Mesh); 31 | 32 | public: 33 | /** Retrieve the bone name based on the FBodyInstance::InstanceBoneIndex */ 34 | static FName GetBoneName(const USkeletalMeshComponent* Mesh, const FBodyInstance* BI); 35 | 36 | /** Convenience wrapper for Mesh->ForEachBodyBelow */ 37 | static int32 ForEach(USkeletalMeshComponent* Mesh, FName BoneName, bool bIncludeSelf, const TFunctionRef& Func); 38 | 39 | public: 40 | /** Finalize the physics state of the mesh, must be called after modifying blend weights or simulate physics state */ 41 | static void FinalizeMeshPhysics(USkeletalMeshComponent* Mesh); 42 | 43 | /** Accumulate the blend weight for the given bone */ 44 | static bool AccumulateBlendWeight(const USkeletalMeshComponent* Mesh, const FName& BoneName, float BlendWeight, float ClampBlendWeight, float Alpha); 45 | 46 | /** Set the blend weight for the given bone */ 47 | static bool SetBlendWeight(const USkeletalMeshComponent* Mesh, const FName& BoneName, float BlendWeight, float ClampBlendWeight = 1.f, float Alpha = 1.f); 48 | 49 | /** @return Blend Weight for the given bone ( FBodyInstance::PhysicsBlendWeight ) */ 50 | UFUNCTION(BlueprintPure, Category=HitReact) 51 | static float GetBoneBlendWeight(const USkeletalMeshComponent* Mesh, const FName& BoneName); 52 | }; -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/HitReactTags.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "NativeGameplayTags.h" 6 | 7 | /** 8 | * Contains tags used by the ProcHitReact plugin. 9 | */ 10 | namespace FHitReactTags 11 | { 12 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Default); 13 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Default_NoArms); 14 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Default_NoLegs); 15 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Default_NoLimbs); 16 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_BumpPawn); 17 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_TakeHit); 18 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_TakeHit_NoArms); 19 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_TakeHit_NoLegs); 20 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_TakeHit_NoLimbs); 21 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Twitch); 22 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Twitch_NoArms); 23 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Twitch_NoLegs); 24 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Twitch_NoLimbs); 25 | PROCHITREACT_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(HitReact_Profile_Flop); 26 | } -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/HitReactTypes.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "HitReactTypes.generated.h" 7 | 8 | DECLARE_LOG_CATEGORY_EXTERN(LogHitReact, Log, All); 9 | 10 | /** 11 | * Global toggle state for the hit reaction system 12 | */ 13 | UENUM(BlueprintType) 14 | enum class EHitReactToggleState : uint8 15 | { 16 | Disabled, 17 | Disabling, 18 | Enabling, 19 | Enabled 20 | }; 21 | 22 | UENUM(BlueprintType) 23 | enum class EHitReactMaxBlendHandling : uint8 24 | { 25 | Disabled UMETA(ToolTip="Apply the hit react regardless of how many blends are active"), 26 | ImpulseOnly UMETA(ToolTip="Only apply the impulse without modifying bone blend weights"), 27 | Blocked UMETA(ToolTip="Block the hit react if the maximum number of blends are active"), 28 | }; -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/Params/HitReactImpulse.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "HitReactImpulse.generated.h" 7 | 8 | class UHitReactProfile; 9 | 10 | /** 11 | * Type of impulse to apply 12 | */ 13 | UENUM(BlueprintType) 14 | enum class EHitReactImpulseType : uint8 15 | { 16 | Linear, 17 | Angular, 18 | Radial, 19 | }; 20 | 21 | /** 22 | * Units for angular impulses 23 | */ 24 | UENUM(BlueprintType) 25 | enum class EHitReactUnits : uint8 26 | { 27 | Degrees, 28 | Radians 29 | }; 30 | 31 | /** 32 | * How the strength of the impulse should fall off with distance 33 | */ 34 | UENUM(BlueprintType) 35 | enum class EHitReactFalloff : uint8 36 | { 37 | Linear, 38 | Constant, 39 | }; 40 | 41 | /** 42 | * Base impulse params for applying hit reactions 43 | */ 44 | USTRUCT(BlueprintType) 45 | struct PROCHITREACT_API FHitReactImpulse 46 | { 47 | GENERATED_BODY() 48 | 49 | FHitReactImpulse() 50 | : bApplyImpulse(false) 51 | , bFactorMass(false) 52 | , Impulse(500.f) 53 | {} 54 | virtual ~FHitReactImpulse() = default; 55 | 56 | /** If false, will not be applied */ 57 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics) 58 | bool bApplyImpulse; 59 | 60 | /** If true, impulse is taken as a change in velocity instead of an impulse (i.e. mass will have no effect). */ 61 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics, meta=(EditCondition="bApplyImpulse", EditConditionHides)) 62 | bool bFactorMass; 63 | 64 | /** Strength of the impulse */ 65 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics, meta=(EditCondition="bApplyImpulse", EditConditionHides, UIMin="0", ClampMin="0")) 66 | float Impulse; 67 | 68 | operator bool() const { return bApplyImpulse; } 69 | 70 | /** @return True if the impulse is a change in velocity and does not factor mass */ 71 | bool IsVelocityChange() const { return !bFactorMass; } 72 | 73 | /** @return True if the impulse can be applied */ 74 | virtual bool CanBeApplied() const 75 | { 76 | return bApplyImpulse && Impulse > 0.f; 77 | } 78 | 79 | virtual bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 80 | { 81 | Ar.SerializeBits(&bApplyImpulse, 1); 82 | if (bApplyImpulse) 83 | { 84 | Ar.SerializeBits(&bFactorMass, 1); 85 | Ar << Impulse; 86 | } 87 | return !Ar.IsError(); 88 | } 89 | }; 90 | 91 | template<> 92 | struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 93 | { 94 | enum 95 | { 96 | WithNetSerializer = true 97 | }; 98 | }; 99 | 100 | /** 101 | * Linear impulse parameters for applying hit reactions 102 | */ 103 | USTRUCT(BlueprintType) 104 | struct PROCHITREACT_API FHitReactImpulse_Linear : public FHitReactImpulse 105 | { 106 | GENERATED_BODY() 107 | 108 | FHitReactImpulse_Linear() 109 | {} 110 | 111 | /** @return Impulse vector based on the given direction and impulse strength */ 112 | virtual FVector GetImpulse(const FVector& WorldDirection) const 113 | { 114 | return WorldDirection * Impulse; 115 | } 116 | 117 | virtual bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) override 118 | { 119 | Ar.SerializeBits(&bApplyImpulse, 1); 120 | if (bApplyImpulse) 121 | { 122 | Ar.SerializeBits(&bFactorMass, 1); 123 | Ar << Impulse; 124 | } 125 | return !Ar.IsError(); 126 | } 127 | }; 128 | 129 | template<> 130 | struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 131 | { 132 | enum 133 | { 134 | WithNetSerializer = true 135 | }; 136 | }; 137 | 138 | /** 139 | * Angular impulse parameters for applying hit reactions 140 | */ 141 | USTRUCT(BlueprintType) 142 | struct PROCHITREACT_API FHitReactImpulse_Angular : public FHitReactImpulse_Linear 143 | { 144 | GENERATED_BODY() 145 | 146 | FHitReactImpulse_Angular() 147 | : AngularUnits(EHitReactUnits::Degrees) 148 | {} 149 | 150 | /** Units for the angular impulse */ 151 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics, meta=(EditCondition="bApplyImpulse", EditConditionHides)) 152 | EHitReactUnits AngularUnits; 153 | 154 | virtual bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) override 155 | { 156 | Ar.SerializeBits(&bApplyImpulse, 1); 157 | if (bApplyImpulse) 158 | { 159 | Ar.SerializeBits(&bFactorMass, 1); 160 | Ar << Impulse; 161 | Ar << AngularUnits; 162 | } 163 | return !Ar.IsError(); 164 | } 165 | }; 166 | 167 | template<> 168 | struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 169 | { 170 | enum 171 | { 172 | WithNetSerializer = true 173 | }; 174 | }; 175 | 176 | /** 177 | * Radial impulse parameters for applying hit reactions 178 | */ 179 | USTRUCT(BlueprintType) 180 | struct PROCHITREACT_API FHitReactImpulse_Radial : public FHitReactImpulse 181 | { 182 | GENERATED_BODY() 183 | 184 | FHitReactImpulse_Radial() 185 | : Radius(150.f) 186 | , Falloff(EHitReactFalloff::Linear) 187 | {} 188 | 189 | /** Radius of the impulse */ 190 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics, meta=(EditCondition="bApplyImpulse", EditConditionHides, UIMin="0", ClampMin="0", ForceUnits="cm")) 191 | float Radius; 192 | 193 | /** How the strength of the impulse should fall off with distance */ 194 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics, meta=(EditCondition="bApplyImpulse", EditConditionHides)) 195 | EHitReactFalloff Falloff; 196 | 197 | virtual bool CanBeApplied() const override final 198 | { 199 | return FHitReactImpulse::CanBeApplied() && Radius > 0.f; 200 | } 201 | 202 | virtual bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) override 203 | { 204 | Ar.SerializeBits(&bApplyImpulse, 1); 205 | if (bApplyImpulse) 206 | { 207 | Ar.SerializeBits(&bFactorMass, 1); 208 | Ar << Impulse; 209 | Ar << Radius; 210 | Ar << Falloff; 211 | } 212 | return !Ar.IsError(); 213 | } 214 | }; 215 | 216 | template<> 217 | struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 218 | { 219 | enum 220 | { 221 | WithNetSerializer = true 222 | }; 223 | }; 224 | 225 | /** 226 | * Combined impulse parameters for applying hit reactions 227 | */ 228 | USTRUCT(BlueprintType) 229 | struct PROCHITREACT_API FHitReactImpulseParams 230 | { 231 | GENERATED_BODY() 232 | 233 | FHitReactImpulseParams() 234 | {} 235 | 236 | FHitReactImpulseParams(const FHitReactImpulse_Linear& InLinearImpulse, const FHitReactImpulse_Angular& InAngularImpulse, const FHitReactImpulse_Radial& InRadialImpulse) 237 | : LinearImpulse(InLinearImpulse) 238 | , AngularImpulse(InAngularImpulse) 239 | , RadialImpulse(InRadialImpulse) 240 | {} 241 | 242 | /** Linear impulse parameters */ 243 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics) 244 | FHitReactImpulse_Linear LinearImpulse; 245 | 246 | /** Angular impulse parameters */ 247 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics) 248 | FHitReactImpulse_Angular AngularImpulse; 249 | 250 | /** Radial impulse parameters */ 251 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Physics) 252 | FHitReactImpulse_Radial RadialImpulse; 253 | 254 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 255 | { 256 | LinearImpulse.NetSerialize(Ar, Map, bOutSuccess); 257 | AngularImpulse.NetSerialize(Ar, Map, bOutSuccess); 258 | RadialImpulse.NetSerialize(Ar, Map, bOutSuccess); 259 | return !Ar.IsError(); 260 | } 261 | 262 | bool CanBeApplied() const 263 | { 264 | return LinearImpulse.CanBeApplied() || AngularImpulse.CanBeApplied() || RadialImpulse.CanBeApplied(); 265 | } 266 | }; 267 | 268 | template<> 269 | struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 270 | { 271 | enum 272 | { 273 | WithNetSerializer = true 274 | }; 275 | }; 276 | 277 | /** 278 | * World space parameters for applying impulses 279 | * These are set during runtime and are not saved 280 | */ 281 | USTRUCT(BlueprintType) 282 | struct PROCHITREACT_API FHitReactImpulse_WorldParams 283 | { 284 | GENERATED_BODY() 285 | 286 | FHitReactImpulse_WorldParams() 287 | : LinearDirection(FVector::ZeroVector) 288 | , AngularDirection(FVector::ZeroVector) 289 | , RadialLocation(FVector::ZeroVector) 290 | {} 291 | 292 | /** Direction to apply the linear impulse */ 293 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadWrite, Category=Physics) 294 | FVector LinearDirection; 295 | 296 | /** Direction to apply the angular impulse */ 297 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadWrite, Category=Physics) 298 | FVector AngularDirection; 299 | 300 | /** World Location to apply the radial impulse */ 301 | UPROPERTY(Transient, VisibleInstanceOnly, BlueprintReadWrite, Category=Physics) 302 | FVector RadialLocation; 303 | 304 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 305 | { 306 | LinearDirection.NetSerialize(Ar, Map, bOutSuccess); 307 | AngularDirection.NetSerialize(Ar, Map, bOutSuccess); 308 | RadialLocation.NetSerialize(Ar, Map, bOutSuccess); 309 | return !Ar.IsError(); 310 | } 311 | }; 312 | 313 | template<> 314 | struct TStructOpsTypeTraits : TStructOpsTypeTraitsBase2 315 | { 316 | enum 317 | { 318 | WithNetSerializer = true 319 | }; 320 | }; 321 | 322 | /** 323 | * Pending impulse to apply to a bone 324 | */ 325 | USTRUCT() 326 | struct PROCHITREACT_API FHitReactPendingImpulse 327 | { 328 | GENERATED_BODY() 329 | 330 | FHitReactPendingImpulse() 331 | : ImpulseScalar(1.f) 332 | , Profile(nullptr) 333 | , ImpulseBoneName(NAME_None) 334 | {} 335 | 336 | FHitReactPendingImpulse(const FHitReactImpulseParams& InImpulse, const FHitReactImpulse_WorldParams& InWorld, 337 | float InImpulseScalar, const TObjectPtr& InProfile, FName InImpulseBoneName); 338 | 339 | /** Impulse parameters */ 340 | UPROPERTY() 341 | FHitReactImpulseParams Impulse; 342 | 343 | /** World space parameters */ 344 | UPROPERTY() 345 | FHitReactImpulse_WorldParams World; 346 | 347 | /** Scalar to apply to the impulse */ 348 | UPROPERTY() 349 | float ImpulseScalar; 350 | 351 | /** Profile to use when applying the impulse */ 352 | UPROPERTY() 353 | TObjectPtr Profile; 354 | 355 | /** Bone to apply the impulse to */ 356 | UPROPERTY() 357 | FName ImpulseBoneName; 358 | 359 | /** @return True if the impulse can be applied */ 360 | bool IsValid() const 361 | { 362 | return Profile && Impulse.CanBeApplied(); 363 | } 364 | }; -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/Params/HitReactParams.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "GameplayTagContainer.h" 7 | #include "HitReactTypes.h" 8 | #include "Physics/HitReactPhysicsState.h" 9 | #include "HitReactParams.generated.h" 10 | 11 | class UHitReactBoneData; 12 | class UHitReactProfile; 13 | 14 | /** 15 | * Manages global toggle parameters for enabling/disabling the hit react system, including gameplay tag-based toggling. 16 | */ 17 | USTRUCT(BlueprintType) 18 | struct PROCHITREACT_API FHitReactGlobalToggle 19 | { 20 | GENERATED_BODY() 21 | 22 | FHitReactGlobalToggle() 23 | : bToggleStateUsingTags(false) 24 | {} 25 | /** Global interp toggle parameters for enabling/disabling the hit react system */ 26 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(ShowOnlyInnerProperties)) 27 | FHitReactPhysicsStateParamsSimple Params; 28 | 29 | /** 30 | * Requires GameplayAbilities plugin to be loaded! 31 | * 32 | * Whether to toggle the system using gameplay tags 33 | * Disabling this can be a performance optimization if you know the system will not be toggled at runtime via tags 34 | * because we won't have to look for AbilitySystemComponent 35 | * @see DisableTags, EnableTagsOverride 36 | */ 37 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 38 | bool bToggleStateUsingTags; 39 | 40 | /** If component owner has any gameplay tags assigned via their AbilitySystemComponent, this will be toggled to a disabled state using GlobalToggleParams */ 41 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(EditCondition="bToggleStateUsingTags", EditConditionHides)) 42 | FGameplayTagContainer DisableTags; 43 | 44 | /** 45 | * If component owner has any gameplay tags assigned via their AbilitySystemComponent, this will be toggled to an enabled state using GlobalToggleParams 46 | * @warning This overrides DisableTags! 47 | */ 48 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(EditCondition="bToggleStateUsingTags", EditConditionHides)) 49 | FGameplayTagContainer EnableTags; 50 | 51 | /** Global physics interpolation for toggling the system on and off */ 52 | UPROPERTY(Transient, BlueprintReadOnly, Category=HitReact) 53 | FHitReactPhysicsStateSimple State; 54 | }; 55 | 56 | /** 57 | * Subsequent impulse scalar to apply to a bone after the first impulse when hit multiple times 58 | */ 59 | USTRUCT(BlueprintType) 60 | struct PROCHITREACT_API FHitReactSubsequentImpulse 61 | { 62 | GENERATED_BODY() 63 | 64 | FHitReactSubsequentImpulse() 65 | : ElapsedTime(0.f) 66 | , ImpulseScalar(1.f) 67 | {} 68 | 69 | FHitReactSubsequentImpulse(float InElapsedTime, float InImpulseScalar) 70 | : ElapsedTime(InElapsedTime) 71 | , ImpulseScalar(InImpulseScalar) 72 | {} 73 | 74 | /** Subsequent impulse scalar will be applied if LastHitReactTime hasn't exceeded this time */ 75 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(UIMin="0", ClampMin="0", Delta="0.05", ForceUnits="s")) 76 | float ElapsedTime; 77 | 78 | /** Scalar to apply to the impulse if ElapsedTime has not been exceeded */ 79 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(UIMin="0", ClampMin="0", Delta="0.05", ForceUnits="x")) 80 | float ImpulseScalar; 81 | }; 82 | 83 | /** 84 | * Bone-specific override params defined in a Profile 85 | */ 86 | USTRUCT(BlueprintType) 87 | struct PROCHITREACT_API FHitReactBoneOverride 88 | { 89 | GENERATED_BODY() 90 | 91 | FHitReactBoneOverride() 92 | : bIncludeSelf(true) 93 | , bDisablePhysics(false) 94 | , BlendWeightScalar(1.f) 95 | {} 96 | 97 | /** If false, exclude the bone itself and apply these overrides only to bones below */ 98 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Bones) 99 | bool bIncludeSelf; 100 | 101 | /** 102 | * If true, disable physics on this bone 103 | * This will prevent inheriting physics from parent bones 104 | * If any active profile has this set to true, physics will be disabled on this bone 105 | */ 106 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Bones) 107 | bool bDisablePhysics; 108 | 109 | /** Scale the weight provided to this bone */ 110 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Bones, meta=(UIMin="0", ClampMin="0", UIMax="1", ClampMax="1", EditCondition="!bDisablePhysics", EditConditionHides, ForceUnits="x")) 111 | float BlendWeightScalar; 112 | }; 113 | 114 | /** 115 | * Input params for applying a hit reaction 116 | */ 117 | USTRUCT(BlueprintType) 118 | struct PROCHITREACT_API FHitReactInputParams 119 | { 120 | GENERATED_BODY() 121 | 122 | FHitReactInputParams() 123 | : Profile(nullptr) 124 | , SimulatedBoneName(NAME_None) 125 | , bIncludeSelf(true) 126 | {} 127 | 128 | FHitReactInputParams(const TSoftObjectPtr& InProfileToUse, const FName& InBoneName, bool bInIncludeSelf) 129 | : Profile(InProfileToUse) 130 | , SimulatedBoneName(InBoneName) 131 | , bIncludeSelf(bInIncludeSelf) 132 | {} 133 | 134 | /** Profile to use when applying the hit react */ 135 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 136 | TSoftObjectPtr Profile; 137 | 138 | /** Optional additional BoneData to provide for the profile to append */ 139 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 140 | TSoftObjectPtr BoneData; 141 | 142 | /** 143 | * Bone to apply the hit reaction to -- this bone gets simulated 144 | * Note that the simulated bone must have a physics body assigned in the physics asset 145 | * 146 | * This bone will also receive the impulse if ImpulseBoneName is None 147 | */ 148 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 149 | FName SimulatedBoneName; 150 | 151 | /** 152 | * Optional bone to apply the impulse to 153 | * This differs from the bone that is HitReacted, as the impulse bone is the bone that will receive the impulse 154 | * And the HitReact bone is the bone that will be simulated 155 | * 156 | * If None, the impulse will be applied to the simulated bone instead 157 | */ 158 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 159 | FName ImpulseBoneName; 160 | 161 | /** If false, exclude the simulated bone itself and only simulate bones below it */ 162 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 163 | bool bIncludeSelf; 164 | 165 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 166 | { 167 | Ar << Profile; 168 | Ar << BoneData; 169 | Ar << SimulatedBoneName; 170 | Ar << ImpulseBoneName; 171 | Ar << bIncludeSelf; 172 | return !Ar.IsError(); 173 | } 174 | 175 | operator bool() const { return IsValidToApply(); } 176 | bool IsValidToApply() const { return !Profile.IsNull() && !SimulatedBoneName.IsNone(); } 177 | 178 | const FName& GetImpulseBoneName() const 179 | { 180 | return ImpulseBoneName.IsNone() ? SimulatedBoneName : ImpulseBoneName; 181 | } 182 | }; 183 | 184 | template<> 185 | struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2 186 | { 187 | enum 188 | { 189 | WithNetSerializer = true 190 | }; 191 | }; -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/Params/HitReactTrigger.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "HitReactImpulse.h" 7 | #include "HitReactParams.h" 8 | #include "HitReactTrigger.generated.h" 9 | 10 | /* 11 | * NOTE: 12 | * Triggers are structs that hold all data required to trigger a hit react, primarily for the purpose of replicating hit reacts 13 | * This is actually against the intended use of the HitReact system, as it is designed to be sent as a data-less event 14 | * Ordinarily, you would have a 'get shot' system that already knows how to trigger a hit react based on the hit normal, magnitude, etc. 15 | * 16 | * Separate structs exist for irregular use-cases involving multicasts, such as triggering linear, angular, or radial impulses separately, 17 | * so that you don't need to send all three impulses when only one is being applied 18 | */ 19 | 20 | /** 21 | * The required data to trigger a hit reaction 22 | * Convenience struct to pass around data 23 | * Especially useful for replication 24 | */ 25 | USTRUCT(BlueprintType) 26 | struct PROCHITREACT_API FHitReactTrigger : public FHitReactInputParams 27 | { 28 | using Super = FHitReactInputParams; 29 | 30 | GENERATED_BODY() 31 | 32 | FHitReactTrigger() 33 | {} 34 | 35 | FHitReactTrigger(const TSoftObjectPtr& InProfileToUse, const FName& InBoneName, bool bInIncludeSelf, 36 | const FHitReactImpulseParams& InImpulse) 37 | : Super(InProfileToUse, InBoneName, bInIncludeSelf) 38 | , Impulse(InImpulse) 39 | {} 40 | 41 | /** The impulse parameters to apply */ 42 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 43 | FHitReactImpulseParams Impulse; 44 | 45 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 46 | { 47 | // Only serialize any params if they are actually being applied 48 | if (Impulse.LinearImpulse || Impulse.AngularImpulse || Impulse.RadialImpulse) 49 | { 50 | Ar << Profile; 51 | Ar << SimulatedBoneName; 52 | Ar << bIncludeSelf; 53 | Impulse.NetSerialize(Ar, Map, bOutSuccess); 54 | } 55 | return !Ar.IsError(); 56 | } 57 | 58 | FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType); 59 | const FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) const; 60 | }; 61 | 62 | template<> 63 | struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2 64 | { 65 | enum 66 | { 67 | WithNetSerializer = true 68 | }; 69 | }; 70 | 71 | /** 72 | * The required data to apply a hit reaction for linear impulses 73 | * Convenience struct to pass around data 74 | * Especially useful for replication 75 | */ 76 | USTRUCT(BlueprintType) 77 | struct PROCHITREACT_API FHitReactTrigger_Linear : public FHitReactInputParams 78 | { 79 | using Super = FHitReactInputParams; 80 | 81 | GENERATED_BODY() 82 | 83 | FHitReactTrigger_Linear() 84 | {} 85 | 86 | FHitReactTrigger_Linear(const TSoftObjectPtr& InProfileToUse, const FName& InBoneName, bool bInIncludeSelf, 87 | const FHitReactImpulse_Linear& InLinearImpulse) 88 | : Super(InProfileToUse, InBoneName, bInIncludeSelf) 89 | , LinearImpulse(InLinearImpulse) 90 | {} 91 | 92 | /** The impulse parameters to apply */ 93 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 94 | FHitReactImpulse_Linear LinearImpulse; 95 | 96 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 97 | { 98 | // Only serialize any params if they are actually being applied 99 | if (LinearImpulse) 100 | { 101 | Ar << Profile; 102 | Ar << SimulatedBoneName; 103 | Ar << bIncludeSelf; 104 | LinearImpulse.NetSerialize(Ar, Map, bOutSuccess); 105 | } 106 | return !Ar.IsError(); 107 | } 108 | 109 | FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) { return LinearImpulse; } 110 | const FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) const { return LinearImpulse; } 111 | }; 112 | 113 | template<> 114 | struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2 115 | { 116 | enum 117 | { 118 | WithNetSerializer = true 119 | }; 120 | }; 121 | 122 | /** 123 | * The required data to apply a hit reaction for angular impulses 124 | * Convenience struct to pass around data 125 | * Especially useful for replication 126 | */ 127 | USTRUCT(BlueprintType) 128 | struct PROCHITREACT_API FHitReactTrigger_Angular : public FHitReactInputParams 129 | { 130 | using Super = FHitReactInputParams; 131 | 132 | GENERATED_BODY() 133 | 134 | FHitReactTrigger_Angular() 135 | {} 136 | 137 | FHitReactTrigger_Angular(const TSoftObjectPtr& InProfileToUse, const FName& InBoneName, bool bInIncludeSelf, 138 | const FHitReactImpulse_Angular& InAngularImpulse) 139 | : Super(InProfileToUse, InBoneName, bInIncludeSelf) 140 | , AngularImpulse(InAngularImpulse) 141 | {} 142 | 143 | /** The impulse parameters to apply */ 144 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 145 | FHitReactImpulse_Angular AngularImpulse; 146 | 147 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 148 | { 149 | // Only serialize any params if they are actually being applied 150 | if (AngularImpulse) 151 | { 152 | Ar << Profile; 153 | Ar << SimulatedBoneName; 154 | Ar << bIncludeSelf; 155 | AngularImpulse.NetSerialize(Ar, Map, bOutSuccess); 156 | } 157 | return !Ar.IsError(); 158 | } 159 | 160 | FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) { return AngularImpulse; } 161 | const FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) const { return AngularImpulse; } 162 | }; 163 | 164 | template<> 165 | struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2 166 | { 167 | enum 168 | { 169 | WithNetSerializer = true 170 | }; 171 | }; 172 | 173 | /** 174 | * The required data to apply a hit reaction for radial impulses 175 | * Convenience struct to pass around data 176 | * Especially useful for replication 177 | */ 178 | USTRUCT(BlueprintType) 179 | struct PROCHITREACT_API FHitReactTrigger_Radial : public FHitReactInputParams 180 | { 181 | using Super = FHitReactInputParams; 182 | 183 | GENERATED_BODY() 184 | 185 | FHitReactTrigger_Radial() 186 | {} 187 | 188 | FHitReactTrigger_Radial(const TSoftObjectPtr& InProfileToUse, const FName& InBoneName, bool bInIncludeSelf, 189 | const FHitReactImpulse_Radial& InRadialImpulse) 190 | : Super(InProfileToUse, InBoneName, bInIncludeSelf) 191 | , RadialImpulse(InRadialImpulse) 192 | {} 193 | 194 | /** The impulse parameters to apply */ 195 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 196 | FHitReactImpulse_Radial RadialImpulse; 197 | 198 | bool NetSerialize(FArchive& Ar, class UPackageMap* Map, bool& bOutSuccess) 199 | { 200 | // Only serialize any params if they are actually being applied 201 | if (RadialImpulse) 202 | { 203 | Ar << Profile; 204 | Ar << SimulatedBoneName; 205 | Ar << bIncludeSelf; 206 | RadialImpulse.NetSerialize(Ar, Map, bOutSuccess); 207 | } 208 | return !Ar.IsError(); 209 | } 210 | 211 | FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) { return RadialImpulse; } 212 | const FHitReactImpulse& GetImpulseParamsBase(const EHitReactImpulseType& ImpulseType) const { return RadialImpulse; } 213 | }; -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/Physics/HitReactPhysics.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "HitReactPhysicsState.h" 7 | #include "HitReactPhysics.generated.h" 8 | 9 | /** 10 | * Process hit reactions on a single bone 11 | * This is the core system that handles impulse application, physics blend weights, and interpolation 12 | */ 13 | USTRUCT(BlueprintType) 14 | struct PROCHITREACT_API FHitReactPhysics 15 | { 16 | GENERATED_BODY() 17 | 18 | FHitReactPhysics() 19 | : SimulatedBoneName(NAME_None) 20 | , Profile(nullptr) 21 | , Mesh(nullptr) 22 | , RequestedBlendWeight(0.f) 23 | , MaxBlendWeight(0.f) 24 | , UniqueId(0) 25 | {} 26 | 27 | public: 28 | /** Interpolation state handling for hit reactions -- Supports blend in, hold, and blend out */ 29 | UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category=HitReact) 30 | FHitReactPhysicsState PhysicsState; 31 | 32 | /** Bone to simulate physics on */ 33 | UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category=Physics) 34 | FName SimulatedBoneName; 35 | 36 | /** Profile that this blend is using */ 37 | UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category=Physics) 38 | TObjectPtr Profile; 39 | 40 | public: 41 | /** Mesh to apply the hit reaction to */ 42 | UPROPERTY() 43 | TObjectPtr Mesh; 44 | 45 | /** Requested blend weight for this bone to apply on UHitReact::TickComponent() */ 46 | UPROPERTY() 47 | float RequestedBlendWeight; 48 | 49 | /** Maximum blend weight for this bone */ 50 | UPROPERTY() 51 | float MaxBlendWeight; 52 | 53 | /** Used for comparison */ 54 | UPROPERTY() 55 | uint64 UniqueId; 56 | 57 | public: 58 | /** Bones that descend from and may include SimulatedBoneName that do not simulate physics */ 59 | UPROPERTY() 60 | TArray DisabledBones; 61 | 62 | /** Bones that descent from and may include SimulatedBoneWeight that have a specified MaxBoneWeight */ 63 | UPROPERTY() 64 | TMap BoneWeightScalars = {}; 65 | 66 | public: 67 | /** Apply a hit reaction to the bone */ 68 | void HitReact(USkeletalMeshComponent* InMesh, const TObjectPtr& InProfile, const FName& BoneName, 69 | const TArray& InDisabledBones, const TMap& InBoneWeightScalars); 70 | 71 | /** Tick the hit reaction */ 72 | void Tick(float DeltaTime); 73 | 74 | /** @return True if the hit reaction is active */ 75 | bool IsActive() const; 76 | 77 | /** @return True if the hit reaction has completed */ 78 | bool HasCompleted() const; 79 | }; 80 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/Physics/HitReactPhysicsState.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "AlphaBlend.h" 7 | #include "HitReactPhysicsState.generated.h" 8 | 9 | class UHitReactProfile; 10 | DECLARE_DELEGATE(FOnDecayComplete); 11 | 12 | /** 13 | * State of the HitReact blending 14 | */ 15 | UENUM(BlueprintType) 16 | enum class EHitReactBlendState : uint8 17 | { 18 | Pending UMETA(ToolTip="Pending - HitReact has not yet started"), 19 | BlendIn UMETA(ToolTip="Blend in - When a HitReact is first applied, we use this to go from 0 to 1"), 20 | BlendHold UMETA(ToolTip="Blend hold - When BlendIn completes, we hold here, fully blended, for a period of time"), 21 | BlendOut UMETA(ToolTip="Blend out - When BlendHold completes, we use this to go from 1 to 0"), 22 | Completed UMETA(ToolTip="Completed - HitReact has completed and is no longer active"), 23 | Unknown 24 | }; 25 | 26 | /** 27 | * Interpolation parameters for hit reactions 28 | */ 29 | USTRUCT(BlueprintType) 30 | struct PROCHITREACT_API FHitReactBlendParams 31 | { 32 | GENERATED_BODY() 33 | 34 | FHitReactBlendParams(float InBlendTime = 0.2f, const EAlphaBlendOption& InBlendOption = EAlphaBlendOption::Linear, 35 | const TObjectPtr& InCustomCurve = nullptr) 36 | : BlendTime(InBlendTime) 37 | , BlendOption(InBlendOption) 38 | , CustomCurve(InCustomCurve) 39 | {} 40 | 41 | /** 42 | * Blend Time 43 | * Set to 0 to disable blending 44 | */ 45 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(ClampMin="0", UIMin="0", UIMax="1", Delta="0.05", ForceUnits="s")) 46 | float BlendTime; 47 | 48 | /** Type of blending used (Linear, Cubic, etc.) */ 49 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(EditCondition="BlendTime > 0")) 50 | EAlphaBlendOption BlendOption; 51 | 52 | /** If you're using Custom BlendOption, you can specify curve */ 53 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(DisplayAfter="BlendOption", EditCondition="BlendTime > 0 && BlendOption == EAlphaBlendOption::Custom", EditConditionHides)) 54 | TObjectPtr CustomCurve; 55 | 56 | bool IsValid() const 57 | { 58 | return BlendTime > SMALL_NUMBER; 59 | } 60 | 61 | float Ease(float InAlpha) const 62 | { 63 | return FAlphaBlend::AlphaToBlendOption(InAlpha, BlendOption, CustomCurve.Get()); 64 | } 65 | }; 66 | 67 | /** 68 | * Interpolation state handling for hit reactions 69 | * Supports blend in, hold, and blend out 70 | */ 71 | USTRUCT(BlueprintType) 72 | struct PROCHITREACT_API FHitReactPhysicsStateParams 73 | { 74 | GENERATED_BODY() 75 | 76 | FHitReactPhysicsStateParams(float InBlendInTime = 0.2f, float InBlendOutTime = 0.2f, const EAlphaBlendOption& InBlendOption = EAlphaBlendOption::HermiteCubic) 77 | : BlendIn(InBlendInTime, InBlendOption) 78 | , BlendHoldTime(0.f) 79 | , BlendOut(InBlendOutTime, InBlendOption) 80 | , DecayTime(0.15f) 81 | , DecayRate(2.f) 82 | , MaxAccumulatedDecayTime(0.25f) 83 | {} 84 | 85 | /** 86 | * Simulated physics blend in 87 | * When a HitReact is first applied, we use this to go from 0 to 1 88 | */ 89 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 90 | FHitReactBlendParams BlendIn; 91 | 92 | /** 93 | * Simulated physics blend hold 94 | * When BlendIn completes, we hold here, fully blended, for a period of time 95 | * Set to 0 to disable hold 96 | */ 97 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(ClampMin="0", UIMin="0", UIMax="1", Delta="0.05", ForceUnits="s")) 98 | float BlendHoldTime; 99 | 100 | /** Simulated physics blend out */ 101 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 102 | FHitReactBlendParams BlendOut; 103 | 104 | // Decay is not currently used and has been hidden 105 | 106 | /** 107 | * How far to rewind the hit react on reapplication 108 | */ 109 | // UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(ClampMin="0", UIMin="0", UIMax="1", Delta="0.05", ForceUnits="s")) 110 | float DecayTime; 111 | 112 | /** 113 | * How fast to rewind the hit react on reapplication 114 | * The time scalar by which DecayTime is applied 115 | */ 116 | // UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(ClampMin="0", UIMin="0", UIMax="3", Delta="0.1", ForceUnits="x")) 117 | float DecayRate; 118 | 119 | /** 120 | * Maximum delay that can accumulate 121 | * Will not exceed the accumulation of all blend times regardless 122 | * Will not exceed the current elapsed state time 123 | * Set to 0 to disable this clamp 124 | */ 125 | // UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact, meta=(ClampMin="0", UIMin="0", UIMax="1", Delta="0.05", ForceUnits="s")) 126 | float MaxAccumulatedDecayTime; 127 | 128 | float GetTotalTime() const 129 | { 130 | return BlendIn.BlendTime + BlendHoldTime + BlendOut.BlendTime; 131 | } 132 | }; 133 | 134 | /** 135 | * Interpolation state handling for hit reactions 136 | * Supports blend in, hold, and blend out 137 | */ 138 | USTRUCT(BlueprintType) 139 | struct PROCHITREACT_API FHitReactPhysicsState 140 | { 141 | GENERATED_BODY() 142 | 143 | FHitReactPhysicsState() 144 | : BlendState(EHitReactBlendState::Pending) 145 | , ElapsedTime(0.f) 146 | , DecayTime(0.f) 147 | {} 148 | 149 | UPROPERTY() 150 | FHitReactPhysicsStateParams Params; 151 | 152 | FOnDecayComplete OnDecayComplete; 153 | 154 | protected: 155 | /** Current state of the HitReact */ 156 | UPROPERTY(Transient) 157 | EHitReactBlendState BlendState; 158 | 159 | /** Range of 0 to GetTotalTime() */ 160 | UPROPERTY(Transient) 161 | float ElapsedTime; 162 | 163 | /** Decay is applied when the HitReact is reapplied, effectively an offset applied over time */ 164 | UPROPERTY(Transient) 165 | float DecayTime; 166 | 167 | /** Update the State based on the elapsed time */ 168 | void UpdateBlendState(); 169 | 170 | public: 171 | /** @return Current state of the HitReact */ 172 | EHitReactBlendState GetBlendState() const 173 | { 174 | return BlendState; 175 | } 176 | 177 | /** @return Current state of the HitReact as a string */ 178 | FString GetBlendStateString() const; 179 | 180 | /** @return Current elapsed time */ 181 | float GetElapsedTime() const 182 | { 183 | return ElapsedTime; 184 | } 185 | 186 | /** @return Total time for the entire blend */ 187 | float GetTotalTime() const 188 | { 189 | return Params.GetTotalTime(); 190 | } 191 | 192 | /** @return True if the HitReact has started */ 193 | bool HasStarted() const 194 | { 195 | return BlendState != EHitReactBlendState::Pending; 196 | } 197 | 198 | /** @return True if the HitReact has completed */ 199 | bool HasCompleted() const 200 | { 201 | return BlendState == EHitReactBlendState::Completed; 202 | } 203 | 204 | /** @return True if the HitReact is active */ 205 | bool IsActive() const 206 | { 207 | return BlendState != EHitReactBlendState::Pending && BlendState != EHitReactBlendState::Completed; 208 | } 209 | 210 | void Reset(); 211 | 212 | /** @return True if the HitReact can be activated */ 213 | static bool CanActivate(const FHitReactPhysicsStateParams& WithParams); 214 | 215 | /** 216 | * Activate the HitReact 217 | * Do not call without checking CanActivate first -- divide by zero will occur 218 | */ 219 | void Activate(); 220 | 221 | /** Finish the HitReact by moving the ElapsedTime to the Total Time, and setting BlendState to Completed */ 222 | void Finish(); 223 | 224 | /** @return Total blend time for the current state */ 225 | float GetBlendTime() const; 226 | 227 | // /** Apply a decay, which will cause us to rewind over time */ 228 | // void Decay() 229 | // { 230 | // DecayTime += Params.DecayTime; 231 | // DecayTime = FMath::Clamp(DecayTime, 0.f, Params.MaxAccumulatedDecayTime); 232 | // } 233 | 234 | /** @return True if decaying */ 235 | bool IsDecaying() const 236 | { 237 | return DecayTime > 0.f; 238 | } 239 | 240 | /** Directly set the elapsed time and Update the State */ 241 | void SetElapsedTime(float InElapsedTime); 242 | 243 | /** @return Total time for the current state */ 244 | float GetTotalStateTime() const; 245 | 246 | /** @return Total time elapsed for the current state */ 247 | float GetElapsedStateTime() const; 248 | 249 | /** Directly set the current Alpha */ 250 | void SetElapsedAlpha(float InAlpha); 251 | 252 | /** @return Alpha value for the current state */ 253 | float GetBlendStateAlpha() const; 254 | 255 | float GetElapsedAlpha() const; 256 | 257 | /** @return Blend params for the current state */ 258 | const FHitReactBlendParams* GetBlendParams() const; 259 | 260 | /** 261 | * Called every frame to update the state 262 | * @return True if completed and ready to disable, remove, uninitialize, etc. 263 | */ 264 | bool Tick(float DeltaTime); 265 | }; 266 | 267 | /** 268 | * Simple interpolation state handling for hit reaction global toggle 269 | * Supports blend in and blend out 270 | */ 271 | USTRUCT(BlueprintType) 272 | struct PROCHITREACT_API FHitReactPhysicsStateParamsSimple 273 | { 274 | GENERATED_BODY() 275 | 276 | FHitReactPhysicsStateParamsSimple(float InBlendInTime = 0.25f, float InBlendOutTime = 0.25f, const EAlphaBlendOption& InBlendOption = EAlphaBlendOption::HermiteCubic) 277 | : BlendIn(InBlendInTime, InBlendOption) 278 | , BlendOut(InBlendOutTime, InBlendOption) 279 | {} 280 | 281 | /** Interp toggle parameters for blending in */ 282 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 283 | FHitReactBlendParams BlendIn; 284 | 285 | /** Interp toggle parameters for blending out */ 286 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 287 | FHitReactBlendParams BlendOut; 288 | }; 289 | 290 | /** 291 | * Simple interpolation state handling for hit reaction global toggle 292 | * Supports blend in and blend out 293 | */ 294 | USTRUCT(BlueprintType) 295 | struct PROCHITREACT_API FHitReactPhysicsStateSimple 296 | { 297 | GENERATED_BODY() 298 | 299 | FHitReactPhysicsStateSimple() 300 | : bToggleEnabled(false) 301 | , ElapsedTime(0.f) 302 | {} 303 | 304 | /** Interp toggle parameters */ 305 | UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=HitReact) 306 | FHitReactPhysicsStateParamsSimple BlendParams; 307 | 308 | /** Current state of the HitReact */ 309 | UPROPERTY(Transient) 310 | bool bToggleEnabled; 311 | 312 | /** Range of 0 to GetStateTime() */ 313 | UPROPERTY(Transient) 314 | float ElapsedTime; 315 | 316 | /** Initialize the state */ 317 | void Initialize(bool bStartEnabled) 318 | { 319 | bToggleEnabled = bStartEnabled; 320 | ElapsedTime = GetStateTime(); 321 | } 322 | 323 | /** @return Target alpha based on enabled state */ 324 | float GetTargetAlpha() const 325 | { 326 | return bToggleEnabled ? 1.f : 0.f; 327 | } 328 | 329 | /** @return True if the HitReact has completed */ 330 | bool HasCompleted() const 331 | { 332 | return bToggleEnabled ? ElapsedTime >= BlendParams.BlendIn.BlendTime : ElapsedTime <= 0.f; 333 | } 334 | 335 | /** @return Blend parameters for the current state */ 336 | const FHitReactBlendParams& GetBlendParams() const 337 | { 338 | return bToggleEnabled ? BlendParams.BlendIn : BlendParams.BlendOut; 339 | } 340 | 341 | /** @return Total time for the current state */ 342 | float GetStateTime() const 343 | { 344 | return GetBlendParams().BlendTime; 345 | } 346 | 347 | /** @return Alpha value for the current state */ 348 | float GetStateAlpha() const 349 | { 350 | const float Alpha = ElapsedTime / GetStateTime(); 351 | return FMath::Clamp(Alpha, 0.f, 1.f); 352 | } 353 | 354 | /** @return Blend alpha value for the current state with easing applied */ 355 | float GetBlendStateAlpha() const 356 | { 357 | const float Alpha = GetStateAlpha(); 358 | return FMath::Clamp(GetBlendParams().Ease(Alpha), 0.f, 1.f); 359 | } 360 | 361 | /** Directly set the elapsed time */ 362 | void SetElapsedTime(float InElapsedTime) 363 | { 364 | ElapsedTime = FMath::Clamp(InElapsedTime, 0.f, GetStateTime()); 365 | } 366 | 367 | /** @return True if reached our target */ 368 | bool Tick(float DeltaTime); 369 | }; -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/ProcHitReact.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Modules/ModuleManager.h" 7 | 8 | class FProcHitReactModule : public IModuleInterface 9 | { 10 | public: 11 | 12 | /** IModuleInterface implementation */ 13 | virtual void StartupModule() override; 14 | virtual void ShutdownModule() override; 15 | }; 16 | -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/System/HitReactVersioning.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | 7 | #include "Misc/EngineVersionComparison.h" 8 | 9 | #ifndef UE_5_03_OR_LATER 10 | #if !UE_VERSION_OLDER_THAN(5, 3, 0) 11 | #define UE_5_03_OR_LATER 1 12 | #else 13 | #define UE_5_03_OR_LATER 0 14 | #endif 15 | #endif 16 | 17 | #ifndef UE_5_04_OR_LATER 18 | #if !UE_VERSION_OLDER_THAN(5, 4, 0) 19 | #define UE_5_04_OR_LATER 1 20 | #else 21 | #define UE_5_04_OR_LATER 0 22 | #endif 23 | #endif 24 | 25 | #ifndef UE_5_05_OR_LATER 26 | #if !UE_VERSION_OLDER_THAN(5, 5, 0) 27 | #define UE_5_05_OR_LATER 1 28 | #else 29 | #define UE_5_05_OR_LATER 0 30 | #endif 31 | #endif -------------------------------------------------------------------------------- /Source/ProcHitReact/Public/ThirdParty/AsyncMixinProc.h: -------------------------------------------------------------------------------- 1 | // Copyright Epic Games, Inc. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "Containers/Ticker.h" 6 | #include "UObject/SoftObjectPtr.h" 7 | 8 | class FAsyncCondition; 9 | class FName; 10 | class UPrimaryDataAsset; 11 | struct FPrimaryAssetId; 12 | struct FStreamableHandle; 13 | template class TSubclassOf; 14 | 15 | DECLARE_DELEGATE_OneParam(FStreamableHandleDelegate, TSharedPtr) 16 | 17 | //TODO I think we need to introduce a retention policy, preloads automatically stay in memory until canceled 18 | // but what if you want to preload individual items just using the AsyncLoad functions? I don't want to 19 | // introduce individual policies per call, or introduce a whole set of preload vs asyncloads, so would 20 | // would rather have a retention policy. Should it be a member and actually create real memory when 21 | // you inherit from AsyncMixinProc, or should it be a template argument? 22 | //enum class EAsyncMixinProcRetentionPolicy : uint8 23 | //{ 24 | // Default, 25 | // KeepResidentUntilComplete, 26 | // KeepResidentUntilCancel 27 | //}; 28 | 29 | /** 30 | * The FAsyncMixinProc allows easier management of async loading requests, to ensure linear request handling, to make 31 | * writing code much easier. The usage pattern is as follows, 32 | * 33 | * First - inherit from FAsyncMixinProc, even if you're a UObject, you can also inherit from FAsyncMixinProc. 34 | * 35 | * Then - you can make your async loads as follows. 36 | * 37 | * CancelAsyncLoading(); // Some objects get reused like in lists, so it's important to cancel anything you had pending doesn't complete. 38 | * AsyncLoad(ItemOne, CallbackOne); 39 | * AsyncLoad(ItemTwo, CallbackTwo); 40 | * StartAsyncLoading(); 41 | * 42 | * You can also include the 'this' scope safely, one of the benefits of the mix-in, is that none of the callbacks 43 | * are ever out of scope of the host AsyncMixinProc derived object. 44 | * e.g. 45 | * AsyncLoad(SomeSoftObjectPtr, [this, ...]() { 46 | * 47 | * }); 48 | * 49 | * 50 | * What will happen is first we cancel any existing one(s), e.g. perhaps we are a widget that just got told to represent 51 | * some new thing. What will happen is we'll Load ItemOne and ItemTwo, *THEN* we'll call the callbacks in the order you 52 | * requested the async loads - even if ItemOne or ItemTwo was already loaded when you request it. 53 | * 54 | * When all the async loading requests complete, OnFinishedLoading will be called. 55 | * 56 | * If you forget to call StartAsyncLoading(), we'll call it next frame, but you should remember to call it 57 | * when you're done with your setup, as maybe everything is already loaded, and it will avoid a single frame 58 | * of a loading indicator flash, which is annoying. 59 | * 60 | * NOTE: The FAsyncMixinProc also makes it safe to pass [this] as a captured input into your lambda, because it handles 61 | * unhooking everything if either your owner class is destroyed, or you cancel everything. 62 | * 63 | * NOTE: FAsyncMixinProc doesn't add any additional memory to your class. Several classes currently handling async loading 64 | * internally allocate TSharedPtr members and tend to hold onto SoftObjectPaths temporary state. The 65 | * FAsyncMixinProc does all of this internally with a static TMap so that all of the async request memory is stored temporarily 66 | * and sparsely. 67 | * 68 | * NOTE: For debugging and understanding what's going on, you should add -LogCmds="LogAsyncMixinProc Verbose" to the command line. 69 | */ 70 | class PROCHITREACT_API FAsyncMixinProc : public FNoncopyable 71 | { 72 | protected: 73 | FAsyncMixinProc(); 74 | 75 | public: 76 | virtual ~FAsyncMixinProc(); 77 | 78 | protected: 79 | /** Called when loading starts. */ 80 | virtual void OnStartedLoading() { } 81 | /** Called when all loading has finished. */ 82 | virtual void OnFinishedLoading() { } 83 | 84 | protected: 85 | /** Async load a TSoftClassPtr, call the Callback when complete. */ 86 | template 87 | void AsyncLoad(TSoftClassPtr SoftClass, TFunction&& Callback) 88 | { 89 | AsyncLoad(SoftClass.ToSoftObjectPath(), FSimpleDelegate::CreateLambda(MoveTemp(Callback))); 90 | } 91 | 92 | /** Async load a TSoftClassPtr, call the Callback when complete. */ 93 | template 94 | void AsyncLoad(TSoftClassPtr SoftClass, TFunction)>&& Callback) 95 | { 96 | AsyncLoad(SoftClass.ToSoftObjectPath(), 97 | FSimpleDelegate::CreateLambda([SoftClass, UserCallback = MoveTemp(Callback)]() mutable { 98 | UserCallback(SoftClass.Get()); 99 | }) 100 | ); 101 | } 102 | 103 | /** Async load a TSoftClassPtr, call the Callback when complete. */ 104 | template 105 | void AsyncLoad(TSoftClassPtr SoftClass, const FSimpleDelegate& Callback = FSimpleDelegate()) 106 | { 107 | AsyncLoad(SoftClass.ToSoftObjectPath(), Callback); 108 | } 109 | 110 | /** Async load a TSoftObjectPtr, call the Callback when complete. */ 111 | template 112 | void AsyncLoad(TSoftObjectPtr SoftObject, TFunction&& Callback) 113 | { 114 | AsyncLoad(SoftObject.ToSoftObjectPath(), FSimpleDelegate::CreateLambda(MoveTemp(Callback))); 115 | } 116 | 117 | /** Async load a TSoftObjectPtr, call the Callback when complete. */ 118 | template 119 | void AsyncLoad(TSoftObjectPtr SoftObject, TFunction&& Callback) 120 | { 121 | AsyncLoad(SoftObject.ToSoftObjectPath(), 122 | FSimpleDelegate::CreateLambda([SoftObject, UserCallback = MoveTemp(Callback)]() mutable { 123 | UserCallback(SoftObject.Get()); 124 | }) 125 | ); 126 | } 127 | 128 | /** Async load a TSoftObjectPtr, call the Callback when complete. */ 129 | template 130 | void AsyncLoad(TSoftObjectPtr SoftObject, const FSimpleDelegate& Callback = FSimpleDelegate()) 131 | { 132 | AsyncLoad(SoftObject.ToSoftObjectPath(), Callback); 133 | } 134 | 135 | /** Async load a FSoftObjectPath, call the Callback when complete. */ 136 | void AsyncLoad(FSoftObjectPath SoftObjectPath, const FSimpleDelegate& Callback = FSimpleDelegate()); 137 | 138 | /** Async load an array of FSoftObjectPath, call the Callback when complete. */ 139 | void AsyncLoad(const TArray& SoftObjectPaths, TFunction&& Callback) 140 | { 141 | AsyncLoad(SoftObjectPaths, FSimpleDelegate::CreateLambda(MoveTemp(Callback))); 142 | } 143 | 144 | /** Async load an array of FSoftObjectPath, call the Callback when complete. */ 145 | void AsyncLoad(const TArray& SoftObjectPaths, const FSimpleDelegate& Callback = FSimpleDelegate()); 146 | 147 | /** Given an array of primary assets, it loads all of the bundles referenced by properties of these assets specified in the LoadBundles array. */ 148 | template 149 | void AsyncPreloadPrimaryAssetsAndBundles(const TArray& Assets, const TArray& LoadBundles, const FSimpleDelegate& Callback = FSimpleDelegate()) 150 | { 151 | TArray PrimaryAssetIds; 152 | for (const T* Item : Assets) 153 | { 154 | PrimaryAssetIds.Add(Item); 155 | } 156 | 157 | AsyncPreloadPrimaryAssetsAndBundles(PrimaryAssetIds, LoadBundles, Callback); 158 | } 159 | 160 | /** Given an array of primary asset ids, it loads all of the bundles referenced by properties of these assets specified in the LoadBundles array. */ 161 | void AsyncPreloadPrimaryAssetsAndBundles(const TArray& AssetIds, const TArray& LoadBundles, TFunction&& Callback) 162 | { 163 | AsyncPreloadPrimaryAssetsAndBundles(AssetIds, LoadBundles, FSimpleDelegate::CreateLambda(MoveTemp(Callback))); 164 | } 165 | 166 | /** Given an array of primary asset ids, it loads all of the bundles referenced by properties of these assets specified in the LoadBundles array. */ 167 | void AsyncPreloadPrimaryAssetsAndBundles(const TArray& AssetIds, const TArray& LoadBundles, const FSimpleDelegate& Callback = FSimpleDelegate()); 168 | 169 | /** Add a future condition that must be true before we move forward. */ 170 | void AsyncCondition(TSharedRef Condition, const FSimpleDelegate& Callback = FSimpleDelegate()); 171 | 172 | /** 173 | * Rather than load anything, this callback is just inserted into the callback sequence so that when async loading 174 | * completes this event will be called at the same point in the sequence. Super useful if you don't want a step to be 175 | * tied to a particular asset in case some of the assets are optional. 176 | */ 177 | void AsyncEvent(TFunction&& Callback) 178 | { 179 | AsyncEvent(FSimpleDelegate::CreateLambda(MoveTemp(Callback))); 180 | } 181 | 182 | /** 183 | * Rather than load anything, this callback is just inserted into the callback sequence so that when async loading 184 | * completes this event will be called at the same point in the sequence. Super useful if you don't want a step to be 185 | * tied to a particular asset in case some of the assets are optional. 186 | */ 187 | void AsyncEvent(const FSimpleDelegate& Callback); 188 | 189 | /** Flushes any async loading requests. */ 190 | void StartAsyncLoading(); 191 | 192 | /** Cancels any pending async loads. */ 193 | void CancelAsyncLoading(); 194 | 195 | /** Is async loading current in progress? */ 196 | bool IsAsyncLoadingInProgress() const; 197 | 198 | private: 199 | /** 200 | * The FLoadingState is what actually is allocated for the FAsyncMixinProc in a big map so that the FAsyncMixinProc itself holds no 201 | * no memory, and we dynamically create the FLoadingState only if needed, and destroy it when it's unneeded. 202 | */ 203 | class FLoadingState : public TSharedFromThis 204 | { 205 | public: 206 | FLoadingState(FAsyncMixinProc& InOwner); 207 | virtual ~FLoadingState(); 208 | 209 | /** Starts the async sequence. */ 210 | void Start(); 211 | 212 | /** Cancels the async sequence. */ 213 | void CancelAndDestroy(); 214 | 215 | void AsyncLoad(FSoftObjectPath SoftObject, const FSimpleDelegate& DelegateToCall); 216 | void AsyncLoad(const TArray& SoftObjectPaths, const FSimpleDelegate& DelegateToCall); 217 | void AsyncPreloadPrimaryAssetsAndBundles(const TArray& PrimaryAssetIds, const TArray& LoadBundles, const FSimpleDelegate& DelegateToCall); 218 | void AsyncCondition(TSharedRef Condition, const FSimpleDelegate& Callback); 219 | void AsyncEvent(const FSimpleDelegate& Callback); 220 | 221 | bool IsLoadingComplete() const { return !IsLoadingInProgress(); } 222 | bool IsLoadingInProgress() const; 223 | bool IsLoadingInProgressOrPending() const; 224 | bool IsPendingDestroy() const; 225 | 226 | private: 227 | void CancelOnly(bool bDestroying); 228 | void CancelStartTimer(); 229 | void TryScheduleStart(); 230 | void TryCompleteAsyncLoading(); 231 | void CompleteAsyncLoading(); 232 | 233 | private: 234 | void RequestDestroyThisMemory(); 235 | void CancelDestroyThisMemory(bool bDestroying); 236 | 237 | /** Who owns the loading state? We need this to call back into the owning mix-in object. */ 238 | FAsyncMixinProc& OwnerRef; 239 | 240 | /** 241 | * Did we need to pre-load bundles? If we didn't pre-load bundles (which require you keep the streaming handle 242 | * around or they will be destroyed), then we can safely destroy the FLoadingState when everything is done loading. 243 | */ 244 | bool bPreloadedBundles = false; 245 | 246 | class FAsyncStep 247 | { 248 | public: 249 | FAsyncStep(const FSimpleDelegate& InUserCallback); 250 | FAsyncStep(const FSimpleDelegate& InUserCallback, const TSharedPtr& InStreamingHandle); 251 | FAsyncStep(const FSimpleDelegate& InUserCallback, const TSharedPtr& InCondition); 252 | 253 | ~FAsyncStep(); 254 | 255 | void ExecuteUserCallback(); 256 | 257 | bool IsLoadingInProgress() const 258 | { 259 | return !IsComplete(); 260 | } 261 | 262 | bool IsComplete() const; 263 | void Cancel(); 264 | 265 | bool BindCompleteDelegate(const FSimpleDelegate& NewDelegate); 266 | bool IsCompleteDelegateBound() const; 267 | 268 | private: 269 | FSimpleDelegate UserCallback; 270 | bool bIsCompletionDelegateBound = false; 271 | 272 | // Possible Async 'thing' 273 | TSharedPtr StreamingHandle; 274 | TSharedPtr Condition; 275 | }; 276 | 277 | bool bHasStarted = false; 278 | 279 | int32 CurrentAsyncStep = 0; 280 | TArray> AsyncSteps; 281 | TArray> AsyncStepsPendingDestruction; 282 | 283 | FTSTicker::FDelegateHandle StartTimerDelegate; 284 | FTSTicker::FDelegateHandle DestroyMemoryDelegate; 285 | }; 286 | 287 | const FLoadingState& GetLoadingStateConst() const; 288 | 289 | FLoadingState& GetLoadingState(); 290 | 291 | bool HasLoadingState() const; 292 | 293 | bool IsLoadingInProgressOrPending() const; 294 | 295 | private: 296 | static TMap> Loading; 297 | }; 298 | 299 | /** 300 | * Sometimes a mix-in just doesn't make sense. Perhaps the object has to manage many different jobs 301 | * that each have their own async dependency chain/scope. For those situations you can use the FAsyncScope. 302 | * 303 | * This class is a standalone Async dependency handler so that you can fire off several load jobs and always handle them 304 | * in the proper order, just like with combining FAsyncMixinProc with your class. 305 | */ 306 | class PROCHITREACT_API FAsyncScope : public FAsyncMixinProc 307 | { 308 | public: 309 | using FAsyncMixinProc::AsyncLoad; 310 | 311 | using FAsyncMixinProc::AsyncPreloadPrimaryAssetsAndBundles; 312 | 313 | using FAsyncMixinProc::AsyncCondition; 314 | 315 | using FAsyncMixinProc::AsyncEvent; 316 | 317 | using FAsyncMixinProc::CancelAsyncLoading; 318 | 319 | using FAsyncMixinProc::StartAsyncLoading; 320 | 321 | using FAsyncMixinProc::IsAsyncLoadingInProgress; 322 | }; 323 | 324 | //------------------------------------------------------------------------------ 325 | //------------------------------------------------------------------------------ 326 | 327 | enum class EAsyncConditionResult : uint8 328 | { 329 | TryAgain, 330 | Complete 331 | }; 332 | 333 | DECLARE_DELEGATE_RetVal(EAsyncConditionResult, FAsyncConditionDelegate); 334 | 335 | /** 336 | * The async condition allows you to have custom reasons to hault the async loading until some condition is met. 337 | */ 338 | class FAsyncCondition : public TSharedFromThis 339 | { 340 | public: 341 | FAsyncCondition(const FAsyncConditionDelegate& Condition); 342 | FAsyncCondition(TFunction&& Condition); 343 | virtual ~FAsyncCondition(); 344 | 345 | protected: 346 | bool IsComplete() const; 347 | bool BindCompleteDelegate(const FSimpleDelegate& NewDelegate); 348 | 349 | private: 350 | bool TryToContinue(float DeltaTime); 351 | 352 | FTSTicker::FDelegateHandle RepeatHandle; 353 | FAsyncConditionDelegate UserCondition; 354 | FSimpleDelegate CompletionDelegate; 355 | 356 | friend FAsyncMixinProc; 357 | }; 358 | -------------------------------------------------------------------------------- /Source/ProcHitReactEditor/Private/HitReactDetailsCustomization.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | 4 | #include "HitReactDetailsCustomization.h" 5 | 6 | #include "DetailLayoutBuilder.h" 7 | #include "HitReact.h" 8 | 9 | 10 | TSharedRef FHitReactDetailsCustomization::MakeInstance() 11 | { 12 | return MakeShared(); 13 | } 14 | 15 | void FHitReactDetailsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) 16 | { 17 | TArray> Objects; 18 | DetailBuilder.GetObjectsBeingCustomized(Objects); 19 | 20 | for (const TWeakObjectPtr& Object : Objects) 21 | { 22 | if (Object.Get()->IsA()) 23 | { 24 | // Bump HitReact to the top of the details panel 25 | DetailBuilder.EditCategory(TEXT("HitReact"), FText::GetEmpty(), ECategoryPriority::Transform); 26 | 27 | // We cannot hide these properties because they're abnormal, just hide the category 28 | DetailBuilder.HideCategory("ComponentTick"); 29 | DetailBuilder.HideCategory("Sockets"); 30 | 31 | DetailBuilder.HideProperty("bReplicates", UActorComponent::StaticClass()); 32 | DetailBuilder.HideProperty("bIsEditorOnly", UActorComponent::StaticClass()); 33 | DetailBuilder.HideProperty("bCanEverAffectNavigation", UActorComponent::StaticClass()); 34 | DetailBuilder.HideProperty("bReplicateUsingRegisteredSubObjectList", UActorComponent::StaticClass()); 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /Source/ProcHitReactEditor/Private/HitReactDetailsCustomization.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) Jared Taylor 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "IDetailCustomization.h" 7 | 8 | /** 9 | * 10 | */ 11 | class FHitReactDetailsCustomization : public IDetailCustomization 12 | { 13 | public: 14 | static TSharedRef MakeInstance(); 15 | 16 | virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override; 17 | }; 18 | -------------------------------------------------------------------------------- /Source/ProcHitReactEditor/Private/ProcHitReactEditor.cpp: -------------------------------------------------------------------------------- 1 | #include "ProcHitReactEditor.h" 2 | #include "PropertyEditorModule.h" 3 | #include "HitReact.h" 4 | #include "HitReactDetailsCustomization.h" 5 | 6 | #define LOCTEXT_NAMESPACE "FProcHitReactEditorModule" 7 | 8 | void FProcHitReactEditorModule::StartupModule() 9 | { 10 | FPropertyEditorModule& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor"); 11 | 12 | // Hit React Component 13 | PropertyModule.RegisterCustomClassLayout( 14 | UHitReact::StaticClass()->GetFName(), 15 | FOnGetDetailCustomizationInstance::CreateStatic(&FHitReactDetailsCustomization::MakeInstance) 16 | ); 17 | } 18 | 19 | void FProcHitReactEditorModule::ShutdownModule() 20 | { 21 | if (FModuleManager::Get().IsModuleLoaded("PropertyEditor")) 22 | { 23 | FPropertyEditorModule* PropertyModule = FModuleManager::Get().GetModulePtr("PropertyEditor"); 24 | 25 | // Hit React Component 26 | PropertyModule->UnregisterCustomClassLayout(UHitReact::StaticClass()->GetFName()); 27 | } 28 | } 29 | 30 | #undef LOCTEXT_NAMESPACE 31 | 32 | IMPLEMENT_MODULE(FProcHitReactEditorModule, ProcHitReactEditor) -------------------------------------------------------------------------------- /Source/ProcHitReactEditor/ProcHitReactEditor.Build.cs: -------------------------------------------------------------------------------- 1 | using UnrealBuildTool; 2 | 3 | public class ProcHitReactEditor : ModuleRules 4 | { 5 | public ProcHitReactEditor(ReadOnlyTargetRules Target) : base(Target) 6 | { 7 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 8 | 9 | PublicDependencyModuleNames.AddRange( 10 | new string[] 11 | { 12 | "Core", 13 | } 14 | ); 15 | 16 | PrivateDependencyModuleNames.AddRange( 17 | new string[] 18 | { 19 | "CoreUObject", 20 | "Engine", 21 | "ProcHitReact", 22 | } 23 | ); 24 | } 25 | } -------------------------------------------------------------------------------- /Source/ProcHitReactEditor/Public/ProcHitReactEditor.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CoreMinimal.h" 4 | #include "Modules/ModuleManager.h" 5 | 6 | class FProcHitReactEditorModule : public IModuleInterface 7 | { 8 | public: 9 | virtual void StartupModule() override; 10 | virtual void ShutdownModule() override; 11 | }; 12 | --------------------------------------------------------------------------------