Added Crab enemy; Fixed PickableProjectile bouncing bugs

This commit is contained in:
Данил Ярош 2025-09-12 08:24:02 +03:00
parent a5e1f85877
commit 93c83d1dd3
29 changed files with 8176 additions and 650 deletions

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 86f5c0ec6ec23cb41a6460bfc26672f6
guid: a74203a56e00e0148b3d1a47d0f98dee
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -0,0 +1,159 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1101 &-8210978011252493170
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 4
m_ConditionEvent: Speed
m_EventTreshold: 0.01
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -1672200742405902379}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-3373467894423064931
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Run
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -8210978011252493170}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 5b5202a4910b8bb47a99f7579e312b11, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-2960575752880489216
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -1672200742405902379}
m_Position: {x: 260, y: 120, z: 0}
- serializedVersion: 1
m_State: {fileID: -3373467894423064931}
m_Position: {x: 260, y: 190, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 510, y: 60, z: 0}
m_EntryPosition: {x: 280, y: 60, z: 0}
m_ExitPosition: {x: 510, y: 110, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -1672200742405902379}
--- !u!1102 &-1672200742405902379
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Idle
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 7030013803679037663}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: ad9165c55ebf79a40899978b6ee9c3bb, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Enemy_Crab
serializedVersion: 5
m_AnimatorParameters:
- m_Name: Speed
m_Type: 1
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -2960575752880489216}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1101 &7030013803679037663
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 3
m_ConditionEvent: Speed
m_EventTreshold: 0.01
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -3373467894423064931}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5b5202a4910b8bb47a99f7579e312b11
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -8,7 +8,7 @@ PhysicsMaterial2D:
m_PrefabAsset: {fileID: 0}
m_Name: Bouncy
serializedVersion: 2
friction: 0.4
bounciness: 0.7
friction: 0
bounciness: 0.8
m_FrictionCombine: 1
m_BounceCombine: 4

View File

@ -851,12 +851,12 @@ GameObject:
m_Component:
- component: {fileID: 4000011826580284}
- component: {fileID: 95000013029897698}
- component: {fileID: -4306594679098426553}
- component: {fileID: 7633178279901007628}
- component: {fileID: 4265284444154551416}
- component: {fileID: -4306594679098426553}
m_Layer: 0
m_Name: Enemy_1
m_TagString: Untagged
m_TagString: Enemy
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
@ -899,26 +899,6 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &-4306594679098426553
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1000011821036864}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 16ac12688a958d34983f6f0307a045ad, type: 3}
m_Name:
m_EditorClassIdentifier:
playerObj: {fileID: 0}
viewDistance: 5
viewAngle: 60
moveSpeed: 3
acceleration: 10
obstacleMask:
serializedVersion: 2
m_Bits: 16
--- !u!50 &7633178279901007628
Rigidbody2D:
serializedVersion: 5
@ -992,6 +972,26 @@ BoxCollider2D:
m_AutoTiling: 0
m_Size: {x: 5.4368367, y: 8.289099}
m_EdgeRadius: 0
--- !u!114 &-4306594679098426553
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1000011821036864}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 16ac12688a958d34983f6f0307a045ad, type: 3}
m_Name:
m_EditorClassIdentifier:
playerObj: {fileID: 0}
viewDistance: 5
viewAngle: 60
moveSpeed: 3
acceleration: 10
obstacleMask:
serializedVersion: 2
m_Bits: 16
--- !u!1 &1000012079282026
GameObject:
m_ObjectHideFlags: 0

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 2476b7fff96627f439721703c5d2e9a3
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -10,8 +10,8 @@ GameObject:
m_Component:
- component: {fileID: 1452460312376183192}
- component: {fileID: 4133686727143716795}
- component: {fileID: 4169089013277977673}
- component: {fileID: 6960937834036335996}
- component: {fileID: 4169089013277977673}
m_Layer: 0
m_Name: PickableProjectile
m_TagString: Projectile
@ -47,11 +47,11 @@ Rigidbody2D:
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 3
m_Mass: 0.3
m_LinearDamping: 0
m_AngularDamping: 0.05
m_GravityScale: 1
m_Material: {fileID: 6200000, guid: be34b14ed2876354d9864a6e677e5d67, type: 2}
m_Material: {fileID: 6200000, guid: 63f618adb0dc58844abe8ec1a9bd45a8, type: 2}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
@ -62,6 +62,43 @@ Rigidbody2D:
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0
--- !u!70 &6960937834036335996
CapsuleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5993946430821065449}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 6200000, guid: 63f618adb0dc58844abe8ec1a9bd45a8, type: 2}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Size: {x: 1, y: 1.3}
m_Direction: 0
--- !u!114 &4169089013277977673
MonoBehaviour:
m_ObjectHideFlags: 0
@ -94,7 +131,7 @@ MonoBehaviour:
attachPointChildName: HandPoint
sleepVelocity: 0.05
lockWhenLanded: 1
maxBounces: 100
maxBounces: 5
minBounceSpeed: 0.1
restitution: 0.6
tangentDamping: 0.85
@ -106,43 +143,6 @@ MonoBehaviour:
recallAcceleration: 100
drawGizmos: 1
gizmoColor: {r: 0.2, g: 0.8, b: 1, a: 0.35}
--- !u!70 &6960937834036335996
CapsuleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5993946430821065449}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Size: {x: 1, y: 1.3}
m_Direction: 0
--- !u!1 &7932273378799574310
GameObject:
m_ObjectHideFlags: 0

View File

@ -54207,6 +54207,63 @@ SpriteRenderer:
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!1001 &1801184241
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2292326756536553419, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_Name
value: Enemy_Crab
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalPosition.x
value: 66.45156
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalPosition.y
value: 2.9574506
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalRotation.w
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalRotation.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 180
objectReference: {fileID: 0}
- target: {fileID: 7794497313669146320, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 2476b7fff96627f439721703c5d2e9a3, type: 3}
--- !u!1001 &1859548792
PrefabInstance:
m_ObjectHideFlags: 0
@ -55169,3 +55226,4 @@ SceneRoots:
- {fileID: 8856198965438284572}
- {fileID: 1449142390}
- {fileID: 1443759818}
- {fileID: 1801184241}

View File

@ -130,7 +130,7 @@ GameObject:
- component: {fileID: 247400896}
- component: {fileID: 247400898}
- component: {fileID: 247400897}
m_Layer: 0
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
@ -272,7 +272,7 @@ GameObject:
- component: {fileID: 477076300}
- component: {fileID: 477076304}
- component: {fileID: 477076303}
m_Layer: 0
m_Layer: 5
m_Name: Button Red_0
m_TagString: Untagged
m_Icon: {fileID: 0}
@ -456,7 +456,7 @@ GameObject:
- component: {fileID: 915148288}
- component: {fileID: 915148290}
- component: {fileID: 915148289}
m_Layer: 0
m_Layer: 5
m_Name: Text (TMP) (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
@ -976,7 +976,7 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: -2004835105
m_SortingLayer: -2
m_SortingLayer: -3
m_SortingOrder: 0
m_Sprite: {fileID: 21300000, guid: 0d7e10cbe22bec44aba039ca0a3ba445, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
@ -1040,7 +1040,7 @@ GameObject:
- component: {fileID: 1707733837}
- component: {fileID: 1707733841}
- component: {fileID: 1707733840}
m_Layer: 0
m_Layer: 5
m_Name: Button Green_0
m_TagString: Untagged
m_Icon: {fileID: 0}

View File

@ -104,7 +104,7 @@ public class EnemyController : MonoBehaviour
return true;
}
void Die()
public void Die()
{
Destroy(gameObject);
}

View File

@ -192,7 +192,9 @@ public class GameManager : MonoBehaviour
/// <summary>
/// Метод переходна на следующий уровень
/// Метод переход на следующий уровень.
/// Может загружать уровни и миры в прямой зависимости от
/// Количества уровней на мир(StagesByWorld)
/// </summary>
public void NextLevel()
{

View File

@ -10,16 +10,15 @@ public class PauseMenu : MonoBehaviour
[Header("UI")]
[SerializeField] private CanvasGroup panel;
[SerializeField] private Button resumeButton;
//[SerializeField] private Button restartButton;
[SerializeField] private Button quitButton;
//[SerializeField] private Button restartButton;
//[SerializeField] private KeyCode toggleKey = KeyCode.Escape; // Esc
private void Awake()
{
if (resumeButton) resumeButton.onClick.AddListener(OnResumeClicked);
//if (restartButton) restartButton.onClick.AddListener(OnRestartClicked);
if (quitButton) quitButton.onClick.AddListener(OnQuitClicked);
//if (restartButton) restartButton.onClick.AddListener(OnRestartClicked);
// Изначально скрыто
SetVisible(false, instant: true);

View File

@ -215,11 +215,11 @@ public class PickableProjectile : BasicProjectile
if (Time.time - lastImpactTime < stickDelayAfterImpact)
return true;
Vector2 v = rb.linearVelocity;
float speed = v.magnitude;
Vector2 vIn = rb.linearVelocity;
float speed = vIn.magnitude;
if (speed < minBounceSpeed) return false;
Vector2 avgNormal = Vector2.up;
Vector2 n = Vector2.up;
float wsum = 0f;
float minSeparation = float.PositiveInfinity;
@ -234,24 +234,54 @@ public class PickableProjectile : BasicProjectile
wsum += w;
if (cp.separation < minSeparation) minSeparation = cp.separation;
}
avgNormal = (wsum > 0f ? sum / wsum : sum).normalized;
n = (wsum > 0f ? sum / wsum : sum);
if (n.sqrMagnitude < 1e-6f) n = Vector2.up;
else n.Normalize();
}
else
{
n = Vector2.up;
minSeparation = 0f;
}
Vector2 reflected = Vector2.Reflect(v, avgNormal) * restitution;
if (Vector2.Dot(vIn, n) > 0f) n = -n;
Vector2 n = avgNormal;
Vector2 vn = Vector2.Dot(reflected, n) * n;
Vector2 vt = reflected - vn;
reflected = vn + vt * tangentDamping;
float matBounciness = restitution;
float frA = 0f, frB = 0f;
rb.linearVelocity = reflected;
var myColMat = col ? col.sharedMaterial : null;
if (myColMat)
{
matBounciness = Mathf.Max(matBounciness, myColMat.bounciness);
frA = Mathf.Clamp01(myColMat.friction);
}
var otherCol = collision.collider;
if (otherCol)
{
var otherMat = otherCol.sharedMaterial;
if (otherMat)
{
matBounciness = Mathf.Max(matBounciness, otherMat.bounciness);
frB = Mathf.Clamp01(otherMat.friction);
}
}
float tangentFactor = (1f - frA) * (1f - frB) * Mathf.Clamp01(tangentDamping);
Vector2 vN = Vector2.Dot(vIn, n) * n;
Vector2 vT = vIn - vN;
Vector2 vOut = (-vN) * matBounciness + vT * tangentFactor;
rb.linearVelocity = vOut;
float pushOut = 0.005f;
if (minSeparation < 0f) pushOut = Mathf.Max(pushOut, -minSeparation + 0.001f);
rb.position += n * pushOut;
if (reflected.sqrMagnitude > 0.0001f)
transform.up = reflected.normalized;
if (vOut.sqrMagnitude > 1e-6f)
transform.up = vOut.normalized;
bounceCounter++;
if (bounceCounter >= maxBounces)

View File

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

View File

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

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -141,7 +141,8 @@ PlayerSettings:
visionOSBundleVersion: 1.0
tvOSBundleVersion: 1.0
bundleVersion: 1.0
preloadedAssets: []
preloadedAssets:
- {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
metroInputSource: 0
wsaTransparentSwapchain: 0
m_HolographicPauseOnTrackingLoss: 1

View File

@ -7,6 +7,7 @@ TagManager:
- Ground
- Coin
- Projectile
- Enemy
layers:
- Default
- TransparentFX