Add DamageFlash component for visual feedback on damage; implement flash effect with customizable duration and color

This commit is contained in:
2025-07-12 18:30:42 +02:00
parent df7462652f
commit a4fe7bbb07
13 changed files with 1506 additions and 5 deletions

View File

@@ -21,6 +21,7 @@ GameObject:
- component: {fileID: 2964327480768693548}
- component: {fileID: 435001957072118475}
- component: {fileID: 1527323237162929931}
- component: {fileID: 3779661959168575914}
m_Layer: 0
m_Name: Basic Enemy
m_TagString: Enemy
@@ -339,6 +340,22 @@ MonoBehaviour:
character: {fileID: 3298396436480561959}
aiPath: {fileID: 2964327480768693548}
target: {fileID: 0}
--- !u!114 &3779661959168575914
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 204632724861940951}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 858b89cbe8774ee4a74182a9c4195c67, type: 3}
m_Name:
m_EditorClassIdentifier:
flashDuration: 0.1
flashColor: {r: 1.6817929, g: 1.6817929, b: 1.6817929, a: 1}
health: {fileID: 9093693903318130491}
spriteRenderer: {fileID: 987872320002065258}
--- !u!1 &3667932760953165253
GameObject:
m_ObjectHideFlags: 0
@@ -394,7 +411,7 @@ SpriteRenderer:
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
- {fileID: 2100000, guid: 0c6402377b097ca3992a420467f72056, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0

View File

@@ -165,7 +165,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
weaponStats:
damage: 1
damage: 4
attackSpeed: 2
range: 0
damageType: 1

8
Assets/Scenes/main.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ce5ade8f24618d06abed8509b29338bb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -465,7 +465,7 @@ MonoBehaviour:
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_RenderPostProcessing: 1
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
@@ -786,6 +786,10 @@ PrefabInstance:
propertyPath: m_Name
value: strawberry
objectReference: {fileID: 0}
- target: {fileID: 3626916397498700004, guid: 3456e0420235c3e7797d8a191c2de57f, type: 3}
propertyPath: 'm_Materials.Array.data[0]'
value:
objectReference: {fileID: 2100000, guid: 0c6402377b097ca3992a420467f72056, type: 2}
- target: {fileID: 7878350319992209165, guid: 3456e0420235c3e7797d8a191c2de57f, type: 3}
propertyPath: m_LocalPosition.x
value: 0
@@ -836,6 +840,11 @@ Transform:
m_CorrespondingSourceObject: {fileID: 7878350319992209165, guid: 3456e0420235c3e7797d8a191c2de57f, type: 3}
m_PrefabInstance: {fileID: 628985990}
m_PrefabAsset: {fileID: 0}
--- !u!212 &628985992 stripped
SpriteRenderer:
m_CorrespondingSourceObject: {fileID: 3626916397498700004, guid: 3456e0420235c3e7797d8a191c2de57f, type: 3}
m_PrefabInstance: {fileID: 628985990}
m_PrefabAsset: {fileID: 0}
--- !u!1 &640255470
GameObject:
m_ObjectHideFlags: 0
@@ -6937,6 +6946,7 @@ GameObject:
- component: {fileID: 1261447610}
- component: {fileID: 1261447609}
- component: {fileID: 1261447613}
- component: {fileID: 1261447614}
m_Layer: 6
m_Name: Player
m_TagString: Player
@@ -7041,8 +7051,8 @@ MonoBehaviour:
armor: 0
level: 1
experience: 0
baseExperienceToLevelUp: 25
damage: 49
baseExperienceToLevelUp: 5
damage: 1
rangedDamage: 1
meleeDamage: 1
attackRange: 16
@@ -7190,6 +7200,71 @@ MonoBehaviour:
mainCamera: {fileID: 519420031}
weapons: []
weaponsManager: {fileID: 1261447612}
--- !u!114 &1261447614
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1261447599}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 858b89cbe8774ee4a74182a9c4195c67, type: 3}
m_Name:
m_EditorClassIdentifier:
flashDuration: 0.1
flashColor: {r: 1.6934906, g: 1.6934906, b: 1.6934906, a: 1}
health: {fileID: 1261447608}
spriteRenderer: {fileID: 628985992}
--- !u!1 &1265960066
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1265960068}
- component: {fileID: 1265960067}
m_Layer: 0
m_Name: Global Volume
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1265960067
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1265960066}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IsGlobal: 1
priority: 0
blendDistance: 0
weight: 1
sharedProfile: {fileID: 11400000, guid: 6e3296081b34c0dce831316c320aa3b2, type: 2}
--- !u!4 &1265960068
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1265960066}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -9.939604, y: -1.4867522, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1300312975
GameObject:
m_ObjectHideFlags: 0
@@ -8603,3 +8678,4 @@ SceneRoots:
- {fileID: 1791967925}
- {fileID: 1368041001}
- {fileID: 1953393769}
- {fileID: 1265960068}

View File

@@ -0,0 +1,109 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-6216573411260604986
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3}
m_Name: Bloom
m_EditorClassIdentifier:
active: 1
skipIterations:
m_OverrideState: 0
m_Value: 1
threshold:
m_OverrideState: 1
m_Value: 1.5
intensity:
m_OverrideState: 1
m_Value: 10
scatter:
m_OverrideState: 0
m_Value: 0.7
clamp:
m_OverrideState: 0
m_Value: 65472
tint:
m_OverrideState: 0
m_Value: {r: 1, g: 1, b: 1, a: 1}
highQualityFiltering:
m_OverrideState: 0
m_Value: 0
downscale:
m_OverrideState: 0
m_Value: 0
maxIterations:
m_OverrideState: 0
m_Value: 6
dirtTexture:
m_OverrideState: 0
m_Value: {fileID: 0}
dimension: 1
dirtIntensity:
m_OverrideState: 0
m_Value: 0
--- !u!114 &-5693558520953604991
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 81180773991d8724ab7f2d216912b564, type: 3}
m_Name: ChromaticAberration
m_EditorClassIdentifier:
active: 0
intensity:
m_OverrideState: 1
m_Value: 0.382
--- !u!114 &-107271883349870001
MonoBehaviour:
m_ObjectHideFlags: 3
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3}
m_Name: Vignette
m_EditorClassIdentifier:
active: 1
color:
m_OverrideState: 1
m_Value: {r: 0, g: 0, b: 0, a: 1}
center:
m_OverrideState: 1
m_Value: {x: 0.5, y: 0.5}
intensity:
m_OverrideState: 1
m_Value: 0.543
smoothness:
m_OverrideState: 1
m_Value: 0.18
rounded:
m_OverrideState: 1
m_Value: 0
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3}
m_Name: Global Volume Profile
m_EditorClassIdentifier:
components:
- {fileID: -6216573411260604986}
- {fileID: -107271883349870001}
- {fileID: -5693558520953604991}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6e3296081b34c0dce831316c320aa3b2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,64 @@
using System;
using System.Collections;
using KBCore.Refs;
using UnityEngine;
namespace Systems
{
public class DamageFlash : MonoBehaviour
{
private static readonly int MarkerFlashColor = Shader.PropertyToID("_FlashColor");
private static readonly int MarkerFlashAmount = Shader.PropertyToID("_FlashAmount");
private Material material;
private Coroutine damageFlashCoroutine;
[SerializeField] private float flashDuration;
[ColorUsage(true, true)][SerializeField] private Color flashColor = Color.white;
[SerializeField, Self] private Health health;
[SerializeField, Child] private SpriteRenderer spriteRenderer;
private void OnEnable()
{
health.OnTakeDamage += OnHit;
Initialize();
}
private void OnDisable()
{
health.OnTakeDamage -= OnHit;
}
private void Initialize()
{
if (!spriteRenderer) return;
material = spriteRenderer.material;
}
private void OnHit()
{
damageFlashCoroutine = StartCoroutine(Flash());
}
private IEnumerator Flash()
{
SetFlashColor(flashColor);
var elapsedTime = 0f;
while (elapsedTime < flashDuration)
{
elapsedTime += Time.deltaTime;
var currentFlashAmount = Mathf.Lerp(1f, 0f, elapsedTime / flashDuration);
material.SetFloat(MarkerFlashAmount, currentFlashAmount);
yield return null;
}
}
private void SetFlashColor(Color color)
{
if (!material) return;
material.SetColor(MarkerFlashColor, color);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 858b89cbe8774ee4a74182a9c4195c67
timeCreated: 1752336999

8
Assets/Shaders.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c432d87e544cb3f229cf2fc6d831a62a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 8571b09ed78ce48c6b5b2e588909ffdb
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3}

View File

@@ -0,0 +1,61 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: HitFlashMat
m_Shader: {fileID: -6465566751694194690, guid: 8571b09ed78ce48c6b5b2e588909ffdb, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _FlashAmount: 0
m_Colors:
- _FlashColor: {r: 2, g: 2, b: 2, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &8597859836182365986
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0c6402377b097ca3992a420467f72056
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant: