소스 검색

Merge branch 'master' of https://github.com/Hex-Dragon/GMTK2022

= 4 년 전
부모
커밋
d3d11d1f11

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 920 - 169
Assets/Plugins/TextMesh Pro/Resources/Fonts & Materials/SOURCEHANSANSCN-BOLD SDF.asset


+ 2 - 1
Assets/Resources/Dice/Dice.prefab

@@ -101,7 +101,7 @@ Rigidbody2D:
   m_Simulated: 1
   m_Simulated: 1
   m_UseFullKinematicContacts: 0
   m_UseFullKinematicContacts: 0
   m_UseAutoMass: 0
   m_UseAutoMass: 0
-  m_Mass: 1
+  m_Mass: 10000
   m_LinearDrag: 0
   m_LinearDrag: 0
   m_AngularDrag: 0.05
   m_AngularDrag: 0.05
   m_GravityScale: 1
   m_GravityScale: 1
@@ -149,6 +149,7 @@ MonoBehaviour:
   m_Name: 
   m_Name: 
   m_EditorClassIdentifier: 
   m_EditorClassIdentifier: 
   key: 4
   key: 4
+  canRestore: 1
 --- !u!1 &1666923398225157471
 --- !u!1 &1666923398225157471
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0

+ 12 - 0
Assets/Resources/Entities/Bullet.cs

@@ -0,0 +1,12 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class Bullet : MonoBehaviour {
+
+    private void OnCollisionEnter2D(Collision2D collision) {
+        //TODO: ×Óµ¯±¬Õ¨ÒôЧ£¨Ïú»Ù£©
+        Destroy(gameObject);
+    }
+
+}

+ 11 - 0
Assets/Resources/Entities/Bullet.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4da3bc50a479fb74f89432d9e58aa1be
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

BIN
Assets/Resources/Entities/Bullet.png


+ 134 - 0
Assets/Resources/Entities/Bullet.png.meta

@@ -0,0 +1,134 @@
+fileFormatVersion: 2
+guid: c18dd1aef6ed3fd439185e642d44c053
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 11
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 32
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: WebGL
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 148 - 0
Assets/Resources/Entities/Bullet.prefab

@@ -0,0 +1,148 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3784861654496570301
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3784861654496570300}
+  - component: {fileID: 3784861654496570299}
+  - component: {fileID: 3784861654496570297}
+  - component: {fileID: 3784861654496570298}
+  - component: {fileID: 95278088495913127}
+  m_Layer: 12
+  m_Name: Bullet
+  m_TagString: Bullet
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3784861654496570300
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3784861654496570301}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: -1.21, y: -2.8, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &3784861654496570299
+SpriteRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3784861654496570301}
+  m_Enabled: 1
+  m_CastShadows: 0
+  m_ReceiveShadows: 0
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 0
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 0
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_Sprite: {fileID: 21300000, guid: c18dd1aef6ed3fd439185e642d44c053, type: 3}
+  m_Color: {r: 0.952361, g: 1, b: 0, a: 1}
+  m_FlipX: 0
+  m_FlipY: 0
+  m_DrawMode: 0
+  m_Size: {x: 1, y: 1}
+  m_AdaptiveModeThreshold: 0.5
+  m_SpriteTileMode: 0
+  m_WasSpriteAssigned: 1
+  m_MaskInteraction: 0
+  m_SpriteSortPoint: 0
+--- !u!61 &3784861654496570297
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3784861654496570301}
+  m_Enabled: 1
+  m_Density: 1
+  m_Material: {fileID: 0}
+  m_IsTrigger: 0
+  m_UsedByEffector: 0
+  m_UsedByComposite: 0
+  m_Offset: {x: 0, y: 0}
+  m_SpriteTilingProperty:
+    border: {x: 0, y: 0, z: 0, w: 0}
+    pivot: {x: 0.5, y: 0.5}
+    oldSize: {x: 0.3125, y: 0.59375}
+    newSize: {x: 1, y: 1}
+    adaptiveTilingThreshold: 0.5
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  serializedVersion: 2
+  m_Size: {x: 0.4, y: 0.7}
+  m_EdgeRadius: 0
+--- !u!50 &3784861654496570298
+Rigidbody2D:
+  serializedVersion: 4
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3784861654496570301}
+  m_BodyType: 0
+  m_Simulated: 1
+  m_UseFullKinematicContacts: 0
+  m_UseAutoMass: 0
+  m_Mass: 0.2
+  m_LinearDrag: 0
+  m_AngularDrag: 0.05
+  m_GravityScale: 0
+  m_Material: {fileID: 0}
+  m_Interpolate: 0
+  m_SleepingMode: 1
+  m_CollisionDetection: 1
+  m_Constraints: 4
+--- !u!114 &95278088495913127
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3784861654496570301}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4da3bc50a479fb74f89432d9e58aa1be, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 

+ 7 - 0
Assets/Resources/Entities/Bullet.prefab.meta

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

+ 1 - 4
Assets/Resources/Entities/EnemyArrow.cs

@@ -2,7 +2,7 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine;
 
 
-public class EnemyArrow : EntityBase {
+public class EnemyArrow : EnemyBase {
 
 
     public bool movingLeft = false;
     public bool movingLeft = false;
     internal override bool isPressingCrouch() => false;
     internal override bool isPressingCrouch() => false;
@@ -10,9 +10,6 @@ public class EnemyArrow : EntityBase {
     internal override bool isPressingLeft() => movingLeft;
     internal override bool isPressingLeft() => movingLeft;
     internal override bool isPressingRight() => !movingLeft;
     internal override bool isPressingRight() => !movingLeft;
 
 
-    internal override void OnHitBorder() {
-        Destroy(gameObject);
-    }
     internal override void OnHitEnemy(Collision2D collision) {
     internal override void OnHitEnemy(Collision2D collision) {
         Destroy(gameObject);
         Destroy(gameObject);
     }
     }

+ 24 - 0
Assets/Resources/Entities/EnemyBase.cs

@@ -0,0 +1,24 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using DG.Tweening;
+
+public abstract class EnemyBase : EntityBase {
+
+    internal override void OnHitBorder() {
+        Destroy(gameObject);
+    }
+
+    internal override void OnHitBullet() {
+        // 受伤动画
+        sprite.DOColor(new Color(1f, 0.5f, 0.5f), 0.04f).SetLoops(2, LoopType.Yoyo);
+        // 死亡判断
+        hp--;
+        if (hp < 0) {
+            //TODO: 敌人死亡音效
+            transform.localScale = Vector3.zero;
+            Destroy(gameObject, 1); // 防止动画没播放完导致报错
+        }
+    }
+
+}

+ 11 - 0
Assets/Resources/Entities/EnemyBase.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c0510e694e56b0f41bc79412c89c1e72
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 6 - 9
Assets/Resources/Entities/EnemyHeavy.cs

@@ -2,22 +2,19 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine;
 
 
-public class EnemyHeavy : EntityBase {
+public class EnemyHeavy : EnemyBase {
 
 
     public bool movingLeft = false;
     public bool movingLeft = false;
     internal override bool isPressingCrouch() => false;
     internal override bool isPressingCrouch() => false;
     internal override bool isPressDownJump() => false;
     internal override bool isPressDownJump() => false;
     internal override bool isPressingLeft() => movingLeft;
     internal override bool isPressingLeft() => movingLeft;
     internal override bool isPressingRight() => !movingLeft;
     internal override bool isPressingRight() => !movingLeft;
-    internal override void OnUpdate() {
-        bool shouldTurn = false;
-        if (Mathf.Abs(rb.velocity.x) > 0.001f && (rb.velocity.x > 0 == movingLeft)) shouldTurn = true;
-        if (shouldTurn) movingLeft = !movingLeft;
-    }
+    //internal override void OnUpdate() {
+    //    bool shouldTurn = false;
+    //    if (Mathf.Abs(rb.velocity.x) > 0.001f && (rb.velocity.x > 0 == movingLeft)) shouldTurn = true;
+    //    if (shouldTurn) movingLeft = !movingLeft;
+    //}
 
 
-    internal override void OnHitBorder() {
-        Destroy(gameObject);
-    }
     public float knockbackForceH = 30f, knockbackForceV = 15f;
     public float knockbackForceH = 30f, knockbackForceV = 15f;
     internal override void OnHitEnemy(Collision2D collision) {
     internal override void OnHitEnemy(Collision2D collision) {
         int face = collision.transform.position.x < transform.position.x ? 1 : -1;
         int face = collision.transform.position.x < transform.position.x ? 1 : -1;

+ 1 - 4
Assets/Resources/Entities/EnemyMover.cs

@@ -2,7 +2,7 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine;
 
 
-public class EnemyMover : EntityBase {
+public class EnemyMover : EnemyBase {
 
 
     public bool movingLeft = false;
     public bool movingLeft = false;
     internal override bool isPressingCrouch() => false;
     internal override bool isPressingCrouch() => false;
@@ -23,9 +23,6 @@ public class EnemyMover : EntityBase {
         }
         }
     }
     }
 
 
-    internal override void OnHitBorder() {
-        Destroy(gameObject);
-    }
     public float knockbackForceH = 30f, knockbackForceV = 15f;
     public float knockbackForceH = 30f, knockbackForceV = 15f;
     internal override void OnHitEnemy(Collision2D collision) {
     internal override void OnHitEnemy(Collision2D collision) {
         int face = collision.transform.position.x < transform.position.x ? 1 : -1;
         int face = collision.transform.position.x < transform.position.x ? 1 : -1;

+ 7 - 2
Assets/Resources/Entities/EntityBase.cs

@@ -10,13 +10,14 @@ public abstract class EntityBase : MonoBehaviour {
     internal BoxCollider2D coll;
     internal BoxCollider2D coll;
     public Sprite spriteNormal, spriteDown;
     public Sprite spriteNormal, spriteDown;
     void Start() {
     void Start() {
+        currentHp = hp;
         rb = GetComponent<Rigidbody2D>();
         rb = GetComponent<Rigidbody2D>();
         sprite = GetComponent<SpriteRenderer>();
         sprite = GetComponent<SpriteRenderer>();
         coll = GetComponent<BoxCollider2D>();
         coll = GetComponent<BoxCollider2D>();
     }
     }
 
 
     public bool canCrouch = false;
     public bool canCrouch = false;
-    public float movementSpeed = 10f, jumpForce = 20f, horizontalF = 0.9f, horizontalA = 0.3f, jumpThreshold = 0.1f, downA = 0.3f, fallA = 0.1f;
+    public float movementSpeed = 10f, jumpForce = 20f, horizontalF = 0.9f, horizontalA = 0.3f, jumpThreshold = 0.1f, downA = 0.3f, fallA = 0.1f, filpSpeed = 0.3f;
     public float jumpBufferTime = 0.2f, jumpWolfTime = 0.2f; internal float jumpBuffer = 0f, jumpWolf = 0f, jumping = 0f;
     public float jumpBufferTime = 0.2f, jumpWolfTime = 0.2f; internal float jumpBuffer = 0f, jumpWolf = 0f, jumping = 0f;
     private bool towardsRight = true;
     private bool towardsRight = true;
     void Update() {
     void Update() {
@@ -64,7 +65,7 @@ public abstract class EntityBase : MonoBehaviour {
         }
         }
         // ÉèÖÃ
         // ÉèÖÃ
         rb.velocity = new Vector2(speedX, speedY);
         rb.velocity = new Vector2(speedX, speedY);
-        if (towardsRight != (Mathf.Abs(speedX) > 0.01 ? speedX > 0 : towardsRight)) {
+        if (towardsRight != (Mathf.Abs(speedX) > filpSpeed ? speedX > 0 : towardsRight)) {
             // ·´Ïò
             // ·´Ïò
             towardsRight = !towardsRight;
             towardsRight = !towardsRight;
             transform.DOScaleX(towardsRight ? 1 : -1, 0.1f);
             transform.DOScaleX(towardsRight ? 1 : -1, 0.1f);
@@ -76,13 +77,17 @@ public abstract class EntityBase : MonoBehaviour {
     internal abstract bool isPressingCrouch();
     internal abstract bool isPressingCrouch();
     internal virtual void OnUpdate() {}
     internal virtual void OnUpdate() {}
 
 
+    public int hp; internal int currentHp;
+
     // Åöײ¼ì²â
     // Åöײ¼ì²â
     private void OnCollisionEnter2D(Collision2D collision) {
     private void OnCollisionEnter2D(Collision2D collision) {
         if (collision.gameObject.CompareTag("Border")) OnHitBorder();
         if (collision.gameObject.CompareTag("Border")) OnHitBorder();
+        if (collision.gameObject.CompareTag("Bullet")) OnHitBullet();
         if (collision.gameObject.CompareTag("Enemy") && gameObject.CompareTag("Player")) OnHitEnemy(collision);
         if (collision.gameObject.CompareTag("Enemy") && gameObject.CompareTag("Player")) OnHitEnemy(collision);
         if (collision.gameObject.CompareTag("Player") && gameObject.CompareTag("Enemy")) OnHitEnemy(collision);
         if (collision.gameObject.CompareTag("Player") && gameObject.CompareTag("Enemy")) OnHitEnemy(collision);
     }
     }
     internal abstract void OnHitBorder();
     internal abstract void OnHitBorder();
+    internal virtual void OnHitBullet() {}
     internal abstract void OnHitEnemy(Collision2D collision);
     internal abstract void OnHitEnemy(Collision2D collision);
 
 
 }
 }

+ 34 - 1
Assets/Resources/Entities/Player.cs

@@ -30,8 +30,41 @@ public class Player : EntityBase {
     }
     }
 
 
     // 射击
     // 射击
+    public int maxBullet = 20, currentBullet = 20;
+    public float shootDelay = 0.15f; private float currentShootDelay = 0f;
+    public float reloadDelay = 1.5f; private float currentReloadDelay = 0f;
+    public float bulletSpeed = 50f, bulletKnockback = 1f;
+    public GameObject bullet; public TMPro.TextMeshProUGUI textBullet;
     internal override void OnUpdate() {
     internal override void OnUpdate() {
-
+        // 装填
+        if (InputM.GetKeyEvent(InputM.KeyType.Reload) && currentBullet < maxBullet && currentReloadDelay <= 0f) {
+            // TODO: 装填音效(总时长为 reloadDelay,看 Unity 里的 Player 右边栏,这里的数字可能是过期的)
+            currentReloadDelay = reloadDelay;
+        } else if (currentReloadDelay > 0 && currentReloadDelay < Time.deltaTime) {
+            currentReloadDelay = 0f; currentBullet = maxBullet;
+        } else if (currentReloadDelay > 0) {
+            currentReloadDelay -= Time.deltaTime;
+        }
+        // 开火
+        if (InputM.GetKeyEvent(InputM.KeyType.Fire) && currentBullet > 0 && currentShootDelay <= 0f && currentReloadDelay <= 0f) {
+            // TODO: 开火音效
+            currentBullet--; currentShootDelay = shootDelay;
+            Vector2 fromPos = transform.position + Vector3.up * 0.55f;
+            Vector2 toPos = Camera.allCameras[0].ScreenToWorldPoint(Input.mousePosition);
+            Vector2 shootVector = (toPos - fromPos).normalized;
+            GameObject newBullet = Instantiate(bullet, fromPos, Quaternion.identity);
+            newBullet.GetComponent<Rigidbody2D>().velocity = bulletSpeed * shootVector;
+            newBullet.transform.eulerAngles = (shootVector.x > 0 ? -1 : 1) * Vector2.Angle(shootVector, Vector2.up) * Vector3.forward;
+            // 后座力
+            rb.velocity += bulletKnockback * -shootVector;
+        } else if (currentShootDelay > 0) {
+            currentShootDelay -= Time.deltaTime;
+        }
+        // 更新 UI
+        textBullet.text = currentReloadDelay > 0f ?
+            "".PadLeft(maxBullet - Mathf.RoundToInt(currentReloadDelay / reloadDelay * maxBullet), "|".ToCharArray().First()) : 
+            "".PadLeft(currentBullet, "|".ToCharArray().First());
+        textBullet.color = currentReloadDelay > 0f ? new Color(0.5f, 0.5f, 0.5f) : new Color(1, 1, 0.6f);
     }
     }
 
 
 }
 }

+ 203 - 5
Assets/Scenes/SceneMain.unity

@@ -859,11 +859,21 @@ MonoBehaviour:
   horizontalA: 0.07
   horizontalA: 0.07
   jumpThreshold: 0.05
   jumpThreshold: 0.05
   downA: 0.5
   downA: 0.5
-  fallA: 0.4
+  fallA: 0.6
+  filpSpeed: 0.6
   jumpBufferTime: 0.15
   jumpBufferTime: 0.15
   jumpWolfTime: 0.2
   jumpWolfTime: 0.2
+  hp: 3
   knockbackForceH: 40
   knockbackForceH: 40
   knockbackForceV: 10
   knockbackForceV: 10
+  maxBullet: 25
+  currentBullet: 25
+  shootDelay: 0.1
+  reloadDelay: 2
+  bulletSpeed: 50
+  bulletKnockback: 2.5
+  bullet: {fileID: 3784861654496570301, guid: 5485a04fa6dca0746989d90942cc6acb, type: 3}
+  textBullet: {fileID: 583505891}
 --- !u!50 &557375728
 --- !u!50 &557375728
 Rigidbody2D:
 Rigidbody2D:
   serializedVersion: 4
   serializedVersion: 4
@@ -2615,6 +2625,141 @@ Tilemap:
     e31: 0
     e31: 0
     e32: 0
     e32: 0
     e33: 1
     e33: 1
+--- !u!1 &583505889
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 583505890}
+  - component: {fileID: 583505892}
+  - component: {fileID: 583505891}
+  m_Layer: 5
+  m_Name: TextBullet
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &583505890
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 583505889}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1331411273}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 30, y: -20}
+  m_SizeDelta: {x: 1000, y: 50}
+  m_Pivot: {x: 0, y: 1}
+--- !u!114 &583505891
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 583505889}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: '|||||||||||||||||||||||||||||||'
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 657c8f12eebe4e44a801288bc506d2a1, type: 2}
+  m_sharedMaterial: {fileID: 2859847126084961081, guid: 657c8f12eebe4e44a801288bc506d2a1, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4288413439
+  m_fontColor: {r: 1, g: 0.995719, b: 0.60754716, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 30
+  m_fontSizeBase: 30
+  m_fontWeight: 400
+  m_enableAutoSizing: 0
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &583505892
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 583505889}
+  m_CullTransparentMesh: 1
 --- !u!1 &668639202
 --- !u!1 &668639202
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -2743,6 +2888,7 @@ RectTransform:
   m_Children:
   m_Children:
   - {fileID: 855117207}
   - {fileID: 855117207}
   - {fileID: 941795212}
   - {fileID: 941795212}
+  - {fileID: 1331411273}
   m_Father: {fileID: 0}
   m_Father: {fileID: 0}
   m_RootOrder: 3
   m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -3135,7 +3281,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0}
   m_AnchorMin: {x: 0.5, y: 0}
   m_AnchorMax: {x: 0.5, y: 0}
   m_AnchorMax: {x: 0.5, y: 0}
-  m_AnchoredPosition: {x: 0, y: 70}
+  m_AnchoredPosition: {x: 0, y: 80}
   m_SizeDelta: {x: 50, y: 0}
   m_SizeDelta: {x: 50, y: 0}
   m_Pivot: {x: 0.5, y: 0}
   m_Pivot: {x: 0.5, y: 0}
 --- !u!222 &941795214
 --- !u!222 &941795214
@@ -3202,9 +3348,11 @@ MonoBehaviour:
   horizontalA: 0.07
   horizontalA: 0.07
   jumpThreshold: 0.1
   jumpThreshold: 0.1
   downA: 0.4
   downA: 0.4
-  fallA: 0.4
+  fallA: 0.6
+  filpSpeed: 10000
   jumpBufferTime: 0.15
   jumpBufferTime: 0.15
   jumpWolfTime: 0.2
   jumpWolfTime: 0.2
+  hp: 15
   movingLeft: 0
   movingLeft: 0
   knockbackForceH: 30
   knockbackForceH: 30
   knockbackForceV: 8
   knockbackForceV: 8
@@ -3538,9 +3686,11 @@ MonoBehaviour:
   horizontalA: 0.3
   horizontalA: 0.3
   jumpThreshold: 0.1
   jumpThreshold: 0.1
   downA: 0.3
   downA: 0.3
-  fallA: 0.1
+  fallA: 0.6
+  filpSpeed: 0.3
   jumpBufferTime: 0.2
   jumpBufferTime: 0.2
   jumpWolfTime: 0.2
   jumpWolfTime: 0.2
+  hp: 2
   movingLeft: 0
   movingLeft: 0
 --- !u!1 &1142715111
 --- !u!1 &1142715111
 GameObject:
 GameObject:
@@ -4080,6 +4230,52 @@ MonoBehaviour:
         - localeIdentifier:
         - localeIdentifier:
             m_Code: en-US
             m_Code: en-US
           value: 23
           value: 23
+--- !u!1 &1331411272
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1331411273}
+  - component: {fileID: 1331411274}
+  m_Layer: 5
+  m_Name: PanStatus
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1331411273
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1331411272}
+  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: 583505890}
+  m_Father: {fileID: 757919350}
+  m_RootOrder: 2
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 300, y: 100}
+  m_Pivot: {x: 0, y: 1}
+--- !u!222 &1331411274
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1331411272}
+  m_CullTransparentMesh: 1
 --- !u!1 &1333063662
 --- !u!1 &1333063662
 GameObject:
 GameObject:
   m_ObjectHideFlags: 0
   m_ObjectHideFlags: 0
@@ -8617,9 +8813,11 @@ MonoBehaviour:
   horizontalA: 0.07
   horizontalA: 0.07
   jumpThreshold: 0.05
   jumpThreshold: 0.05
   downA: 0.4
   downA: 0.4
-  fallA: 0.4
+  fallA: 0.6
+  filpSpeed: 0.3
   jumpBufferTime: 0.15
   jumpBufferTime: 0.15
   jumpWolfTime: 0.2
   jumpWolfTime: 0.2
+  hp: 6
   movingLeft: 0
   movingLeft: 0
   knockbackForceH: 40
   knockbackForceH: 40
   knockbackForceV: 10
   knockbackForceV: 10

+ 1 - 1
ProjectSettings/Physics2DSettings.asset

@@ -53,4 +53,4 @@ Physics2DSettings:
   m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
   m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
   m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
   m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
   m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
   m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
-  m_LayerCollisionMatrix: bbffffffbbf7ffff88f7fffffff7ffffbbf7ffffbbf7ffffc8f7fffffff7fffffff7fffffff3fffffff5ffff01f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+  m_LayerCollisionMatrix: bbffffffbbf7ffff88f7fffffff7ffffbbf7ffffbbf7ffffc8f7ffffffe7fffffff7fffffff3fffffff5ffff01e0ffff7fe7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

+ 1 - 1
ProjectSettings/TagManager.asset

@@ -22,7 +22,7 @@ TagManager:
   - Border
   - Border
   - Dice
   - Dice
   - Marker
   - Marker
-  - 
+  - Bullet
   - 
   - 
   - 
   - 
   - 
   - 

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.