From 23962bb9619029b08511334ba16fd8bf3282a767 Mon Sep 17 00:00:00 2001 From: Pixel Date: Sun, 2 Aug 2026 21:58:26 +0200 Subject: [PATCH] MonoBehaviour vs DOTS testing --- .vsconfig | 6 + Assets/Prefabs/Units/Capsule.prefab | 160 +++++++++++++ Assets/Prefabs/Units/Capsule.prefab.meta | 7 + Assets/Prefabs/Units/Pille_DOTS.prefab | 130 +++++++++++ Assets/Prefabs/Units/Pille_DOTS.prefab.meta | 7 + Assets/SceneDependencyCache.meta | 8 + ...66d218a463f1b684821.sceneWithBuildSettings | Bin 0 -> 48 bytes ...8a463f1b684821.sceneWithBuildSettings.meta | 7 + Assets/Scenes/Sandbox_Rainer.meta | 8 + Assets/Scenes/Sandbox_Rainer.unity | 211 +++++++----------- Assets/Scenes/Sandbox_Rainer/DotsSetup.unity | 171 ++++++++++++++ .../Sandbox_Rainer/DotsSetup.unity.meta | 7 + Assets/Scripts/DOTS Cheat Sheet.cs | 205 +++++++++++++++++ Assets/Scripts/DOTS Cheat Sheet.cs.meta | 2 + Assets/Scripts/DotsSpawnerAuthoring.cs | 24 ++ Assets/Scripts/DotsSpawnerAuthoring.cs.meta | 2 + Assets/Scripts/ManagerScript.cs | 167 ++++++++++++-- Assets/Scripts/MovingScript.cs | 89 ++++++++ Assets/Scripts/MovingScript.cs.meta | 2 + Assets/Scripts/PilleAuthoring.cs | 27 +++ Assets/Scripts/PilleAuthoring.cs.meta | 2 + Assets/Scripts/PilleWanderData.cs | 12 + Assets/Scripts/PilleWanderData.cs.meta | 2 + Assets/Scripts/PilleWanderSystem.cs | 40 ++++ Assets/Scripts/PilleWanderSystem.cs.meta | 2 + Assets/Scripts/Unity API Referenz.cs | 180 +++++++++++++++ Assets/Scripts/Unity API Referenz.cs.meta | 2 + Assets/Scripts/Unity Cheat Sheet.cs | 205 +++++++++++++++++ Assets/Scripts/Unity Cheat Sheet.cs.meta | 2 + Happy_Forest.slnx | 4 + Packages/manifest.json | 2 + Packages/packages-lock.json | 72 +++++- ProjectSettings/EntitiesClientSettings.asset | 16 ++ ProjectSettings/TagManager.asset | 6 +- 34 files changed, 1623 insertions(+), 164 deletions(-) create mode 100644 .vsconfig create mode 100644 Assets/Prefabs/Units/Capsule.prefab create mode 100644 Assets/Prefabs/Units/Capsule.prefab.meta create mode 100644 Assets/Prefabs/Units/Pille_DOTS.prefab create mode 100644 Assets/Prefabs/Units/Pille_DOTS.prefab.meta create mode 100644 Assets/SceneDependencyCache.meta create mode 100644 Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings create mode 100644 Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings.meta create mode 100644 Assets/Scenes/Sandbox_Rainer.meta create mode 100644 Assets/Scenes/Sandbox_Rainer/DotsSetup.unity create mode 100644 Assets/Scenes/Sandbox_Rainer/DotsSetup.unity.meta create mode 100644 Assets/Scripts/DOTS Cheat Sheet.cs create mode 100644 Assets/Scripts/DOTS Cheat Sheet.cs.meta create mode 100644 Assets/Scripts/DotsSpawnerAuthoring.cs create mode 100644 Assets/Scripts/DotsSpawnerAuthoring.cs.meta create mode 100644 Assets/Scripts/MovingScript.cs create mode 100644 Assets/Scripts/MovingScript.cs.meta create mode 100644 Assets/Scripts/PilleAuthoring.cs create mode 100644 Assets/Scripts/PilleAuthoring.cs.meta create mode 100644 Assets/Scripts/PilleWanderData.cs create mode 100644 Assets/Scripts/PilleWanderData.cs.meta create mode 100644 Assets/Scripts/PilleWanderSystem.cs create mode 100644 Assets/Scripts/PilleWanderSystem.cs.meta create mode 100644 Assets/Scripts/Unity API Referenz.cs create mode 100644 Assets/Scripts/Unity API Referenz.cs.meta create mode 100644 Assets/Scripts/Unity Cheat Sheet.cs create mode 100644 Assets/Scripts/Unity Cheat Sheet.cs.meta create mode 100644 Happy_Forest.slnx create mode 100644 ProjectSettings/EntitiesClientSettings.asset diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..f019fd0 --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/Prefabs/Units/Capsule.prefab b/Assets/Prefabs/Units/Capsule.prefab new file mode 100644 index 0000000..e8d25f0 --- /dev/null +++ b/Assets/Prefabs/Units/Capsule.prefab @@ -0,0 +1,160 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8442802479821363351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 39074758509039986} + - component: {fileID: 1113650087842845955} + - component: {fileID: 1709696524883855978} + - component: {fileID: 8890678473989539349} + - component: {fileID: 6474328328421577028} + - component: {fileID: 369182852915698689} + m_Layer: 10 + m_Name: Capsule + m_TagString: Pille + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &39074758509039986 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -40.97, y: 1.84, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1113650087842845955 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1709696524883855978 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &8890678473989539349 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &6474328328421577028 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 25d7cd903fe278743bee455fa70ffd68, type: 3} + m_Name: + m_EditorClassIdentifier: '::' + geschwindigkeit: 5 + wandTag: Wall + pilleTag: Pille +--- !u!54 &369182852915698689 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + serializedVersion: 5 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_CenterOfMass: {x: 0, y: 0, z: 0} + m_InertiaTensor: {x: 1, y: 1, z: 1} + m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ImplicitCom: 1 + m_ImplicitTensor: 1 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/Assets/Prefabs/Units/Capsule.prefab.meta b/Assets/Prefabs/Units/Capsule.prefab.meta new file mode 100644 index 0000000..16f66f7 --- /dev/null +++ b/Assets/Prefabs/Units/Capsule.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 04bec44a85548c542ad05ccf95af92bb +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Units/Pille_DOTS.prefab b/Assets/Prefabs/Units/Pille_DOTS.prefab new file mode 100644 index 0000000..688ac69 --- /dev/null +++ b/Assets/Prefabs/Units/Pille_DOTS.prefab @@ -0,0 +1,130 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8442802479821363351 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 39074758509039986} + - component: {fileID: 1113650087842845955} + - component: {fileID: 1709696524883855978} + - component: {fileID: 8890678473989539349} + - component: {fileID: 1621524998703728851} + m_Layer: 10 + m_Name: Pille_DOTS + m_TagString: Pille + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &39074758509039986 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -40.97, y: 1.84, z: 0} + m_LocalScale: {x: 0.5, y: 0.5, z: 0.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1113650087842845955 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1709696524883855978 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &8890678473989539349 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &1621524998703728851 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8442802479821363351} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 32b1263ba300f144a92fca434251d14f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::HappyForest.Prototypen.PilleAuthoring + speed: 5 diff --git a/Assets/Prefabs/Units/Pille_DOTS.prefab.meta b/Assets/Prefabs/Units/Pille_DOTS.prefab.meta new file mode 100644 index 0000000..3014ddc --- /dev/null +++ b/Assets/Prefabs/Units/Pille_DOTS.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6756005a10a6f944795b2a02da5d591a +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SceneDependencyCache.meta b/Assets/SceneDependencyCache.meta new file mode 100644 index 0000000..da0a6cc --- /dev/null +++ b/Assets/SceneDependencyCache.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b3b0818e68a228746b4d773f87cdbfd3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings b/Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings new file mode 100644 index 0000000000000000000000000000000000000000..dea5a456d8d96997db94b40d66bbe796585baf35 GIT binary patch literal 48 dcmWeH_2c(`+vMFbGxufe=BsBI&;TPE9{@X82p9kW literal 0 HcmV?d00001 diff --git a/Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings.meta b/Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings.meta new file mode 100644 index 0000000..6a229e7 --- /dev/null +++ b/Assets/SceneDependencyCache/aa2d907f823ed66d218a463f1b684821.sceneWithBuildSettings.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: aa2d907f823ed66d218a463f1b684821 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Sandbox_Rainer.meta b/Assets/Scenes/Sandbox_Rainer.meta new file mode 100644 index 0000000..a5e2193 --- /dev/null +++ b/Assets/Scenes/Sandbox_Rainer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 406888758b0253d49bf20d34d83dc4d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/Sandbox_Rainer.unity b/Assets/Scenes/Sandbox_Rainer.unity index d4c1711..48ae659 100644 --- a/Assets/Scenes/Sandbox_Rainer.unity +++ b/Assets/Scenes/Sandbox_Rainer.unity @@ -148,8 +148,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 570fdde114741274eabb7c5630a5775d, type: 3} m_Name: m_EditorClassIdentifier: '::' - prefabToSpawn: {fileID: 0} - spawnPosition: {x: 0, y: 0, z: 0} + nutzeDOTS: 1 + dotsPrefab: {fileID: 8442802479821363351, guid: 6756005a10a6f944795b2a02da5d591a, type: 3} + oopPrefab: {fileID: 8442802479821363351, guid: 04bec44a85548c542ad05ccf95af92bb, type: 3} + pillenKollidieren: 0 + aktionsVerzoegerung: 0.1 + aktivePillen: [] --- !u!4 &294313398 Transform: m_ObjectHideFlags: 0 @@ -165,120 +169,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &317409014 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 317409018} - - component: {fileID: 317409017} - - component: {fileID: 317409016} - - component: {fileID: 317409015} - m_Layer: 0 - m_Name: Capsule - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!136 &317409015 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317409014} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Radius: 0.5 - m_Height: 2 - m_Direction: 1 - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &317409016 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317409014} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &317409017 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317409014} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &317409018 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 317409014} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -40.97, y: 1.84, 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 &484453422 GameObject: m_ObjectHideFlags: 0 @@ -293,7 +183,7 @@ GameObject: - component: {fileID: 484453423} m_Layer: 0 m_Name: WallNorth - m_TagString: Untagged + m_TagString: Wall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -385,12 +275,65 @@ Transform: m_GameObject: {fileID: 484453422} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.52011, y: 2.5, z: 21.64156} - m_LocalScale: {x: 100, y: 5, z: 1} + m_LocalPosition: {x: 0.52011, y: 2.5, z: 53.339} + m_LocalScale: {x: 229.81999, y: 5, z: 2.2937} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1401811864} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &553331995 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553331997} + - component: {fileID: 553331996} + m_Layer: 0 + m_Name: DotsSetup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &553331996 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 553331995} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45a335734b1572644a6a5d09d87adc65, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Scenes::Unity.Scenes.SubScene + _SceneAsset: {fileID: 102900000, guid: 7157e4f0b4de28b48899d69ed53b5dcc, type: 3} + _HierarchyColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + AutoLoadScene: 1 + _SceneGUID: + Value: + x: 256800023 + y: 1266871627 + z: 3916274056 + w: 3436557149 +--- !u!4 &553331997 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 553331995} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, 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 &925142572 GameObject: m_ObjectHideFlags: 0 @@ -573,13 +516,13 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1109898414} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalRotation: {x: 0.13389976, y: -0.3925302, z: 0.057889134, w: 0.9080968} + m_LocalPosition: {x: 112.402405, y: 5.4447975, z: -54.697075} 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} + m_LocalEulerAnglesHint: {x: 50, y: 0, z: 0} --- !u!1 &1401811863 GameObject: m_ObjectHideFlags: 0 @@ -630,7 +573,7 @@ GameObject: - component: {fileID: 1432930634} m_Layer: 0 m_Name: WallSouth - m_TagString: Untagged + m_TagString: Wall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -722,8 +665,8 @@ Transform: m_GameObject: {fileID: 1432930633} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.52011, y: 2.5, z: -27.35844} - m_LocalScale: {x: 100, y: 5, z: 1} + m_LocalPosition: {x: 0.52011, y: 2.5, z: -59.054} + m_LocalScale: {x: 229.81999, y: 5, z: 2.2937} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1401811864} @@ -742,7 +685,7 @@ GameObject: - component: {fileID: 1465384990} m_Layer: 0 m_Name: WallWest - m_TagString: Untagged + m_TagString: Wall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -834,8 +777,8 @@ Transform: m_GameObject: {fileID: 1465384989} serializedVersion: 2 m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} - m_LocalPosition: {x: -48.97989, y: 2.5, z: -2.85844} - m_LocalScale: {x: 48, y: 5, z: 1} + m_LocalPosition: {x: -113.24, y: 2.5, z: -2.8587} + m_LocalScale: {x: 110.097595, y: 5, z: 2.2982} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1401811864} @@ -946,8 +889,8 @@ Transform: m_GameObject: {fileID: 2016336478} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.52011, y: -0.5, z: -2.85844} - m_LocalScale: {x: 100, y: 1, z: 50} + m_LocalPosition: {x: 0.52011, y: -0.5, z: -2.8587} + m_LocalScale: {x: 229.81999, y: 1, z: 114.685} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1401811864} @@ -966,7 +909,7 @@ GameObject: - component: {fileID: 2056509220} m_Layer: 0 m_Name: WallEast - m_TagString: Untagged + m_TagString: Wall m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -1058,8 +1001,8 @@ Transform: m_GameObject: {fileID: 2056509219} serializedVersion: 2 m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} - m_LocalPosition: {x: 50.02011, y: 2.5, z: -2.85844} - m_LocalScale: {x: 48, y: 5, z: 1} + m_LocalPosition: {x: 114.28, y: 2.5, z: -2.8586} + m_LocalScale: {x: 110.097595, y: 5, z: 2.2982} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 1401811864} @@ -1070,6 +1013,6 @@ SceneRoots: m_Roots: - {fileID: 1109898417} - {fileID: 925142574} - - {fileID: 317409018} - {fileID: 1401811864} - {fileID: 294313398} + - {fileID: 553331997} diff --git a/Assets/Scenes/Sandbox_Rainer/DotsSetup.unity b/Assets/Scenes/Sandbox_Rainer/DotsSetup.unity new file mode 100644 index 0000000..e74e572 --- /dev/null +++ b/Assets/Scenes/Sandbox_Rainer/DotsSetup.unity @@ -0,0 +1,171 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &148495147 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 148495149} + - component: {fileID: 148495148} + m_Layer: 0 + m_Name: DOTS_Spawner_Setup + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &148495148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148495147} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 79a07f7d3dc16674ea11eff80a43f514, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::HappyForest.Prototypen.DotsSpawnerAuthoring + dotsPrefab: {fileID: 8442802479821363351, guid: 6756005a10a6f944795b2a02da5d591a, type: 3} +--- !u!4 &148495149 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148495147} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 99.2465, y: -0, z: -42.32264} + 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!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 148495149} diff --git a/Assets/Scenes/Sandbox_Rainer/DotsSetup.unity.meta b/Assets/Scenes/Sandbox_Rainer/DotsSetup.unity.meta new file mode 100644 index 0000000..171b007 --- /dev/null +++ b/Assets/Scenes/Sandbox_Rainer/DotsSetup.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7157e4f0b4de28b48899d69ed53b5dcc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/DOTS Cheat Sheet.cs b/Assets/Scripts/DOTS Cheat Sheet.cs new file mode 100644 index 0000000..d3b1ec4 --- /dev/null +++ b/Assets/Scripts/DOTS Cheat Sheet.cs @@ -0,0 +1,205 @@ +namespace DOTSCheatSheet +{ + + using System; // Wird für Events / Actions benötigt + using System.Collections; // Wird für Coroutinen benötigt + using UnityEngine; // Der Haupt-Namespace für fast alles in Unity + + // Das Attribut RequireComponent zwingt Unity dazu, automatisch einen Rigidbody + // an das GameObject zu hängen, sobald dieses Skript hinzugefügt wird. + [RequireComponent(typeof(Rigidbody))] + public class UnityReferenz : MonoBehaviour + { + // ======================================================================== + // 1. VARIABLEN & SICHTBARKEIT (Attribute für den Inspektor) + // ======================================================================== + + [Header("Basis-Variablen")] + [Tooltip("Das ist ein Tooltip. Er erscheint, wenn man mit der Maus im Editor darüber fährt.")] + public int lebenspunkte = 100; // Public: Von überall sichtbar UND im Editor sichtbar + + [SerializeField] + private float geschwindigkeit = 5.5f; // Private + SerializeField: Nur in diesem Skript nutzbar, ABER im Editor einstellbar! (Best Practice) + + [Range(0f, 1f)] + public float lautstaerke = 0.5f; // Erzeugt einen schönen Schieberegler im Unity Editor + + [HideInInspector] + public bool istVersteckt = true; // Public, aber im Editor unsichtbar (für interne Logik) + + [Header("Referenzen zu anderen Dingen")] + [SerializeField] private GameObject meinPrefab; // Referenz auf ein Prefab (z.B. ein Schuss oder Gegner) + [SerializeField] private Transform zielPosition; // Referenz auf eine Position in der Welt (Transform) + [SerializeField] private Renderer meinRenderer; // Referenz auf eine visuelle Komponente + + // Private Variablen (weder von außen noch vom Editor erreichbar) + private Rigidbody meinRigidbody; + private float zeitSeitStart = 0f; + + // ======================================================================== + // 2. UNITY LEBENSZYKLUS (Event-Methoden, die Unity automatisch aufruft) + // ======================================================================== + + // Awake wird als ALLERERSTES aufgerufen, noch bevor das Spiel richtig losgeht. + // Hier holt man sich Referenzen auf die eigenen Komponenten. + void Awake() + { + // Holt den Rigidbody, der auf DIESEM GameObject liegt. + meinRigidbody = GetComponent(); + + if (meinRigidbody == null) + { + Debug.LogError("Hilfe! Hier fehlt ein Rigidbody!"); // Schreibt einen Fehler in die Konsole + } + } + + // Start wird aufgerufen, bevor das erste Update läuft (für Initialisierungen). + void Start() + { + Debug.Log("Das Spiel ist gestartet! Hallo von: " + gameObject.name); + + // Farbe ändern als Test + if (meinRenderer != null) + { + meinRenderer.material.color = Color.blue; + } + + // Startet eine asynchrone Hintergrund-Schleife (Coroutinen, siehe unten) + StartCoroutine(MeinTimer()); + } + + // Update wird JEDEN FRAME aufgerufen. + // Achtung: Wenn das Spiel mit 60 FPS läuft, läuft das hier 60x pro Sekunde! + void Update() + { + // 1. Timer hochzählen mit Time.deltaTime (Zeit, die seit dem letzten Frame vergangen ist) + zeitSeitStart += Time.deltaTime; + + // 2. Input abfragen + AbfrageInput(); + } + + // FixedUpdate wird in festen Zeitintervallen aufgerufen (Standard: 50x pro Sekunde). + // ALLES was mit Physik zu tun hat, MUSS hier rein, NICHT in Update! + void FixedUpdate() + { + // Beispiel: Wir schieben das Objekt stetig nach vorne + // meinRigidbody.AddForce(Vector3.forward * geschwindigkeit); + } + + // ======================================================================== + // 3. EIGENE METHODEN: INPUT & BEWEGUNG + // ======================================================================== + + private void AbfrageInput() + { + // TASTENABFRAGE (Einmaliges Drücken) + if (Input.GetKeyDown(KeyCode.Space)) + { + Springen(); + } + + // TASTENABFRAGE (Gedrückt halten) + if (Input.GetKey(KeyCode.W)) + { + // Bewege das Objekt direkt (ohne Physik) nach vorne + // transform.Translate(Vector3.forward * geschwindigkeit * Time.deltaTime); + } + + // MAUSABFRAGE (0 = Links, 1 = Rechts, 2 = Mitte) + if (Input.GetMouseButtonDown(0)) + { + SpawnObjekt(); + } + } + + private void Springen() + { + // Wirft das Objekt physikalisch in die Luft + meinRigidbody.AddForce(Vector3.up * 300f); + Debug.Log("Hüpf!"); + } + + // ======================================================================== + // 4. INSTANZIIEREN (Spawnen) & ZERSTÖREN + // ======================================================================== + + public void SpawnObjekt() + { + if (meinPrefab == null) return; // Abbruch, wenn kein Prefab hinterlegt ist + + // Instantiate erstellt eine Kopie des Prefabs an unserer aktuellen Position + GameObject neuesObjekt = Instantiate(meinPrefab, transform.position, Quaternion.identity); + + // Wir können das neue Objekt direkt benennen + neuesObjekt.name = "Klon_von_" + gameObject.name; + + // Wir können das Objekt nach 5 Sekunden automatisch zerstören lassen + Destroy(neuesObjekt, 5f); + } + + // ======================================================================== + // 5. PHYSIK & KOLLISIONEN + // ======================================================================== + + // Wird ausgelöst, wenn ein anderes Objekt (mit Collider und Rigidbody) uns RAMMT + void OnCollisionEnter(Collision collision) + { + // Checken, wen wir da gerammt haben (anhand von Tags) + if (collision.gameObject.CompareTag("Player")) + { + Debug.Log("Autsch! Der Spieler hat mich gerammt!"); + + // So können wir z.B. Leben abziehen: + lebenspunkte -= 10; + } + } + + // Wird ausgelöst, wenn ein Objekt eine unsichtbare Lichtschranke durchquert + // (Collider muss auf "Is Trigger" gestellt sein) + void OnTriggerEnter(Collider other) + { + Debug.Log("Etwas ist in meinen Trigger gelaufen: " + other.name); + } + + // ======================================================================== + // 6. RAYCASTING (Laser-Strahlen schießen) + // ======================================================================== + + private void SchiesseLaser() + { + RaycastHit hit; + // Schießt einen Strahl von unserer Position nach vorne, 100 Meter weit + if (Physics.Raycast(transform.position, transform.forward, out hit, 100f)) + { + Debug.Log("Ich schaue genau auf: " + hit.collider.name); + + // Wenn man auf das getroffene Objekt zugreifen will: + // hit.collider.gameObject.GetComponent().MachWas(); + } + } + + // ======================================================================== + // 7. COROUTINEN (Dinge, die Zeit brauchen / Warten) + // ======================================================================== + + // Eine Methode vom Typ IEnumerator läuft parallel und kann pausiert werden + private IEnumerator MeinTimer() + { + Debug.Log("Timer gestartet..."); + + // Pausiert die Ausführung dieser Methode für exakt 2 Sekunden + yield return new WaitForSeconds(2f); + + Debug.Log("2 Sekunden sind vorbei!"); + + // Endlos-Schleifen sind hier okay, WEIL sie mit yield return pausiert werden! + while (lebenspunkte > 0) + { + // Mache jede Sekunde einen Tick Schaden + // lebenspunkte -= 1; + yield return new WaitForSeconds(1f); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/DOTS Cheat Sheet.cs.meta b/Assets/Scripts/DOTS Cheat Sheet.cs.meta new file mode 100644 index 0000000..7b3069c --- /dev/null +++ b/Assets/Scripts/DOTS Cheat Sheet.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4896b8c3148946c47b13a06dc41770db \ No newline at end of file diff --git a/Assets/Scripts/DotsSpawnerAuthoring.cs b/Assets/Scripts/DotsSpawnerAuthoring.cs new file mode 100644 index 0000000..85701e0 --- /dev/null +++ b/Assets/Scripts/DotsSpawnerAuthoring.cs @@ -0,0 +1,24 @@ +using Unity.Entities; +using UnityEngine; + +namespace HappyForest.Prototypen +{ + public class DotsSpawnerAuthoring : MonoBehaviour + { + public GameObject dotsPrefab; + + class Baker : Baker + { + public override void Bake(DotsSpawnerAuthoring authoring) + { + var entity = GetEntity(TransformUsageFlags.None); + + AddComponent(entity, new SpawnerData + { + // TransformUsageFlags.Dynamic ist extrem wichtig, damit die Pille sich später bewegen darf! + DotsPrefabEntity = GetEntity(authoring.dotsPrefab, TransformUsageFlags.Dynamic) + }); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/DotsSpawnerAuthoring.cs.meta b/Assets/Scripts/DotsSpawnerAuthoring.cs.meta new file mode 100644 index 0000000..6b70726 --- /dev/null +++ b/Assets/Scripts/DotsSpawnerAuthoring.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 79a07f7d3dc16674ea11eff80a43f514 \ No newline at end of file diff --git a/Assets/Scripts/ManagerScript.cs b/Assets/Scripts/ManagerScript.cs index 0a283cb..4e0eef9 100644 --- a/Assets/Scripts/ManagerScript.cs +++ b/Assets/Scripts/ManagerScript.cs @@ -1,35 +1,160 @@ +using System.Collections.Generic; +using Unity.Entities; +using Unity.Transforms; using UnityEngine; -public class ManagerScript : MonoBehaviour +namespace HappyForest.Prototypen { - [Header("Spawner Einstellungen")] - [SerializeField] private GameObject prefabToSpawn; // Ziehe hier dein Prefab im Inspector rein - [SerializeField] private Vector3 spawnPosition = Vector3.zero; - - void Start() + // --- DOTS DATEN FÜR DEN MANAGER --- + public struct SpawnerData : IComponentData { - SpawnObject(); + public Entity DotsPrefabEntity; } - void Update() + // --- DER OOP MANAGER --- + public class ManagerScript : MonoBehaviour { - // Beispiel: Spawnen per Leertaste - if (Input.GetKeyDown(KeyCode.Space)) - { - SpawnObject(); - } - } + [Header("Architektur Switch")] + [Tooltip("Schaltet um auf das rasend schnelle Entity Component System")] + public bool nutzeDOTS = false; + public GameObject dotsPrefab; // Zieh hier dein NEUES DOTS-Prefab rein - private void SpawnObject() - { - if (prefabToSpawn != null) + [Header("OOP Spawner Einstellungen")] + public GameObject oopPrefab; // Dein altes Prefab + public bool pillenKollidieren = true; + + [Header("Tasten-Einstellungen")] + public float aktionsVerzoegerung = 0.1f; + private float letzterAktionsZeitpunkt = 0f; + + [HideInInspector] + public List aktivePillen = new List(); + + // DOTS Referenzen + private EntityManager entityManager; + private EntityQuery spawnerQuery; + private int dotsPillenCount = 0; + + void Start() { - // Spawnt das Prefab an der Position spawnPosition mit Standard-Rotation - Instantiate(prefabToSpawn, spawnPosition, Quaternion.identity); + // Initialisiere DOTS Welt + if (World.DefaultGameObjectInjectionWorld != null) + { + entityManager = World.DefaultGameObjectInjectionWorld.EntityManager; + spawnerQuery = entityManager.CreateEntityQuery(typeof(SpawnerData)); + } } - else + + void Update() { - Debug.LogWarning("ManagerScript: Keinem Prefab zugewiesen!"); + // Tote OOP-Pillen aussortieren (falls sie über -10 gefallen sind) + aktivePillen.RemoveAll(pille => pille == null); + + // Tasten gedrückt halten (mit Cooldown) + if (Time.time - letzterAktionsZeitpunkt > aktionsVerzoegerung) + { + // HIER SIND DIE NEUEN TASTEN FÜR DEINE TASTATUR + if (Input.GetKey(KeyCode.Space)) + { + Debug.Log("Leertaste gedrückt!"); // <--- NEU + SpawnPille(1); + letzterAktionsZeitpunkt = Time.time; + } + else if (Input.GetKey(KeyCode.M)) + { + PilleEntfernen(); + letzterAktionsZeitpunkt = Time.time; + } + else if (Input.GetKey(KeyCode.C)) + { + SpawnPille(100); + letzterAktionsZeitpunkt = Time.time; + } + } + } + + private void SpawnPille(int anzahl) + { + if (nutzeDOTS) + { + // --- DOTS SPAWN --- + if (!spawnerQuery.HasSingleton()) + { + Debug.LogError("Abbruch: Manager findet SpawnerData nicht!"); // <--- NEU + return; + } + + Entity prefab = spawnerQuery.GetSingleton().DotsPrefabEntity; + + for (int i = 0; i < anzahl; i++) + { + Entity newEntity = entityManager.Instantiate(prefab); + + // Optionale Startposition (z.B. aus einer bestehenden Pille) könnte man hier über LocalTransform setzen + entityManager.SetComponentData(newEntity, LocalTransform.FromPosition(Vector3.zero)); + dotsPillenCount++; + } + } + else + { + // --- OOP SPAWN (Dein alter Code) --- + for (int i = 0; i < anzahl; i++) + { + Vector3 spawnPos = Vector3.zero; + if (aktivePillen.Count > 0) + { + GameObject randomPille = aktivePillen[Random.Range(0, aktivePillen.Count)]; + spawnPos = randomPille.transform.position; + } + + if (oopPrefab != null) + { + GameObject neu = Instantiate(oopPrefab, spawnPos, Quaternion.identity); + aktivePillen.Add(neu); + + // Kollision umschalten + if (!pillenKollidieren) neu.layer = LayerMask.NameToLayer("Pille"); + else neu.layer = LayerMask.NameToLayer("Default"); + } + } + } + } + + private void PilleEntfernen() + { + if (nutzeDOTS) + { + // In DOTS müsste man hier eine Query machen und eine Entity löschen. + // Für diesen Test reduzieren wir nur den Zähler zur Veranschaulichung. + Debug.Log("Löschen in DOTS benötigt einen kleinen Extra-Job!"); + } + else + { + if (aktivePillen.Count > 0) + { + GameObject pilleToDelete = aktivePillen[0]; + aktivePillen.RemoveAt(0); + Destroy(pilleToDelete); + } + } + } + + void OnGUI() + { + GUI.color = Color.yellow; + GUI.skin.label.fontSize = 20; + + int fps = (int)(1f / Time.unscaledDeltaTime); + GUI.Label(new Rect(10, 10, 400, 30), $"FPS: {fps}"); + + if (nutzeDOTS) + { + GUI.Label(new Rect(10, 40, 400, 30), $"Aktive DOTS Pillen (Gespawnt): {dotsPillenCount}"); + } + else + { + GUI.Label(new Rect(10, 40, 400, 30), $"Aktive OOP Pillen: {aktivePillen.Count}"); + } } } } \ No newline at end of file diff --git a/Assets/Scripts/MovingScript.cs b/Assets/Scripts/MovingScript.cs new file mode 100644 index 0000000..b1c6c4c --- /dev/null +++ b/Assets/Scripts/MovingScript.cs @@ -0,0 +1,89 @@ +using UnityEngine; + +namespace HappyForest.Prototypen +{ + //// Zwingt Unity, der Pille automatisch einen Rigidbody zu geben, falls noch keiner da ist + [RequireComponent(typeof(Rigidbody))] + public class WanderndePille : MonoBehaviour + { + [SerializeField] private float geschwindigkeit = 5f; + [SerializeField] private string wandTag = "Wand"; // Nach diesem Etikett suchen wir + [SerializeField] private string pilleTag = "Pille"; // NEU: Damit sie sich auch gegenseitig erkennen + + private Rigidbody meinRigidbody; + private float zeitLetzterDrehung = 0f; // NEU: Ein Timer, damit sie sich nicht zu oft dreht + + void Start() + { + // Rigidbody-Referenz holen + meinRigidbody = GetComponent(); + + // WICHTIG: Damit die Pille nicht umfällt UND nicht durch Kollisionen anfängt zu trudeln! + // FreezeRotation sperrt direkt alle drei Achsen (X, Y und Z) für die Physik-Engine. + meinRigidbody.constraints = RigidbodyConstraints.FreezeRotation; + + // Zum Start direkt eine zufällige Richtung aussuchen + NeueRichtungWaehlen(false); + } + + void FixedUpdate() + { + // NEU: Fällt die Pille in den Abgrund? + // Wenn Y kleiner als -10 ist, löscht sie sich selbst und beendet die Methode sofort mit "return". + if (transform.position.y < -10f) + { + Destroy(gameObject); + return; + } + + // Wir setzen die Geschwindigkeit des Rigidbodys konstant auf unsere Blickrichtung (forward) + // Die Y-Geschwindigkeit (Fallen) behalten wir bei, damit Schwerkraft noch funktioniert + Vector3 neueGeschwindigkeit = transform.forward * geschwindigkeit; + neueGeschwindigkeit.y = meinRigidbody.linearVelocity.y; + + meinRigidbody.linearVelocity = neueGeschwindigkeit; + } + + // Wird automatisch von Unity aufgerufen, wenn unser Collider einen anderen Collider rammt + void OnCollisionEnter(Collision collision) + { + // Haben wir eine Wand ODER eine andere Pille getroffen UND ist die letzte Drehung lang genug her? (Cooldown) + if ((collision.gameObject.CompareTag(wandTag) || collision.gameObject.CompareTag(pilleTag)) && Time.time > zeitLetzterDrehung + 0.2f) + { + zeitLetzterDrehung = Time.time; // Zeitstempel merken + NeueRichtungWaehlen(true); + } + } + + // Sicherheitsnetz: Falls sie doch mal hängen bleibt und an der Wand reibt + void OnCollisionStay(Collision collision) + { + if ((collision.gameObject.CompareTag(wandTag) || collision.gameObject.CompareTag(pilleTag)) && Time.time > zeitLetzterDrehung + 0.2f) + { + zeitLetzterDrehung = Time.time; + NeueRichtungWaehlen(true); + } + } + + private void NeueRichtungWaehlen(bool wandGetroffen) + { + float neuerWinkel; + + if (wandGetroffen) + { + // Wenn wir eine Wand treffen, drehen wir uns um ca. 180 Grad um! + // (Mit ein bisschen Zufall zwischen 130 und 230 Grad) + float aktuellerWinkel = transform.eulerAngles.y; + neuerWinkel = aktuellerWinkel + Random.Range(130f, 230f); + } + else + { + // Wählt zum Start eine völlig zufällige Zahl zwischen 0 und 360 Grad + neuerWinkel = Random.Range(0f, 360f); + } + + // Dreht die Pille auf der Y-Achse (die Achse, die nach oben zeigt) + transform.rotation = Quaternion.Euler(0f, neuerWinkel, 0f); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/MovingScript.cs.meta b/Assets/Scripts/MovingScript.cs.meta new file mode 100644 index 0000000..e1df15c --- /dev/null +++ b/Assets/Scripts/MovingScript.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 25d7cd903fe278743bee455fa70ffd68 \ No newline at end of file diff --git a/Assets/Scripts/PilleAuthoring.cs b/Assets/Scripts/PilleAuthoring.cs new file mode 100644 index 0000000..311efe8 --- /dev/null +++ b/Assets/Scripts/PilleAuthoring.cs @@ -0,0 +1,27 @@ +using Unity.Entities; +using UnityEngine; +using Unity.Mathematics; + +namespace HappyForest.Prototypen +{ + public class PilleAuthoring : MonoBehaviour + { + public float speed = 5f; + + // Der Baker wird von Unity automatisch beim Start ausgeführt + class PilleBaker : Baker + { + public override void Bake(PilleAuthoring authoring) + { + var entity = GetEntity(TransformUsageFlags.Dynamic); + + // Wir fügen der Entity unsere reinen Daten hinzu + AddComponent(entity, new PilleWanderData + { + Speed = authoring.speed, + Direction = new float3(1, 0, 0) // Startrichtung + }); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/PilleAuthoring.cs.meta b/Assets/Scripts/PilleAuthoring.cs.meta new file mode 100644 index 0000000..fe0ad35 --- /dev/null +++ b/Assets/Scripts/PilleAuthoring.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 32b1263ba300f144a92fca434251d14f \ No newline at end of file diff --git a/Assets/Scripts/PilleWanderData.cs b/Assets/Scripts/PilleWanderData.cs new file mode 100644 index 0000000..394dcd9 --- /dev/null +++ b/Assets/Scripts/PilleWanderData.cs @@ -0,0 +1,12 @@ +using Unity.Entities; +using Unity.Mathematics; + +namespace HappyForest.Prototypen +{ + // IComponentData markiert dieses Struct als DOTS-Komponente + public struct PilleWanderData : IComponentData + { + public float Speed; + public float3 Direction; + } +} \ No newline at end of file diff --git a/Assets/Scripts/PilleWanderData.cs.meta b/Assets/Scripts/PilleWanderData.cs.meta new file mode 100644 index 0000000..05923b8 --- /dev/null +++ b/Assets/Scripts/PilleWanderData.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f8ca2cbf1bd951143b9467b154c4281e \ No newline at end of file diff --git a/Assets/Scripts/PilleWanderSystem.cs b/Assets/Scripts/PilleWanderSystem.cs new file mode 100644 index 0000000..0a426d8 --- /dev/null +++ b/Assets/Scripts/PilleWanderSystem.cs @@ -0,0 +1,40 @@ +using Unity.Burst; +using Unity.Entities; +using Unity.Transforms; +using Unity.Mathematics; + +namespace HappyForest.Prototypen +{ + [BurstCompile] + public partial struct PilleWanderSystem : ISystem + { + [BurstCompile] + public void OnCreate(ref SystemState state) + { + state.RequireForUpdate(); + } + + [BurstCompile] + public void OnUpdate(ref SystemState state) + { + float deltaTime = SystemAPI.Time.DeltaTime; + + // Ein EntityCommandBuffer wird benötigt, um Entities sicher zu zerstören, + // während wir gerade über sie iterieren. + var ecb = SystemAPI.GetSingleton().CreateCommandBuffer(state.WorldUnmanaged); + + // Iteriere über alle Entities, die eine Position (LocalTransform) und unsere WanderData haben + foreach (var (transform, wanderData, entity) in SystemAPI.Query, RefRO>().WithEntityAccess()) + { + // 1. Bewegen (Aktuelle Position + Richtung * Geschwindigkeit * Zeit) + transform.ValueRW.Position += wanderData.ValueRO.Direction * wanderData.ValueRO.Speed * deltaTime; + + // 2. Abgrund-Check (Runtergefallen?) + if (transform.ValueRO.Position.y < -10f) + { + ecb.DestroyEntity(entity); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/PilleWanderSystem.cs.meta b/Assets/Scripts/PilleWanderSystem.cs.meta new file mode 100644 index 0000000..9ad6289 --- /dev/null +++ b/Assets/Scripts/PilleWanderSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bbc9d633e4db8d248a1394d5c6ca02d2 \ No newline at end of file diff --git a/Assets/Scripts/Unity API Referenz.cs b/Assets/Scripts/Unity API Referenz.cs new file mode 100644 index 0000000..9386d84 --- /dev/null +++ b/Assets/Scripts/Unity API Referenz.cs @@ -0,0 +1,180 @@ +namespace UnityAPIReference +{ + + using UnityEngine; + using UnityEngine.SceneManagement; // WICHTIG: Für den Szenen-Wechsel + using UnityEngine.UI; // WICHTIG: Für klassische UI (Text, Buttons) + + public class UnityAPIReferenz : MonoBehaviour + { + [Header("Referenzen auf andere Komponenten")] + public Rigidbody meinRigidbody; + public Renderer meinRenderer; + public AudioSource meineAudioquelle; + public Animator meinAnimator; + public Light meinLicht; + public Text meinUI_Text; + + void Start() + { + // ======================================================================== + // 1. DAS EIGENE GAMEOBJECT KONTROLLIEREN + // ======================================================================== + + // Das Objekt komplett de-aktivieren (verschwindet aus der Welt, Updates stoppen) + gameObject.SetActive(false); + gameObject.SetActive(true); + + // Namen und Tag auslesen oder ändern + gameObject.name = "Neuer_Name_im_Inspector"; + gameObject.tag = "Player"; // (Achtung: Der Tag muss im Editor existieren!) + + // Das Objekt nach 3 Sekunden komplett aus dem Speicher löschen + Destroy(gameObject, 3f); + + + // ======================================================================== + // 2. TRANSFORM (Position, Rotation, Skalierung & Hierarchie) + // Transform hat JEDES GameObject standardmäßig. + // ======================================================================== + + // Position setzen (Vector3 = X, Y, Z Koordinaten) + transform.position = new Vector3(0, 5, 0); // Absolute Welt-Position + transform.localPosition = new Vector3(0, 0, 0); // Position relativ zum "Eltern-Objekt" + + // Rotation setzen (Quaternion ist komplex, daher nutzen wir Euler-Winkel in Grad) + transform.rotation = Quaternion.Euler(0, 90, 0); // Dreht das Objekt um 90 Grad auf der Y-Achse + + // Skalierung (Größe) ändern + transform.localScale = new Vector3(2, 2, 2); // Macht das Objekt doppelt so groß + + // Direkte Bewegungen (ohne Physik!) + transform.Translate(Vector3.forward * 5f); // 5 Meter nach vorne schieben + transform.Rotate(Vector3.up, 45f); // Um 45 Grad drehen + + // Hierarchie (Parenting) ändern + // transform.SetParent(anderesGameObject.transform); // Hängt dieses Objekt an ein anderes an + transform.SetParent(null); // Macht das Objekt wieder komplett unabhängig (Root-Ebene) + + + // ======================================================================== + // 3. KOMPONENTEN FINDEN UND AUSLESEN (Sehr wichtig!) + // ======================================================================== + + // Holt die Komponente "BoxCollider", die auf demselben GameObject liegt + BoxCollider meinCollider = GetComponent(); + if (meinCollider != null) + { + meinCollider.enabled = false; // Schaltet die Kollision ab + } + + // ======================================================================== + // 4. PHYSIK (Rigidbody) + // ======================================================================== + + if (meinRigidbody != null) + { + // Einen Impuls-Schub geben (z.B. für einen Sprung oder eine Explosion) + meinRigidbody.AddForce(Vector3.up * 500f, ForceMode.Impulse); + + // Die aktuelle Geschwindigkeit direkt überschreiben oder auslesen + meinRigidbody.linearVelocity = new Vector3(0, 10, 0); + + // Schwerkraft für dieses Objekt deaktivieren + meinRigidbody.useGravity = false; + + // Masse ändern + meinRigidbody.mass = 50f; + + // IsKinematic: Wenn true, wird das Objekt NICHT mehr von Physik (Schwerkraft/Stöße) + // beeinflusst, kann aber per Skript bewegt werden und rammt andere Objekte weg. + meinRigidbody.isKinematic = true; + } + + // ======================================================================== + // 5. GRAFIK & MATERIALIEN (Renderer) + // ======================================================================== + + if (meinRenderer != null) + { + // Das Objekt unsichtbar machen (es bleibt aber da und hat noch Kollision!) + meinRenderer.enabled = false; + + // Die Farbe des Materials ändern + meinRenderer.material.color = Color.red; // Standard-Farben + meinRenderer.material.color = new Color(0.5f, 0.2f, 0.8f, 1f); // RGBA (Rot, Grün, Blau, Alpha/Transparenz) + } + + // ======================================================================== + // 6. AUDIO & SOUNDS + // ======================================================================== + + if (meineAudioquelle != null) + { + meineAudioquelle.volume = 0.5f; // Lautstärke (0.0 bis 1.0) + meineAudioquelle.pitch = 1.2f; // Tonhöhe (1.0 = normal, < 1 = tiefer/langsamer) + meineAudioquelle.Play(); // Sound abspielen + meineAudioquelle.Stop(); // Sound stoppen + } + + // ======================================================================== + // 7. ANIMATIONEN (Animator) + // Setzt Parameter, die du im Animator-Fenster definiert hast + // ======================================================================== + + if (meinAnimator != null) + { + meinAnimator.SetBool("IsRunning", true); // Eine Checkbox umschalten + meinAnimator.SetFloat("Speed", 5.5f); // Einen Komma-Wert übergeben + meinAnimator.SetTrigger("Jump"); // Einen einmaligen Impuls feuern + } + + // ======================================================================== + // 8. LICHT + // ======================================================================== + + if (meinLicht != null) + { + meinLicht.intensity = 10f; // Helligkeit + meinLicht.color = Color.yellow; // Lichtfarbe + meinLicht.range = 50f; // Reichweite des Lichts + } + + // ======================================================================== + // 9. ZEIT KONTROLLIEREN (Time-Klasse) + // ======================================================================== + + // Zeitlupen-Effekt (0.5 = halbe Geschwindigkeit, 0 = Spiel pausiert!) + // Time.timeScale = 0.5f; + + // Wieviel Zeit seit Spielstart vergangen ist (in Sekunden) + float zeit = Time.time; + + // ======================================================================== + // 10. SZENEN & LEVEL WECHSELN + // ======================================================================== + + // Lädt die Szene mit dem Namen "Level_02" (Muss in den Build-Settings hinzugefügt sein!) + // SceneManager.LoadScene("Level_02"); + + // Lädt die aktuelle Szene neu (z.B. nach einem Game Over) + // SceneManager.LoadScene(SceneManager.GetActiveScene().name); + + // ======================================================================== + // 11. HILFS-MATHEMATIK (Die Unity Mathf Klasse) + // ======================================================================== + + // Clamp: Begrenzt einen Wert auf ein Minimum und Maximum + float lebenspunkte = 150f; + lebenspunkte = Mathf.Clamp(lebenspunkte, 0f, 100f); // Setzt den Wert zwingend auf max 100 zurück + + // Random: Eine Zufallszahl generieren + int zufallsZahl = Random.Range(1, 10); // Zahl zwischen 1 und 9 (Int-Maximum ist exklusiv!) + float zufallsKomma = Random.Range(0f, 5.5f); // Float-Maximum ist inklusiv. + + // Lerp (Linear Interpolation): Einen sanften Übergang zwischen zwei Werten berechnen + // Hier: Berechne den Wert genau in der Mitte (0.5f) zwischen 10 und 20 -> Ergebnis: 15 + float sanfterWert = Mathf.Lerp(10f, 20f, 0.5f); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Unity API Referenz.cs.meta b/Assets/Scripts/Unity API Referenz.cs.meta new file mode 100644 index 0000000..f88d512 --- /dev/null +++ b/Assets/Scripts/Unity API Referenz.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 33a1f9a622bebf94faead6cf97e62e2c \ No newline at end of file diff --git a/Assets/Scripts/Unity Cheat Sheet.cs b/Assets/Scripts/Unity Cheat Sheet.cs new file mode 100644 index 0000000..864aafa --- /dev/null +++ b/Assets/Scripts/Unity Cheat Sheet.cs @@ -0,0 +1,205 @@ +namespace UnityCheatSheet +{ + + using System; // Wird für Events / Actions benötigt + using System.Collections; // Wird für Coroutinen benötigt + using UnityEngine; // Der Haupt-Namespace für fast alles in Unity + + // Das Attribut RequireComponent zwingt Unity dazu, automatisch einen Rigidbody + // an das GameObject zu hängen, sobald dieses Skript hinzugefügt wird. + [RequireComponent(typeof(Rigidbody))] + public class UnityReferenz : MonoBehaviour + { + // ======================================================================== + // 1. VARIABLEN & SICHTBARKEIT (Attribute für den Inspektor) + // ======================================================================== + + [Header("Basis-Variablen")] + [Tooltip("Das ist ein Tooltip. Er erscheint, wenn man mit der Maus im Editor darüber fährt.")] + public int lebenspunkte = 100; // Public: Von überall sichtbar UND im Editor sichtbar + + [SerializeField] + private float geschwindigkeit = 5.5f; // Private + SerializeField: Nur in diesem Skript nutzbar, ABER im Editor einstellbar! (Best Practice) + + [Range(0f, 1f)] + public float lautstaerke = 0.5f; // Erzeugt einen schönen Schieberegler im Unity Editor + + [HideInInspector] + public bool istVersteckt = true; // Public, aber im Editor unsichtbar (für interne Logik) + + [Header("Referenzen zu anderen Dingen")] + [SerializeField] private GameObject meinPrefab; // Referenz auf ein Prefab (z.B. ein Schuss oder Gegner) + [SerializeField] private Transform zielPosition; // Referenz auf eine Position in der Welt (Transform) + [SerializeField] private Renderer meinRenderer; // Referenz auf eine visuelle Komponente + + // Private Variablen (weder von außen noch vom Editor erreichbar) + private Rigidbody meinRigidbody; + private float zeitSeitStart = 0f; + + // ======================================================================== + // 2. UNITY LEBENSZYKLUS (Event-Methoden, die Unity automatisch aufruft) + // ======================================================================== + + // Awake wird als ALLERERSTES aufgerufen, noch bevor das Spiel richtig losgeht. + // Hier holt man sich Referenzen auf die eigenen Komponenten. + void Awake() + { + // Holt den Rigidbody, der auf DIESEM GameObject liegt. + meinRigidbody = GetComponent(); + + if (meinRigidbody == null) + { + Debug.LogError("Hilfe! Hier fehlt ein Rigidbody!"); // Schreibt einen Fehler in die Konsole + } + } + + // Start wird aufgerufen, bevor das erste Update läuft (für Initialisierungen). + void Start() + { + Debug.Log("Das Spiel ist gestartet! Hallo von: " + gameObject.name); + + // Farbe ändern als Test + if (meinRenderer != null) + { + meinRenderer.material.color = Color.blue; + } + + // Startet eine asynchrone Hintergrund-Schleife (Coroutinen, siehe unten) + StartCoroutine(MeinTimer()); + } + + // Update wird JEDEN FRAME aufgerufen. + // Achtung: Wenn das Spiel mit 60 FPS läuft, läuft das hier 60x pro Sekunde! + void Update() + { + // 1. Timer hochzählen mit Time.deltaTime (Zeit, die seit dem letzten Frame vergangen ist) + zeitSeitStart += Time.deltaTime; + + // 2. Input abfragen + AbfrageInput(); + } + + // FixedUpdate wird in festen Zeitintervallen aufgerufen (Standard: 50x pro Sekunde). + // ALLES was mit Physik zu tun hat, MUSS hier rein, NICHT in Update! + void FixedUpdate() + { + // Beispiel: Wir schieben das Objekt stetig nach vorne + // meinRigidbody.AddForce(Vector3.forward * geschwindigkeit); + } + + // ======================================================================== + // 3. EIGENE METHODEN: INPUT & BEWEGUNG + // ======================================================================== + + private void AbfrageInput() + { + // TASTENABFRAGE (Einmaliges Drücken) + if (Input.GetKeyDown(KeyCode.Space)) + { + Springen(); + } + + // TASTENABFRAGE (Gedrückt halten) + if (Input.GetKey(KeyCode.W)) + { + // Bewege das Objekt direkt (ohne Physik) nach vorne + // transform.Translate(Vector3.forward * geschwindigkeit * Time.deltaTime); + } + + // MAUSABFRAGE (0 = Links, 1 = Rechts, 2 = Mitte) + if (Input.GetMouseButtonDown(0)) + { + SpawnObjekt(); + } + } + + private void Springen() + { + // Wirft das Objekt physikalisch in die Luft + meinRigidbody.AddForce(Vector3.up * 300f); + Debug.Log("Hüpf!"); + } + + // ======================================================================== + // 4. INSTANZIIEREN (Spawnen) & ZERSTÖREN + // ======================================================================== + + public void SpawnObjekt() + { + if (meinPrefab == null) return; // Abbruch, wenn kein Prefab hinterlegt ist + + // Instantiate erstellt eine Kopie des Prefabs an unserer aktuellen Position + GameObject neuesObjekt = Instantiate(meinPrefab, transform.position, Quaternion.identity); + + // Wir können das neue Objekt direkt benennen + neuesObjekt.name = "Klon_von_" + gameObject.name; + + // Wir können das Objekt nach 5 Sekunden automatisch zerstören lassen + Destroy(neuesObjekt, 5f); + } + + // ======================================================================== + // 5. PHYSIK & KOLLISIONEN + // ======================================================================== + + // Wird ausgelöst, wenn ein anderes Objekt (mit Collider und Rigidbody) uns RAMMT + void OnCollisionEnter(Collision collision) + { + // Checken, wen wir da gerammt haben (anhand von Tags) + if (collision.gameObject.CompareTag("Player")) + { + Debug.Log("Autsch! Der Spieler hat mich gerammt!"); + + // So können wir z.B. Leben abziehen: + lebenspunkte -= 10; + } + } + + // Wird ausgelöst, wenn ein Objekt eine unsichtbare Lichtschranke durchquert + // (Collider muss auf "Is Trigger" gestellt sein) + void OnTriggerEnter(Collider other) + { + Debug.Log("Etwas ist in meinen Trigger gelaufen: " + other.name); + } + + // ======================================================================== + // 6. RAYCASTING (Laser-Strahlen schießen) + // ======================================================================== + + private void SchiesseLaser() + { + RaycastHit hit; + // Schießt einen Strahl von unserer Position nach vorne, 100 Meter weit + if (Physics.Raycast(transform.position, transform.forward, out hit, 100f)) + { + Debug.Log("Ich schaue genau auf: " + hit.collider.name); + + // Wenn man auf das getroffene Objekt zugreifen will: + // hit.collider.gameObject.GetComponent().MachWas(); + } + } + + // ======================================================================== + // 7. COROUTINEN (Dinge, die Zeit brauchen / Warten) + // ======================================================================== + + // Eine Methode vom Typ IEnumerator läuft parallel und kann pausiert werden + private IEnumerator MeinTimer() + { + Debug.Log("Timer gestartet..."); + + // Pausiert die Ausführung dieser Methode für exakt 2 Sekunden + yield return new WaitForSeconds(2f); + + Debug.Log("2 Sekunden sind vorbei!"); + + // Endlos-Schleifen sind hier okay, WEIL sie mit yield return pausiert werden! + while (lebenspunkte > 0) + { + // Mache jede Sekunde einen Tick Schaden + // lebenspunkte -= 1; + yield return new WaitForSeconds(1f); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Unity Cheat Sheet.cs.meta b/Assets/Scripts/Unity Cheat Sheet.cs.meta new file mode 100644 index 0000000..9a2dc68 --- /dev/null +++ b/Assets/Scripts/Unity Cheat Sheet.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1f887ce3b1cfb6c429cccd8f79997796 \ No newline at end of file diff --git a/Happy_Forest.slnx b/Happy_Forest.slnx new file mode 100644 index 0000000..d629b17 --- /dev/null +++ b/Happy_Forest.slnx @@ -0,0 +1,4 @@ + + + + diff --git a/Packages/manifest.json b/Packages/manifest.json index 15d2cf8..6b40146 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,5 +1,7 @@ { "dependencies": { + "com.unity.entities": "1.4.8", + "com.unity.ide.visualstudio": "2.0.27", "com.unity.multiplayer.center": "1.0.1", "com.unity.shadergraph": "17.3.0", "com.unity.modules.accessibility": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index cd24b7c..6bc24d2 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -2,7 +2,7 @@ "dependencies": { "com.unity.burst": { "version": "1.8.30", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "com.unity.mathematics": "1.2.1", @@ -12,7 +12,7 @@ }, "com.unity.collections": { "version": "2.6.8", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": { "com.unity.burst": "1.8.29", @@ -23,15 +23,46 @@ }, "url": "https://packages.unity.com" }, + "com.unity.entities": { + "version": "1.4.8", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.8.29", + "com.unity.collections": "2.6.8", + "com.unity.mathematics": "1.3.2", + "com.unity.modules.audio": "1.0.0", + "com.unity.serialization": "3.1.3", + "com.unity.profiling.core": "1.0.3", + "com.unity.modules.physics": "1.0.0", + "com.unity.nuget.mono-cecil": "1.11.6", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.scriptablebuildpipeline": "1.23.1", + "com.unity.test-framework.performance": "3.0.3" + }, + "url": "https://packages.unity.com" + }, "com.unity.ext.nunit": { "version": "2.0.5", - "depth": 4, + "depth": 2, "source": "builtin", "dependencies": {} }, + "com.unity.ide.visualstudio": { + "version": "2.0.27", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.33" + }, + "url": "https://packages.unity.com" + }, "com.unity.mathematics": { "version": "1.3.3", - "depth": 2, + "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -46,7 +77,14 @@ }, "com.unity.nuget.mono-cecil": { "version": "1.11.6", - "depth": 3, + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.profiling.core": { + "version": "1.0.3", + "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" @@ -65,6 +103,16 @@ "com.unity.modules.jsonserialize": "1.0.0" } }, + "com.unity.scriptablebuildpipeline": { + "version": "2.6.1", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.4.5", + "com.unity.modules.assetbundle": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.searcher": { "version": "4.9.4", "depth": 1, @@ -72,6 +120,16 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.serialization": { + "version": "3.1.3", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.7.2", + "com.unity.collections": "2.4.2" + }, + "url": "https://packages.unity.com" + }, "com.unity.shadergraph": { "version": "17.3.0", "depth": 0, @@ -83,7 +141,7 @@ }, "com.unity.test-framework": { "version": "1.6.0", - "depth": 3, + "depth": 1, "source": "builtin", "dependencies": { "com.unity.ext.nunit": "2.0.3", @@ -93,7 +151,7 @@ }, "com.unity.test-framework.performance": { "version": "3.5.0", - "depth": 3, + "depth": 1, "source": "registry", "dependencies": { "com.unity.test-framework": "1.1.33", diff --git a/ProjectSettings/EntitiesClientSettings.asset b/ProjectSettings/EntitiesClientSettings.asset new file mode 100644 index 0000000..baf6668 --- /dev/null +++ b/ProjectSettings/EntitiesClientSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 53 + 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: e2ea235c1fcfe29488ed97c467a0da53, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Entities.Build::Unity.Entities.Build.EntitiesClientSettings + FilterSettings: + ExcludedBakingSystemAssemblies: [] diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index eb5d9ae..ce7db51 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -3,7 +3,9 @@ --- !u!78 &1 TagManager: serializedVersion: 3 - tags: [] + tags: + - Wall + - Pille layers: - Default - TransparentFX @@ -15,7 +17,7 @@ TagManager: - - - - - + - Pille - - -