diff --git a/Assets/Resources/Butterfly.prefab b/Assets/Resources/Butterfly.prefab
new file mode 100644
index 00000000..48ed09c4
--- /dev/null
+++ b/Assets/Resources/Butterfly.prefab
@@ -0,0 +1,716 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &991646415075395470
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8008568497130423293}
+ - component: {fileID: 8919402494214851087}
+ - component: {fileID: 8229769567978585665}
+ m_Layer: 0
+ m_Name: UpperWing
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8008568497130423293
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 991646415075395470}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.5, y: 0.4, z: 0}
+ m_LocalScale: {x: 1.3, y: 1.3, z: 0.3}
+ m_Children: []
+ m_Father: {fileID: 5591064814930782750}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &8919402494214851087
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 991646415075395470}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &8229769567978585665
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 991646415075395470}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!1 &1046338145758687286
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8489916887498396023}
+ - component: {fileID: 6879251021528824578}
+ - component: {fileID: 6211179014730079487}
+ m_Layer: 0
+ m_Name: LowerWing
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8489916887498396023
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1046338145758687286}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.5, y: -0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 0.3}
+ m_Children: []
+ m_Father: {fileID: 814682776945506473}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &6879251021528824578
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1046338145758687286}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &6211179014730079487
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1046338145758687286}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!1 &1477585280903066572
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 5591064814930782750}
+ m_Layer: 0
+ m_Name: WingRight
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &5591064814930782750
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1477585280903066572}
+ m_LocalRotation: {x: 0, y: 0.2588191, z: 0, w: 0.9659258}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 8008568497130423293}
+ - {fileID: 2404873315510811925}
+ m_Father: {fileID: 3636514719014338902}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 30, z: 0}
+--- !u!1 &1871216191951174837
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2404873315510811925}
+ - component: {fileID: 5921926660788516552}
+ - component: {fileID: 4983986825351880441}
+ m_Layer: 0
+ m_Name: LowerWing
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &2404873315510811925
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1871216191951174837}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.5, y: -0.5, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 0.3}
+ m_Children: []
+ m_Father: {fileID: 5591064814930782750}
+ m_RootOrder: 1
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &5921926660788516552
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1871216191951174837}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &4983986825351880441
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1871216191951174837}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!1 &2855194029055974746
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1901794325962471166}
+ - component: {fileID: 6405033900919574126}
+ - component: {fileID: 8701344842131264936}
+ m_Layer: 0
+ m_Name: TendrilLeft
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1901794325962471166
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2855194029055974746}
+ m_LocalRotation: {x: 0, y: 0, z: 0.08715578, w: 0.9961947}
+ m_LocalPosition: {x: -0.06, y: 1.1, z: 0}
+ m_LocalScale: {x: 0.02, y: 0.15, z: 0.02}
+ m_Children: []
+ m_Father: {fileID: 3636514719014338902}
+ m_RootOrder: 2
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 10}
+--- !u!33 &6405033900919574126
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2855194029055974746}
+ m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &8701344842131264936
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2855194029055974746}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!1 &2993840150745115514
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 827066373157184637}
+ - component: {fileID: 5367639586013753549}
+ - component: {fileID: 8047030731867282900}
+ - component: {fileID: 7655398171623067457}
+ m_Layer: 0
+ m_Name: Butterfly
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &827066373157184637
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2993840150745115514}
+ 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_Children:
+ - {fileID: 3636514719014338902}
+ m_Father: {fileID: 0}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &5367639586013753549
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2993840150745115514}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 588a53f9e308795479b5deafb2409b71, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ _type: 8
+--- !u!65 &8047030731867282900
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2993840150745115514}
+ m_Material: {fileID: 0}
+ m_IsTrigger: 1
+ m_Enabled: 1
+ serializedVersion: 2
+ m_Size: {x: 1.8195341, y: 1.3612261, z: 1.9005007}
+ m_Center: {x: 0, y: 0.11655903, z: -0.053422987}
+--- !u!54 &7655398171623067457
+Rigidbody:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2993840150745115514}
+ serializedVersion: 2
+ m_Mass: 1
+ m_Drag: 0
+ m_AngularDrag: 0
+ m_UseGravity: 0
+ m_IsKinematic: 0
+ m_Interpolate: 0
+ m_Constraints: 0
+ m_CollisionDetection: 0
+--- !u!1 &3476534694907690316
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3636514719014338902}
+ m_Layer: 0
+ m_Name: Entity
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &3636514719014338902
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3476534694907690316}
+ m_LocalRotation: {x: 0.5, y: 0, z: 0, w: 0.8660254}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 391456270969537645}
+ - {fileID: 5591064814930782750}
+ - {fileID: 1901794325962471166}
+ - {fileID: 7087493410217138242}
+ - {fileID: 814682776945506473}
+ m_Father: {fileID: 827066373157184637}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 60, y: 0, z: 0}
+--- !u!1 &4624359324713433189
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8526958045338143545}
+ - component: {fileID: 3692214335629163378}
+ - component: {fileID: 2122207419020544819}
+ m_Layer: 0
+ m_Name: UpperWing
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8526958045338143545
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4624359324713433189}
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: 0.5, y: 0.4, z: 0}
+ m_LocalScale: {x: 1.3, y: 1.3, z: 0.3}
+ m_Children: []
+ m_Father: {fileID: 814682776945506473}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &3692214335629163378
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4624359324713433189}
+ m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &2122207419020544819
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4624359324713433189}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!1 &7160409032735634229
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 814682776945506473}
+ m_Layer: 0
+ m_Name: WingLeft
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &814682776945506473
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7160409032735634229}
+ m_LocalRotation: {x: 0, y: 0.9659258, z: 0, w: 0.2588191}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_Children:
+ - {fileID: 8526958045338143545}
+ - {fileID: 8489916887498396023}
+ m_Father: {fileID: 3636514719014338902}
+ m_RootOrder: 4
+ m_LocalEulerAnglesHint: {x: 0, y: 150, z: 0}
+--- !u!1 &7362634901258417595
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 391456270969537645}
+ - component: {fileID: 303920579915094136}
+ - component: {fileID: 5584508775454098069}
+ m_Layer: 0
+ m_Name: Body
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &391456270969537645
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7362634901258417595}
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
+ m_LocalScale: {x: 0.3, y: 1, z: 0.3}
+ m_Children: []
+ m_Father: {fileID: 3636514719014338902}
+ m_RootOrder: 0
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &303920579915094136
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7362634901258417595}
+ m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &5584508775454098069
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7362634901258417595}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+--- !u!1 &9028549881059421617
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 7087493410217138242}
+ - component: {fileID: 3805552051775387363}
+ - component: {fileID: 1197430458320753393}
+ m_Layer: 0
+ m_Name: TendrilRight
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &7087493410217138242
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9028549881059421617}
+ m_LocalRotation: {x: 0, y: 0, z: -0.08715578, w: 0.9961947}
+ m_LocalPosition: {x: 0.06, y: 1.1, z: 0}
+ m_LocalScale: {x: 0.019999998, y: 0.14999999, z: 0.02}
+ m_Children: []
+ m_Father: {fileID: 3636514719014338902}
+ m_RootOrder: 3
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: -10}
+--- !u!33 &3805552051775387363
+MeshFilter:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9028549881059421617}
+ m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &1197430458320753393
+MeshRenderer:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 9028549881059421617}
+ m_Enabled: 1
+ m_CastShadows: 1
+ m_ReceiveShadows: 1
+ m_DynamicOccludee: 1
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ 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_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_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
diff --git a/Assets/Resources/Butterfly.prefab.meta b/Assets/Resources/Butterfly.prefab.meta
new file mode 100644
index 00000000..9f1eb56c
--- /dev/null
+++ b/Assets/Resources/Butterfly.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0167d9e91d1e6e742a4510e447cbef03
+PrefabImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Resources/Data/ButterflyData.asset b/Assets/Resources/Data/ButterflyData.asset
new file mode 100644
index 00000000..bbc5e065
--- /dev/null
+++ b/Assets/Resources/Data/ButterflyData.asset
@@ -0,0 +1,22 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !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: 9198d4fb6d83f4c44b9a7f026a956854, type: 3}
+ m_Name: ButterflyData
+ m_EditorClassIdentifier:
+ Struct:
+ Prefab: {fileID: 2770142703575531339, guid: 0167d9e91d1e6e742a4510e447cbef03,
+ type: 3}
+ Size: 0.5
+ MaxDistanceFromCurrentPosition: 10
+ Speed: 0.1
+ TurnSpeed: 0.03
+ MaxFlyAltitudeFromSpawn: 5
diff --git a/Assets/Resources/Data/ButterflyData.asset.meta b/Assets/Resources/Data/ButterflyData.asset.meta
new file mode 100644
index 00000000..e6daaf32
--- /dev/null
+++ b/Assets/Resources/Data/ButterflyData.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f5120f52297e32c4aa50bb38456e92b9
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Resources/Data/Data.asset b/Assets/Resources/Data/Data.asset
index 79469fc9..01d3c23d 100644
--- a/Assets/Resources/Data/Data.asset
+++ b/Assets/Resources/Data/Data.asset
@@ -12,6 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1b31b7596ae2b4a4ab972d36383fc2fb, type: 3}
m_Name: Data
m_EditorClassIdentifier:
+ _butterflyDataPath: ButterflyData
_sphereDataPath: SphereData
_characterDataPath: CharacterData
_startDialogueDataPath: StartDialogueData
diff --git a/Assets/Scenes/ITickTest.unity b/Assets/Scenes/ITickTest.unity
index 4d05735e..528ce42e 100644
--- a/Assets/Scenes/ITickTest.unity
+++ b/Assets/Scenes/ITickTest.unity
@@ -391,7 +391,7 @@ GameObject:
- component: {fileID: 966662972}
m_Layer: 0
m_Name: BattlePlate
- m_TagString: Untagged
+ m_TagString: Ground
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 8
diff --git a/Assets/Scripts/To_Refactoring/Character/Weapons.meta b/Assets/Scripts/ContextTest/MVC/Butterfly.meta
similarity index 77%
rename from Assets/Scripts/To_Refactoring/Character/Weapons.meta
rename to Assets/Scripts/ContextTest/MVC/Butterfly.meta
index ed151ea9..6bd01143 100644
--- a/Assets/Scripts/To_Refactoring/Character/Weapons.meta
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 3f3aa28c519cc714eabee8aeb10e70f9
+guid: e9dc962257911d646a653355bc3778c8
folderAsset: yes
DefaultImporter:
externalObjects: {}
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyBehaviour.cs b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyBehaviour.cs
new file mode 100644
index 00000000..bc93912d
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyBehaviour.cs
@@ -0,0 +1,6 @@
+namespace BeastHunter
+{
+ class ButterflyBehaviour: InteractableObjectBehavior
+ {
+ }
+}
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyBehaviour.cs.meta b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyBehaviour.cs.meta
new file mode 100644
index 00000000..85f46e17
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyBehaviour.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 588a53f9e308795479b5deafb2409b71
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyController.cs b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyController.cs
new file mode 100644
index 00000000..45e83f46
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyController.cs
@@ -0,0 +1,59 @@
+using UnityEngine;
+
+namespace BeastHunter
+{
+ public class ButterflyController: IAwake, IUpdate
+ {
+ #region Fields
+
+ private readonly GameContext _context;
+
+ #endregion
+
+
+ #region ClassLifeCycle
+
+ public ButterflyController(GameContext context)
+ {
+ _context = context;
+ }
+
+ #endregion
+
+
+ #region IUpdate
+
+ public void Updating()
+ {
+ _context.ButterflyModel.Execute();
+ }
+
+ #endregion
+
+
+ #region IAwake
+
+ public void OnAwake()
+ {
+ var butterflies = _context.GetTriggers(InteractableObjectType.Butterfly);
+ foreach (var trigger in butterflies)
+ {
+ ButterflyBehaviour butterflyBehaviour = trigger as ButterflyBehaviour;
+ butterflyBehaviour.OnFilterHandler += OnFilter;
+ butterflyBehaviour.OnTriggerEnterHandler += OnTriggerEnter;
+ }
+ }
+
+ private bool OnFilter(Collider collider)
+ {
+ return collider.CompareTag(TagManager.GROUND);
+ }
+
+ private void OnTriggerEnter(ITrigger trigger, Collider collider)
+ {
+ _context.ButterflyModel.OnTriggerEnter(collider);
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyController.cs.meta b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyController.cs.meta
new file mode 100644
index 00000000..2737c630
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ddcb6ffd04bd86d4eb943b6513a0af81
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyData.cs b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyData.cs
new file mode 100644
index 00000000..25c3f06f
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyData.cs
@@ -0,0 +1,192 @@
+using BeastHunter;
+using UnityEngine;
+
+
+[CreateAssetMenu(fileName = "NewButterfly", menuName = "CreateData/Butterfly", order = 0)]
+public class ButterflyData : ScriptableObject
+{
+ #region Fields
+
+ private const float SITTING_CHANCE = 75.00f;
+ private const float MIN_SITTING_TIME = 1.5f;
+ private const float MAX_SITTING_TIME = 4.0f;
+
+ public ButterflyStruct Struct;
+
+ #endregion
+
+
+ #region ClassLifeCycle
+
+ public ButterflyData()
+ {
+ Struct.Size = 0.5f;
+ Struct.Speed = 0.1f;
+ Struct.TurnSpeed = 0.03f;
+ Struct.MaxFlyAltitudeFromSpawn = 5.0f;
+ Struct.MaxDistanceFromCurrentPosition = 10.0f;
+ Struct.CircularRotationSpeed = 6.0f;
+ Struct.MinCircleSize = 1.0f;
+ Struct.MaxCircleSize = 3.0f;
+ }
+
+ #endregion
+
+
+ #region Methods
+
+ public void Act(ButterflyModel model)
+ {
+ Transform transform = model.ObjTransform;
+
+ if (model.IsCircling)
+ {
+ float rotateAroundSpeed = Struct.CircularRotationSpeed / model.CirclePoint.ToVectorXZ().DirectionTo(transform.position.ToVectorXZ()).magnitude;
+ transform.RotateAround(model.CirclePoint, Vector3.up * model.RotateAroundDirection, rotateAroundSpeed);
+ transform.rotation = CirclingRotate(model.CirclePoint, transform.position, transform.forward, model.RotateAroundDirection);
+
+ float dot = Vector2.Dot(transform.forward.ToVectorXZ().normalized, model.TargetPoint.ToVectorXZ().normalized);
+ if (dot > 0.99f) model.IsCircling = false;
+ }
+ else
+ {
+ if (model.IsSitting)
+ {
+ model.SittingTimer -= Time.deltaTime;
+ if (model.SittingTimer <= 0) model.IsSitting = false;
+ }
+ else
+ {
+ if (transform.position != model.TargetPoint)
+ {
+ if (transform.position.y >= model.MaxFlyAltitude && model.TargetPoint.y > transform.position.y)
+ {
+ Debug.Log(this + " maxFlyAltitude has reached");
+ model.TargetPoint = NewTargetPointInOppositeDirection(transform.position, model.TargetPoint.DirectionTo(transform.position), "Y");
+ }
+ transform.rotation = Turn(model.TargetPoint, transform.position, transform.forward);
+ transform.position = Move(model.TargetPoint, transform.position);
+ }
+ else
+ {
+ model.TargetPoint = NewTargetPoint(transform.position);
+ model.CirclePoint = NewCirclePoint(transform.position);
+ model.IsCircling = true;
+
+ Vector2 directionToCirclePoint = model.CirclePoint.ToVectorXZ().DirectionTo(transform.position.ToVectorXZ());
+ float dot = Vector2.Dot(transform.forward.ToVectorXZ().TurnToRight(), directionToCirclePoint);
+ if (dot > 0) model.RotateAroundDirection = 1;
+ else model.RotateAroundDirection = -1;
+ }
+ }
+ }
+ }
+
+ public void TriggerEnter(Collider collider, ButterflyModel model)
+ {
+ Debug.Log(this + " OnTriggerEnter(Collider collider)");
+
+ if (collider.gameObject.tag == TagManager.GROUND)
+ {
+ model.TargetPoint = NewTargetPointInOppositeDirection(model.ObjTransform.position, model.TargetPoint - model.ObjTransform.position, "Y");
+ if (Random.Range(1, 100) <= SITTING_CHANCE)
+ {
+ Debug.Log(this + " is sitting");
+
+ model.IsSitting = true;
+ model.SittingTimer = Random.Range(MIN_SITTING_TIME, MAX_SITTING_TIME);
+
+ Debug.Log(this + " sittingTimer: " + model.SittingTimer);
+ }
+ }
+ }
+
+ private Vector3 Move(Vector3 targetPoint, Vector3 currentPosition)
+ {
+ return Vector3.MoveTowards(currentPosition, targetPoint, Struct.Speed);
+ }
+
+ private Quaternion Turn(Vector3 targetPoint, Vector3 position, Vector3 forward)
+ {
+ Vector3 targetDirection = targetPoint - position;
+ Vector3 newDirection = Vector3.RotateTowards(forward, targetDirection, Struct.TurnSpeed, 0.0f);
+ newDirection.y = forward.y;
+ return Quaternion.LookRotation(newDirection);
+ }
+
+ private Quaternion CirclingRotate(Vector3 circlePoint, Vector3 position, Vector3 forward, int rotateAroundDirection)
+ {
+ Vector3 circlePointDirectionRotate90 = Quaternion.AngleAxis(-90 * rotateAroundDirection, Vector3.up) * circlePoint.DirectionTo(position);
+ Vector3 newDirection = Vector3.RotateTowards(forward, circlePointDirectionRotate90, Struct.TurnSpeed, 0.0f);
+ newDirection.y = forward.y;
+ return Quaternion.LookRotation(newDirection);
+ }
+
+ /// Return random coordinates within MaxDistanceFromCurrentPosition
+ private Vector3 NewTargetPoint(Vector3 currentPosition)
+ {
+ float x = GetRandomCoord(currentPosition.x);
+ float y = GetRandomCoord(currentPosition.y);
+ float z = GetRandomCoord(currentPosition.z);
+ return new Vector3(x, y, z);
+ }
+
+ /// Return random coordinates within MaxDistanceFromCurrentPosition in the opposite direction along the specified coordinate axis
+ private Vector3 NewTargetPointInOppositeDirection(Vector3 currentPosition, Vector3 currentDirection, string axis)
+ {
+ Vector3 newTarget = NewTargetPoint(currentPosition);
+
+ switch (axis.ToUpper())
+ {
+ case "X": newTarget.x = GetRandomCoord(currentPosition.x, currentDirection.x); break;
+ case "Y": newTarget.y = GetRandomCoord(currentPosition.y, currentDirection.y); break;
+ case "Z": newTarget.z = GetRandomCoord(currentPosition.z, currentDirection.z); break;
+ }
+
+ return newTarget;
+ }
+
+ private float GetRandomCoord(float currentCoord, float? directionCoord = null)
+ {
+ if (directionCoord.HasValue && directionCoord.Value != 0)
+ {
+ if (directionCoord > 0) return Random.Range(currentCoord - Struct.MaxDistanceFromCurrentPosition, currentCoord - 0.5f);
+ else return Random.Range(currentCoord + 0.5f, currentCoord + Struct.MaxDistanceFromCurrentPosition);
+ }
+ return Random.Range(currentCoord - Struct.MaxDistanceFromCurrentPosition, currentCoord + Struct.MaxDistanceFromCurrentPosition); ;
+ }
+
+ private Vector3 NewCirclePoint(Vector3 currentPosition)
+ {
+ float x = GetRandomCoordForCircle(currentPosition.x);
+ float z = GetRandomCoordForCircle(currentPosition.z);
+ return new Vector3(x, currentPosition.y, z);
+ }
+
+ private float GetRandomCoordForCircle(float coord)
+ {
+ int sign = 1;
+ if (Random.Range(1, 100) > 50) sign = -sign;
+ float random = Random.Range(Struct.MinCircleSize, Struct.MaxCircleSize);
+ return coord + random * sign;
+ }
+
+ #endregion
+}
+
+
+
+static class VectorExtension
+{
+ /// Convert Vector3 into Vector2 for XZ-plane
+ public static Vector2 ToVectorXZ(this Vector3 vector3) => new Vector2(vector3.x, vector3.z);
+
+ /// Rotates the vector2 90 degrees
+ public static Vector2 TurnToRight(this Vector2 vector2) => new Vector2(vector2.y, -vector2.x);
+
+ /// Returns the direction vector2 to the specified point
+ public static Vector2 DirectionTo(this Vector2 vector2, Vector2 target) => vector2 - target;
+
+ /// Returns the direction vector3 to the specified point
+ public static Vector3 DirectionTo(this Vector3 vector3, Vector3 target) => vector3 - target;
+}
\ No newline at end of file
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyData.cs.meta b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyData.cs.meta
new file mode 100644
index 00000000..b7bfdb03
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9198d4fb6d83f4c44b9a7f026a956854
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyInitilizeController.cs b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyInitilizeController.cs
new file mode 100644
index 00000000..3c47b271
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyInitilizeController.cs
@@ -0,0 +1,36 @@
+using UnityEngine;
+
+namespace BeastHunter
+{
+ public class ButterflyInitilizeController: IAwake
+ {
+ #region Field
+
+ private GameContext _context;
+
+ #endregion
+
+
+ #region ClassLifeCycle
+
+ public ButterflyInitilizeController(GameContext context)
+ {
+ _context = context;
+ }
+
+ #endregion
+
+
+ #region IAwake
+
+ public void OnAwake()
+ {
+ ButterflyData butterflyData = Data.ButterflyData;
+ GameObject butterflyObject = Object.Instantiate(butterflyData.Struct.Prefab);
+ ButterflyModel butterflyModel = new ButterflyModel(butterflyObject, butterflyData);
+ _context.ButterflyModel = butterflyModel;
+ }
+
+ #endregion
+ }
+}
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyInitilizeController.cs.meta b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyInitilizeController.cs.meta
new file mode 100644
index 00000000..58f36215
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyInitilizeController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1addded9479d78f4ab2c8b3a9fb89822
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyModel.cs b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyModel.cs
new file mode 100644
index 00000000..7a4440d4
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyModel.cs
@@ -0,0 +1,45 @@
+using UnityEngine;
+
+namespace BeastHunter
+{
+ public class ButterflyModel
+ {
+ #region Fields
+
+ private ButterflyData objData;
+ public Transform ObjTransform;
+
+ public Vector3 TargetPoint;
+ public readonly float MaxFlyAltitude;
+
+ public Vector3 CirclePoint;
+ public int RotateAroundDirection;
+ public bool IsCircling = false;
+
+ public float SittingTimer;
+ public bool IsSitting = false;
+
+ #endregion
+
+
+ #region ClassLifeCycle
+
+ public ButterflyModel(GameObject butterflyObject, ButterflyData butterflyData)
+ {
+ objData = butterflyData;
+ ObjTransform = butterflyObject.transform;
+ ObjTransform.localScale *= objData.Struct.Size;
+ MaxFlyAltitude = ObjTransform.position.y + objData.Struct.MaxFlyAltitudeFromSpawn;
+ }
+
+ #endregion
+
+
+ #region Methods
+
+ public void Execute() => objData.Act(this);
+ public void OnTriggerEnter(Collider collider) => objData.TriggerEnter(collider, this);
+
+ #endregion
+ }
+}
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyModel.cs.meta b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyModel.cs.meta
new file mode 100644
index 00000000..880e3fd8
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 312ddfa946eb8b148942120ad73de566
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyStruct.cs b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyStruct.cs
new file mode 100644
index 00000000..cb9fc374
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyStruct.cs
@@ -0,0 +1,45 @@
+using UnityEngine;
+using System;
+
+[Serializable]
+public struct ButterflyStruct
+{
+ #region Fields
+
+ public GameObject Prefab;
+
+ /// butterfly size
+ [Tooltip("Default: 0.5")]
+ public float Size;
+
+ /// maximum distance of the coordinate from the current position
+ [Tooltip("Default: 10")]
+ public float MaxDistanceFromCurrentPosition;
+
+ /// butterfly fly speed
+ [Tooltip("Default: 0.1")]
+ public float Speed;
+
+ /// butterfly turn speed
+ [Tooltip("Default: 0.03")]
+ public float TurnSpeed;
+
+ /// maximum butterfly flight height from the spawn point
+ [Tooltip("Default: 5")]
+ public float MaxFlyAltitudeFromSpawn;
+
+ /// butterfly fly speed during a circular motion
+ [Tooltip("Default: 6")]
+ public float CircularRotationSpeed;
+
+ /// Minimum circle size that the butterfly will fly
+ [Tooltip("Default: 1")]
+ public float MinCircleSize;
+
+ /// Maximum circle size that the butterfly will fly
+ [Tooltip("Default: 3")]
+ public float MaxCircleSize;
+
+ #endregion
+}
+
diff --git a/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyStruct.cs.meta b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyStruct.cs.meta
new file mode 100644
index 00000000..f211de51
--- /dev/null
+++ b/Assets/Scripts/ContextTest/MVC/Butterfly/ButterflyStruct.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b83adf6f2ee790c469af6d880a760e8f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Contexts/GameContext.cs b/Assets/Scripts/Contexts/GameContext.cs
index 2be72457..3c6b2116 100644
--- a/Assets/Scripts/Contexts/GameContext.cs
+++ b/Assets/Scripts/Contexts/GameContext.cs
@@ -9,6 +9,7 @@ public sealed class GameContext : Contexts
{
#region Fields
+ public ButterflyModel ButterflyModel;
public StartDialogueModel StartDialogueModel;
public DialogueSystemModel DialogueSystemModel;
public QuestModel QuestModel;
diff --git a/Assets/Scripts/Controllers/BaseControllers/MainControllers.cs b/Assets/Scripts/Controllers/BaseControllers/MainControllers.cs
index 75138a86..76e40f7c 100644
--- a/Assets/Scripts/Controllers/BaseControllers/MainControllers.cs
+++ b/Assets/Scripts/Controllers/BaseControllers/MainControllers.cs
@@ -6,10 +6,15 @@ public sealed class MainControllers : ControllersStart
public MainControllers(GameContext context)
{
- Add(new SphereInitilizeController(context));
+ Add(new ButterflyInitilizeController(context));
Add(new InitializeInteractableObjectController(context));
- Add(new SphereController(context));
- Add(new TargetController(context));
+ Add(new ButterflyController(context));
+
+ //Example Sphere
+ //Add(new SphereInitilizeController(context));
+ //Add(new InitializeInteractableObjectController(context));
+ //Add(new SphereController(context));
+ //Add(new TargetController(context));
}
#endregion
diff --git a/Assets/Scripts/Data/Data.asset b/Assets/Scripts/Data/Data.asset
index 79469fc9..8c66c25d 100644
--- a/Assets/Scripts/Data/Data.asset
+++ b/Assets/Scripts/Data/Data.asset
@@ -12,6 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1b31b7596ae2b4a4ab972d36383fc2fb, type: 3}
m_Name: Data
m_EditorClassIdentifier:
+ _butterflyDataPath:
_sphereDataPath: SphereData
_characterDataPath: CharacterData
_startDialogueDataPath: StartDialogueData
diff --git a/Assets/Scripts/Data/Data.cs b/Assets/Scripts/Data/Data.cs
index edc249b0..75b33411 100644
--- a/Assets/Scripts/Data/Data.cs
+++ b/Assets/Scripts/Data/Data.cs
@@ -6,6 +6,7 @@ namespace BeastHunter {
public sealed class Data : ScriptableObject {
#region Fields
+ [SerializeField] private string _butterflyDataPath;
[SerializeField] private string _sphereDataPath;
[SerializeField] private string _characterDataPath;
[SerializeField] private string _startDialogueDataPath;
@@ -14,6 +15,7 @@ public sealed class Data : ScriptableObject {
private static Data _instance;
+ private static ButterflyData _butterflyData;
private static SphereData _sphereData;
private static CharacterData _characterData;
private static StartDialogueData _startDialogueData;
@@ -36,6 +38,18 @@ public static Data Instance {
}
}
+ public static ButterflyData ButterflyData
+ {
+ get
+ {
+ if (_butterflyData == null)
+ {
+ _butterflyData = Load("Data/" + Instance._butterflyDataPath);
+ }
+ return _butterflyData;
+ }
+ }
+
public static SphereData SphereData {
get {
if (_sphereData == null) {
diff --git a/Assets/Scripts/Enum/InteractableObjectType.cs b/Assets/Scripts/Enum/InteractableObjectType.cs
index ed8b0de5..bf07b86d 100644
--- a/Assets/Scripts/Enum/InteractableObjectType.cs
+++ b/Assets/Scripts/Enum/InteractableObjectType.cs
@@ -9,6 +9,7 @@ public enum InteractableObjectType
Player = 4,
Enemy = 5,
HitBox = 6,
- Npc = 7
+ Npc = 7,
+ Butterfly = 8
}
}
diff --git a/Assets/Scripts/Managers/TagManager.cs b/Assets/Scripts/Managers/TagManager.cs
index f28d4ff5..6651c32b 100644
--- a/Assets/Scripts/Managers/TagManager.cs
+++ b/Assets/Scripts/Managers/TagManager.cs
@@ -8,6 +8,7 @@ public static class TagManager
public const string SPHERE = "Sphere";
public const string NPC = "NPC";
public const string ENEMY = "Enemy";
+ public const string GROUND = "Ground";
#endregion
}