diff --git a/BlueWater/Assets/01.Scenes/02.Ocean.unity b/BlueWater/Assets/01.Scenes/02.Ocean.unity index 0c734f5b3..1cccc280c 100644 --- a/BlueWater/Assets/01.Scenes/02.Ocean.unity +++ b/BlueWater/Assets/01.Scenes/02.Ocean.unity @@ -1923,7 +1923,7 @@ Transform: m_GameObject: {fileID: 248177876} serializedVersion: 2 m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 2, z: 8} + m_LocalPosition: {x: 0, y: 3, z: 8} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -3731,6 +3731,182 @@ NavMeshObstacle: m_CarveOnlyStationary: 1 m_Center: {x: -0.09900001, y: 2.229, z: 0.049000002} m_TimeToStationary: 0.5 +--- !u!1 &453479153 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 453479154} + - component: {fileID: 453479159} + - component: {fileID: 453479158} + - component: {fileID: 453479157} + - component: {fileID: 453479156} + - component: {fileID: 453479155} + m_Layer: 15 + m_Name: Fish (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &453479154 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453479153} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -50.429996, y: -10.24, z: 33.88} + m_LocalScale: {x: 1, y: 1, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1825636406} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &453479155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453479153} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a0f3e1c9930c204498f3a86452337290, type: 3} + m_Name: + m_EditorClassIdentifier: + autoInit: 1 + isDrawGizmos: 1 + viewRadius: 20 + moveSpd: 500 + rotationSpeed: 10 + isRandomAngle: 0 + randomAngle: 120 + rescanTime: 0.5 + escapeTime: 10 + isRespawn: 1 + respawnTime: 5 + randomDirectionChange: 0 + directionChangeInterval: 3 + minDirectionChangeInterval: 1 + maxDirectionChangeInterval: 3 + escapeMode: 2 + randomZigzag: 1 + zigzagAmplitude: 0.5 + zigzagFrequency: 1 + minZigzagAmplitude: 0.1 + maxZigzagAmplitude: 2 + minZigzagFrequency: 0.1 + maxZigzagFrequency: 2 + hitColliders: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + targetLayer: + serializedVersion: 2 + m_Bits: 512 +--- !u!65 &453479156 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453479153} + 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: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &453479157 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453479153} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 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: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 112 + m_CollisionDetection: 0 +--- !u!23 &453479158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453479153} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + 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_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &453479159 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 453479153} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &476261169 GameObject: m_ObjectHideFlags: 0 @@ -6129,6 +6305,182 @@ NavMeshObstacle: m_CarveOnlyStationary: 1 m_Center: {x: -0.09900001, y: 2.229, z: 0.049000002} m_TimeToStationary: 0.5 +--- !u!1 &570047447 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 570047448} + - component: {fileID: 570047453} + - component: {fileID: 570047452} + - component: {fileID: 570047451} + - component: {fileID: 570047450} + - component: {fileID: 570047449} + m_Layer: 15 + m_Name: Fish (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &570047448 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 570047447} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -72.92, y: -10.24, z: 22.97} + m_LocalScale: {x: 1, y: 1, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1825636406} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &570047449 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 570047447} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a0f3e1c9930c204498f3a86452337290, type: 3} + m_Name: + m_EditorClassIdentifier: + autoInit: 1 + isDrawGizmos: 1 + viewRadius: 20 + moveSpd: 500 + rotationSpeed: 10 + isRandomAngle: 1 + randomAngle: 120 + rescanTime: 0.5 + escapeTime: 10 + isRespawn: 1 + respawnTime: 5 + randomDirectionChange: 1 + directionChangeInterval: 3 + minDirectionChangeInterval: 1 + maxDirectionChangeInterval: 3 + escapeMode: 1 + randomZigzag: 0 + zigzagAmplitude: 0.5 + zigzagFrequency: 1 + minZigzagAmplitude: 0.1 + maxZigzagAmplitude: 2 + minZigzagFrequency: 0.1 + maxZigzagFrequency: 2 + hitColliders: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + targetLayer: + serializedVersion: 2 + m_Bits: 512 +--- !u!65 &570047450 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 570047447} + 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: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &570047451 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 570047447} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 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: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 112 + m_CollisionDetection: 0 +--- !u!23 &570047452 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 570047447} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + 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_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &570047453 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 570047447} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1001 &587373864 PrefabInstance: m_ObjectHideFlags: 0 @@ -7388,6 +7740,182 @@ MonoBehaviour: m_EditorClassIdentifier: autoInit: 1 k__BackingField: {fileID: 168896974} +--- !u!1 &793815083 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 793815084} + - component: {fileID: 793815089} + - component: {fileID: 793815088} + - component: {fileID: 793815087} + - component: {fileID: 793815086} + - component: {fileID: 793815085} + m_Layer: 15 + m_Name: Fish (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &793815084 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 793815083} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -63.459995, y: -10.24, z: 27.9} + m_LocalScale: {x: 1, y: 1, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1825636406} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &793815085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 793815083} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a0f3e1c9930c204498f3a86452337290, type: 3} + m_Name: + m_EditorClassIdentifier: + autoInit: 1 + isDrawGizmos: 1 + viewRadius: 20 + moveSpd: 500 + rotationSpeed: 10 + isRandomAngle: 1 + randomAngle: 120 + rescanTime: 0.5 + escapeTime: 10 + isRespawn: 1 + respawnTime: 5 + randomDirectionChange: 1 + directionChangeInterval: 3 + minDirectionChangeInterval: 1 + maxDirectionChangeInterval: 3 + escapeMode: 1 + randomZigzag: 1 + zigzagAmplitude: 0.5 + zigzagFrequency: 1 + minZigzagAmplitude: 0.1 + maxZigzagAmplitude: 2 + minZigzagFrequency: 0.1 + maxZigzagFrequency: 2 + hitColliders: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + targetLayer: + serializedVersion: 2 + m_Bits: 512 +--- !u!65 &793815086 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 793815083} + 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: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &793815087 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 793815083} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 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: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 112 + m_CollisionDetection: 0 +--- !u!23 &793815088 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 793815083} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + 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_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &793815089 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 793815083} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1001 &795209795 PrefabInstance: m_ObjectHideFlags: 0 @@ -10614,113 +11142,6 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 1446558449} m_PrefabAsset: {fileID: 0} ---- !u!1 &1464480066 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1464480070} - - component: {fileID: 1464480069} - - component: {fileID: 1464480068} - - component: {fileID: 1464480067} - m_Layer: 0 - m_Name: Fish - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!136 &1464480067 -CapsuleCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1464480066} - 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 &1464480068 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1464480066} - 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_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - 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_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1464480069 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1464480066} - m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1464480070 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1464480066} - serializedVersion: 2 - m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: -50.93, y: -18.53, z: 5.39} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} --- !u!1 &1485085414 GameObject: m_ObjectHideFlags: 3 @@ -10746,8 +11167,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1485085414} serializedVersion: 2 - m_LocalRotation: {x: 0.38023633, y: 0.61874115, z: -0.4629656, w: 0.50817573} - m_LocalPosition: {x: -0.00051498413, y: 0, z: -0.0025787354} + m_LocalRotation: {x: 0.38023835, y: 0.618739, z: -0.46296394, w: 0.5081785} + m_LocalPosition: {x: -0.00059890747, y: 0, z: -0.0030136108} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -13540,6 +13961,231 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1812177369 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1812177370} + - component: {fileID: 1812177375} + - component: {fileID: 1812177374} + - component: {fileID: 1812177373} + - component: {fileID: 1812177372} + - component: {fileID: 1812177371} + m_Layer: 15 + m_Name: Fish + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1812177370 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812177369} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -82.67, y: -10.24, z: 19.24} + m_LocalScale: {x: 1, y: 1, z: 2} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1825636406} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1812177371 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812177369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a0f3e1c9930c204498f3a86452337290, type: 3} + m_Name: + m_EditorClassIdentifier: + autoInit: 1 + isDrawGizmos: 1 + viewRadius: 20 + moveSpd: 500 + rotationSpeed: 10 + isRandomAngle: 0 + randomAngle: 120 + rescanTime: 0.5 + escapeTime: 10 + isRespawn: 1 + respawnTime: 5 + randomDirectionChange: 0 + directionChangeInterval: 3 + minDirectionChangeInterval: 1 + maxDirectionChangeInterval: 3 + escapeMode: 0 + randomZigzag: 0 + zigzagAmplitude: 0.5 + zigzagFrequency: 1 + minZigzagAmplitude: 0.1 + maxZigzagAmplitude: 2 + minZigzagFrequency: 0.1 + maxZigzagFrequency: 2 + hitColliders: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + targetLayer: + serializedVersion: 2 + m_Bits: 512 +--- !u!65 &1812177372 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812177369} + 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: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!54 &1812177373 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812177369} + serializedVersion: 4 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 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: 0 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 112 + m_CollisionDetection: 0 +--- !u!23 &1812177374 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812177369} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + 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_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1812177375 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1812177369} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1825636405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1825636406} + - component: {fileID: 1825636407} + m_Layer: 0 + m_Name: Fishes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1825636406 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1825636405} + 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: + - {fileID: 1812177370} + - {fileID: 570047448} + - {fileID: 793815084} + - {fileID: 453479154} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1825636407 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1825636405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67eb8043df0bfce42aa24c9ec130227a, type: 3} + m_Name: + m_EditorClassIdentifier: + _persistent: 0 --- !u!1001 &1841847360 PrefabInstance: m_ObjectHideFlags: 0 @@ -16397,7 +17043,7 @@ SceneRoots: - {fileID: 476261175} - {fileID: 357776295} - {fileID: 200595900} - - {fileID: 1464480070} + - {fileID: 1825636406} - {fileID: 1574668128} - {fileID: 1771297325} - {fileID: 280786784} diff --git a/BlueWater/Assets/02.Scripts/Fish.cs b/BlueWater/Assets/02.Scripts/Fish.cs new file mode 100644 index 000000000..5e5733415 --- /dev/null +++ b/BlueWater/Assets/02.Scripts/Fish.cs @@ -0,0 +1,323 @@ +using System; +using System.Collections; +using Sirenix.OdinInspector; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace BlueWaterProject +{ + public enum EscapeMode + { + NONE = -1, + STRAIGHT, + ZIGZAG, + TOWARDS + } + + public class Fish : MonoBehaviour + { + // 초기화 방식 + [Title("초기화 방식")] + [SerializeField] private bool autoInit = true; + + // 물고기의 기본 설정 + [Title("물고기의 기본 설정")] + [SerializeField] private bool isDrawGizmos = true; + + [Tooltip("타겟 인식 범위")] + [SerializeField] private float viewRadius = 10f; + + [Tooltip("이동속도")] + [SerializeField] private float moveSpd = 500f; + + [Tooltip("회전속도")] + [SerializeField] private float rotationSpeed = 10f; + + [Tooltip("랜덤 방향으로 도주 여부")] + [SerializeField] private bool isRandomAngle = true; + + [ShowIf("@isRandomAngle")] + [Tooltip("도망가는 방향의 랜덤 각도")] + [SerializeField] private float randomAngle = 180f; + + [Tooltip("타겟을 재검색하는 시간")] + [SerializeField] private float rescanTime = 0.5f; + + [Tooltip("도망가는 시간")] + [SerializeField] private float escapeTime = 10f; + + [Tooltip("리스폰 여부")] + [SerializeField] private bool isRespawn = true; + + [ShowIf("@isRespawn == true")] + [Tooltip("리스폰되는데 걸리는 시간")] + [SerializeField] private float respawnTime = 5f; + + [Tooltip("도망치면서 랜덤 방향 전환 여부")] + [SerializeField] private bool randomDirectionChange; + + [ShowIf("@!randomDirectionChange")] + [Tooltip("도망치면서 방향 전환하는데 걸리는 시간")] + [SerializeField] private float directionChangeInterval = 1f; + + [ShowIf("@randomDirectionChange")] + [Tooltip("도망치면서 방향 전환하는데 걸리는 랜덤 최소 시간")] + [SerializeField] private float minDirectionChangeInterval = 0.1f; + + [ShowIf("@randomDirectionChange")] + [Tooltip("도망치면서 방향 전환하는데 걸리는 랜덤 최대 시간")] + [SerializeField] private float maxDirectionChangeInterval = 1f; + + [Tooltip("도주 방식")] + [SerializeField] private EscapeMode escapeMode = EscapeMode.STRAIGHT; + + // ZIGZAG + [Title("ZIGZAG")] + [ShowIf("@escapeMode == EscapeMode.ZIGZAG")] + [Tooltip("흔들림의 정도")] + [SerializeField] private bool randomZigzag; + + [ShowIf("@escapeMode == EscapeMode.ZIGZAG && !randomZigzag")] + [Tooltip("흔들림의 정도")] + [SerializeField] private float zigzagAmplitude = 1f; + + [ShowIf("@escapeMode == EscapeMode.ZIGZAG && !randomZigzag")] + [Tooltip("흔들림의 주기")] + [SerializeField] private float zigzagFrequency = 1f; + + [ShowIf("@escapeMode == EscapeMode.ZIGZAG && randomZigzag")] + [Tooltip("흔들림의 정도 랜덤 최솟값")] + [SerializeField] private float minZigzagAmplitude = 0.1f; + + [ShowIf("@escapeMode == EscapeMode.ZIGZAG && randomZigzag")] + [Tooltip("흔들림의 정도 랜덤 최댓값")] + [SerializeField] private float maxZigzagAmplitude = 1f; + + [Space] + [ShowIf("@escapeMode == EscapeMode.ZIGZAG && randomZigzag")] + [Tooltip("흔들림의 주기 랜덤 최솟값")] + [SerializeField] private float minZigzagFrequency = 0.1f; + + [ShowIf("@escapeMode == EscapeMode.ZIGZAG && randomZigzag")] + [Tooltip("흔들림의 주기 랜덤 최댓값")] + [SerializeField] private float maxZigzagFrequency = 1f; + + // 디버깅 + [Title("디버깅")] + [SerializeField] private Collider[] hitColliders = new Collider[MAX_HIT_NUM]; + [SerializeField] private LayerMask targetLayer; + + private Rigidbody rb; + private Coroutine findTargetCoroutine; + private Coroutine escapeCoroutine; + private WaitForSeconds findCoroutineTime; + private Vector3 spawnPos; + + private const int MAX_HIT_NUM = 3; + + private void OnValidate() + { + findCoroutineTime = new WaitForSeconds(rescanTime); + } + + private void OnDrawGizmosSelected() + { + if (!isDrawGizmos) return; + + Gizmos.color = Color.red; + Gizmos.DrawWireSphere(transform.position, viewRadius); + } + + [Button("셋팅 초기화")] + private void Init() + { + rb = GetComponent(); + + targetLayer = LayerMask.GetMask("Player"); + } + + #region Preset + + [HorizontalGroup("Split")] + [Button("프리셋 1번")] + private void Preset1() + { + isDrawGizmos = true; + viewRadius = 20f; + moveSpd = 500f; + rotationSpeed = 10f; + isRandomAngle = false; + rescanTime = 0.5f; + escapeTime = 10f; + isRespawn = true; + respawnTime = 5f; + randomDirectionChange = false; + directionChangeInterval = 3f; + escapeMode = EscapeMode.STRAIGHT; + } + + [HorizontalGroup("Split")] + [Button("프리셋 2번")] + private void Preset2() + { + isDrawGizmos = true; + viewRadius = 20f; + moveSpd = 500f; + rotationSpeed = 10f; + isRandomAngle = true; + randomAngle = 120f; + rescanTime = 0.5f; + escapeTime = 10f; + isRespawn = true; + respawnTime = 5f; + randomDirectionChange = true; + minDirectionChangeInterval = 1f; + maxDirectionChangeInterval = 3f; + directionChangeInterval = 3f; + escapeMode = EscapeMode.ZIGZAG; + randomZigzag = false; + zigzagAmplitude = 0.5f; + zigzagFrequency = 1f; + } + + [HorizontalGroup("Split")] + [Button("프리셋 3번")] + private void Preset3() + { + isDrawGizmos = true; + viewRadius = 20f; + moveSpd = 500f; + rotationSpeed = 10f; + isRandomAngle = true; + randomAngle = 120f; + rescanTime = 0.5f; + escapeTime = 10f; + isRespawn = true; + respawnTime = 5f; + randomDirectionChange = true; + minDirectionChangeInterval = 1f; + maxDirectionChangeInterval = 3f; + directionChangeInterval = 3f; + escapeMode = EscapeMode.ZIGZAG; + randomZigzag = true; + minZigzagAmplitude = 0.1f; + maxZigzagAmplitude = 2f; + minZigzagFrequency = 0.1f; + maxZigzagFrequency = 2f; + } + + #endregion + + private void Awake() + { + if (autoInit) + { + Init(); + } + } + + private void OnEnable() + { + hitColliders = new Collider[MAX_HIT_NUM]; + findCoroutineTime = new WaitForSeconds(rescanTime); + + if (findTargetCoroutine != null) return; + + findTargetCoroutine = StartCoroutine(FindTargetCoroutine()); + } + + private void Start() + { + spawnPos = transform.position; + } + + private IEnumerator FindTargetCoroutine() + { + while (true) + { + var size = Physics.OverlapSphereNonAlloc(transform.position, viewRadius, hitColliders, targetLayer); + for (var i = 0; i < size; i++) + { + var hitCollider = hitColliders[i]; + if (hitCollider == null || !hitCollider.CompareTag("ShipPlayer")) continue; + + findTargetCoroutine = null; + escapeCoroutine = StartCoroutine(EscapeCoroutine(hitCollider)); + yield break; + } + yield return findCoroutineTime; + } + } + + private IEnumerator EscapeCoroutine(Collider targetCollider) + { + var currentDirectionChangeInterval = randomDirectionChange ? + UnityEngine.Random.Range(minDirectionChangeInterval, maxDirectionChangeInterval) + : directionChangeInterval; + var rotatedEscapeDirection = CalculateEscapeDirection(targetCollider.transform.position); + + var time = 0f; + var directionChangeTime = 0f; + while (time < escapeTime) + { + time += Time.deltaTime; + directionChangeTime += Time.deltaTime; + + if (directionChangeTime >= currentDirectionChangeInterval) + { + rotatedEscapeDirection = CalculateEscapeDirection(targetCollider.transform.position); + directionChangeTime = 0f; + currentDirectionChangeInterval = randomDirectionChange ? + UnityEngine.Random.Range(minDirectionChangeInterval, maxDirectionChangeInterval) + : directionChangeInterval; + + if (escapeMode == EscapeMode.ZIGZAG && randomZigzag) + { + zigzagFrequency = UnityEngine.Random.Range(minZigzagFrequency, maxZigzagFrequency); + zigzagAmplitude = UnityEngine.Random.Range(minZigzagAmplitude, maxZigzagAmplitude); + } + } + + var newDirection = escapeMode switch + { + EscapeMode.NONE => throw new ArgumentOutOfRangeException(), + EscapeMode.STRAIGHT => rotatedEscapeDirection, + EscapeMode.ZIGZAG => rotatedEscapeDirection + + new Vector3(Mathf.Sin(Time.time * zigzagFrequency) * zigzagAmplitude,0, + Mathf.Sin(Time.time * zigzagFrequency) * zigzagAmplitude), + EscapeMode.TOWARDS => -rotatedEscapeDirection, + _ => throw new ArgumentOutOfRangeException() + }; + + rb.velocity = newDirection.normalized * (moveSpd * Time.deltaTime); + var targetRotation = Quaternion.LookRotation(newDirection); + transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime); + + yield return null; + } + + rb.velocity = Vector3.zero; + escapeCoroutine = null; + + if (isRespawn) + { + FishManager.Inst.RespawnFish(gameObject, respawnTime, spawnPos); + } + gameObject.SetActive(false); + } + + private Vector3 CalculateEscapeDirection(Vector3 targetPos) + { + var escapeDirection = (transform.position - targetPos).normalized; + escapeDirection.y = 0; + + if (!isRandomAngle) return escapeDirection; + + var randomRotationAngle = UnityEngine.Random.Range(-randomAngle * 0.5f, randomAngle * 0.5f); + var rotation = Quaternion.Euler(0, randomRotationAngle, 0); + return rotation * escapeDirection; + + } + } +} + diff --git a/BlueWater/Assets/02.Scripts/Fish.cs.meta b/BlueWater/Assets/02.Scripts/Fish.cs.meta new file mode 100644 index 000000000..f979ae082 --- /dev/null +++ b/BlueWater/Assets/02.Scripts/Fish.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0f3e1c9930c204498f3a86452337290 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlueWater/Assets/02.Scripts/FishManager.cs b/BlueWater/Assets/02.Scripts/FishManager.cs new file mode 100644 index 000000000..d4bc59854 --- /dev/null +++ b/BlueWater/Assets/02.Scripts/FishManager.cs @@ -0,0 +1,22 @@ +using System.Collections; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace BlueWaterProject +{ + public class FishManager : Singleton + { + public void RespawnFish(GameObject fish, float delay, Vector3 respawnPos) + { + StartCoroutine(RespawnFishCoroutine(fish, delay, respawnPos)); + } + + private IEnumerator RespawnFishCoroutine(GameObject fish, float delay, Vector3 respawnPos) + { + yield return new WaitForSeconds(delay); + + fish.transform.position = respawnPos; + fish.SetActive(true); + } + } +} \ No newline at end of file diff --git a/BlueWater/Assets/02.Scripts/FishManager.cs.meta b/BlueWater/Assets/02.Scripts/FishManager.cs.meta new file mode 100644 index 000000000..ebdda33c8 --- /dev/null +++ b/BlueWater/Assets/02.Scripts/FishManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 67eb8043df0bfce42aa24c9ec130227a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlueWater/ProjectSettings/DynamicsManager.asset b/BlueWater/ProjectSettings/DynamicsManager.asset index 9bf839177..08be41960 100644 --- a/BlueWater/ProjectSettings/DynamicsManager.asset +++ b/BlueWater/ProjectSettings/DynamicsManager.asset @@ -17,7 +17,7 @@ PhysicsManager: m_EnableAdaptiveForce: 0 m_ClothInterCollisionDistance: 0.1 m_ClothInterCollisionStiffness: 0.2 - m_LayerCollisionMatrix: 040000001000000001000000502622003a262282100000000800000000000000000000001826220218262000000000000000000018262000000000000000000000000000180200000000000000000000000000001826000200000000000000000000000010022000000000000000000000000000000000000000000010000000 + m_LayerCollisionMatrix: 04000000100000000100000050a622003a262282100000000800000000000000000000001826220218262000000000000000000018262000000000000800000200000000180200000000000000000000000000001826000200000000000000000000000010822000000000000000000000000000000000000000000010000000 m_SimulationMode: 0 m_AutoSyncTransforms: 0 m_ReuseCollisionCallbacks: 0 diff --git a/BlueWater/ProjectSettings/TagManager.asset b/BlueWater/ProjectSettings/TagManager.asset index a9a7458f7..6fd309a89 100644 --- a/BlueWater/ProjectSettings/TagManager.asset +++ b/BlueWater/ProjectSettings/TagManager.asset @@ -37,7 +37,7 @@ TagManager: - - Enemy - - - + - Fish - - Npc -