The engine supports the instantiation and play of different VFX and SFX depending on the surface type.
By default the engine includes a couple example surface types (such as Metal, Grass and Blood) but more surface types can be easily created by right clicking on the Project view and selecting Create/Horror Engine/Surfaces/Surface Type
https://lh5.googleusercontent.com/7bBUQy3r18V-JHvdoRnXadT9818VFd3hvq0mRPJACO1pkn7rpdzmGHwzRKgKldI5oIy2JhV7NaDL2DlGZIbkHjLAAUgvjOgoujjKL7PC3x26g4rYQ1BeCQsVCFi8woxdH9NgkntPya1zBaSTCDdnT3Iau8k-vNmvOBJ0Xko9geN22f2f6yN8cVxcTA
This surface type can then be assigned to different meshes by attaching the component Surface to the object with a collider. The Type property has to be assigned to reference our new SurfaceType.
https://lh3.googleusercontent.com/H_qTFt40UHCzJz7wnuaMV5LEUab5H2LF-Q5QHMRvlMJVq9_doWWISHzAjXtSSCiO3Y6Qb1btjedjRW4JVsnWjjkrWFCEnCf3yM4wIOz0-Juk6hcd-uXfpe3hA5c09QvtNpFsxLX8R78Y62ADnLvULaDJAAAPfUI-SQlCgTlnshQADH59qJkNkvxmKw
In order to specify the VFX or SFX played for this surface, we can add a new entry to the ScriptableObjects SurfaceSFXSelected or SurfaceVFXSelector.
https://lh5.googleusercontent.com/AogbbYEhssKM_kAYpmw6KkMEISeHFKWIMPo0BqjGJJpdmI5YC-jbp1XAeOjn67jTZFOZS4LWaq3GvZ-UYudUig9sE2AQyNiZBlYXA78LKidCOd3r9RWU4teBp7bW97ziX92K1a3EFlC5ymdJgI7h3-UAV8t6eHjzfP44FPxUb1yfwPkjRubLPMGQ7w
The player model has attached two components that allow the instantiation and play of different VFX and SFX using animation events (Check the Slow Run animation).
https://lh4.googleusercontent.com/wVrJLTy_JkP1TjvywghWHx7DQxIF-tbgo9Yijhdx_GfMktYlwE0ABZNYAT2hBY6whPbhEzBC5r0tCDMYWMgfOthXPYICcS6V5_1fKiw5nzLMKPo6n65Tr8S32r8bVKXiavE1DPFSeZ6IvDxvia22kSOl3ZR73vw2Ifabs-IXNaAd9qxF6ZVrywST8g
These components are VisualEffectsPlayer and SoundEffectsPlayer attached to the player animator.
These components have a list of entries formed by Identifier and Cues which will be played when PlaySFX and PlayVFX are called passing the identifier as the String parameter with the event. (In the screenshot above, the identifier is FootstepL)
Additionally, each entry can optionally reference a specific Selector that will determine which effect to play depending on different conditions specified by the selector. If a Selector is assigned for an, the Cues will be ignored.
As descirbed above, the engine includes two selector classes; SurfaceVFXSelector and SurfaceSFXSelector that allows the player component to play different effects depending on the Surface detected by the SurfaceDetector component attached to the player.
https://lh5.googleusercontent.com/6tEOMidyqxDXFG1HXXU2GqxjtWGCnkgdqccc7ay8gdopM35snXkoXZRSTSQjcyjqXuh7BbUcSIss1_WYLulszahG9HiY9Ze4VTqFjK-mzHFH1wtupw2hFlhOcSh4cvrEc6AY_m63dNqtwgV_vAQYP4YVJpfFJjxAkBpNGDEO51a3ARrepKKXhUOzUg
SurfaceDetector will update the detected surface type every time the player component GroundDetector detects a new collider. This will only happen for the layer mask indicated on the GroundDetector component.