├── .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 |
--------------------------------------------------------------------------------