Kaynağa Gözat

骰子做好啦

龙腾猫跃 4 yıl önce
ebeveyn
işleme
bd3eca2c26
28 değiştirilmiş dosya ile 1077 ekleme ve 59 silme
  1. 0 1
      Assets/Resources/Controls/Tooltip/BasicTooltip.cs
  2. 319 0
      Assets/Resources/Dice/Dice.prefab
  3. 2 3
      Assets/Resources/Dice/Dice.prefab.meta
  4. 69 0
      Assets/Resources/Dice/DiceEntity.cs
  5. 1 1
      Assets/Resources/Dice/DiceEntity.cs.meta
  6. 11 0
      Assets/Resources/Dice/DiceMaterial.physicsMaterial2D
  7. 3 3
      Assets/Resources/Dice/DiceMaterial.physicsMaterial2D.meta
  8. 9 3
      Assets/Resources/Dice/DiceUI.cs
  9. 37 1
      Assets/Resources/Dice/Images/die_bg.png.meta
  10. 37 1
      Assets/Resources/Dice/Images/die_cover_attack.png.meta
  11. 37 1
      Assets/Resources/Dice/Images/die_cover_down.png.meta
  12. 37 1
      Assets/Resources/Dice/Images/die_cover_lefft.png.meta
  13. 37 1
      Assets/Resources/Dice/Images/die_cover_refresh.png.meta
  14. 37 1
      Assets/Resources/Dice/Images/die_cover_right.png.meta
  15. 37 1
      Assets/Resources/Dice/Images/die_cover_up.png.meta
  16. 37 1
      Assets/Resources/Dice/Images/die_face_a.png.meta
  17. 37 1
      Assets/Resources/Dice/Images/die_face_d.png.meta
  18. 37 1
      Assets/Resources/Dice/Images/die_face_lmb.png.meta
  19. 37 1
      Assets/Resources/Dice/Images/die_face_rmb.png.meta
  20. 37 1
      Assets/Resources/Dice/Images/die_face_s.png.meta
  21. 37 1
      Assets/Resources/Dice/Images/die_face_w.png.meta
  22. 2 2
      Assets/Resources/Entities/EntityBase.cs
  23. 10 0
      Assets/Resources/Entities/PlayerController.cs
  24. 95 2
      Assets/Resources/System/InputM.cs
  25. 10 2
      Assets/Resources/System/Modules.cs
  26. 62 27
      Assets/Scenes/SceneMain.unity
  27. 1 1
      ProjectSettings/Physics2DSettings.asset
  28. 2 1
      ProjectSettings/TagManager.asset

+ 0 - 1
Assets/Resources/Controls/Tooltip/BasicTooltip.cs

@@ -1 +0,0 @@
-

+ 319 - 0
Assets/Resources/Dice/Dice.prefab

@@ -0,0 +1,319 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1666923398196175546
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1666923398196175547}
+  - component: {fileID: 1666923398196175542}
+  - component: {fileID: 1666923398196175541}
+  - component: {fileID: 1666923398196175540}
+  - component: {fileID: 1666923398196175543}
+  m_Layer: 10
+  m_Name: Dice
+  m_TagString: Dice
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1666923398196175547
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398196175546}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 14, y: 15, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1666923398631470602}
+  - {fileID: 1666923398225157464}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1666923398196175542
+SpriteRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398196175546}
+  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: -881333459
+  m_SortingLayer: 2
+  m_SortingOrder: 1000
+  m_Sprite: {fileID: 21300000, guid: 99c4f3f06e1d0524b8adb53534e796b1, type: 3}
+  m_Color: {r: 0.43529415, g: 0.3647059, b: 0.3137255, 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!50 &1666923398196175541
+Rigidbody2D:
+  serializedVersion: 4
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398196175546}
+  m_BodyType: 0
+  m_Simulated: 1
+  m_UseFullKinematicContacts: 0
+  m_UseAutoMass: 0
+  m_Mass: 1
+  m_LinearDrag: 0
+  m_AngularDrag: 0.05
+  m_GravityScale: 1
+  m_Material: {fileID: 6200000, guid: e938aca3f71562d499deb20bf7e0edcd, type: 2}
+  m_Interpolate: 0
+  m_SleepingMode: 1
+  m_CollisionDetection: 1
+  m_Constraints: 4
+--- !u!61 &1666923398196175540
+BoxCollider2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398196175546}
+  m_Enabled: 1
+  m_Density: 1
+  m_Material: {fileID: 6200000, guid: e938aca3f71562d499deb20bf7e0edcd, type: 2}
+  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: 1.125, y: 1.125}
+    newSize: {x: 1, y: 1}
+    adaptiveTilingThreshold: 0.5
+    drawMode: 0
+    adaptiveTiling: 0
+  m_AutoTiling: 0
+  serializedVersion: 2
+  m_Size: {x: 1, y: 1}
+  m_EdgeRadius: 0
+--- !u!114 &1666923398196175543
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398196175546}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: e20f0e1c16f86844b82bdcb89a2f00ee, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  key: 4
+--- !u!1 &1666923398225157471
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1666923398225157464}
+  - component: {fileID: 1666923398225157465}
+  m_Layer: 10
+  m_Name: ImgType
+  m_TagString: Enemy
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1666923398225157464
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398225157471}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1.1666666, y: 1.166667, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1666923398196175547}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1666923398225157465
+SpriteRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398225157471}
+  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: -881333459
+  m_SortingLayer: 2
+  m_SortingOrder: 1001
+  m_Sprite: {fileID: 0}
+  m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, 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: 0
+  m_MaskInteraction: 0
+  m_SpriteSortPoint: 0
+--- !u!1 &1666923398631470601
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1666923398631470602}
+  - component: {fileID: 1666923398631470603}
+  m_Layer: 10
+  m_Name: ImgText
+  m_TagString: Enemy
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &1666923398631470602
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398631470601}
+  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: 1666923398196175547}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!212 &1666923398631470603
+SpriteRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1666923398631470601}
+  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: -881333459
+  m_SortingLayer: 2
+  m_SortingOrder: 1001
+  m_Sprite: {fileID: 21300000, guid: 34465e68ae881a140b4f4146cfab7c56, type: 3}
+  m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, 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

+ 2 - 3
Assets/Resources/Controls.meta → Assets/Resources/Dice/Dice.prefab.meta

@@ -1,7 +1,6 @@
 fileFormatVersion: 2
-guid: f70ea6d62aa046d46b88a96005c8018c
-folderAsset: yes
-DefaultImporter:
+guid: 5227edcd0b7cac746a8f86c1e821b9db
+PrefabImporter:
   externalObjects: {}
   userData: 
   assetBundleName: 

+ 69 - 0
Assets/Resources/Dice/DiceEntity.cs

@@ -0,0 +1,69 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using DG.Tweening;
+using System.Linq;
+
+public class DiceEntity : MonoBehaviour {
+
+    public InputM.KeyType key;
+    private string currentLetter;
+    private SpriteRenderer spriteText;
+    private void Start() {
+        currentLetter = InputM.GetKeyRaw(key);
+        spriteText = GetComponentsInChildren<SpriteRenderer>().Where(sp => sp.gameObject.name == "ImgText").First();
+        GetComponentsInChildren<SpriteRenderer>().Where(sp => sp.gameObject.name == "ImgType").First().sprite = InputM.GetKeyTypeSprite(key);
+        currentLetter = InputM.GetKeyRaw(key);
+        UpdateSpriteText();
+    }
+    private void UpdateSpriteText() => spriteText.sprite = InputM.GetKeyTextSprite(currentLetter);
+
+    const float rollTime = 3.5f, endTime = 1.5f;
+    public bool canRestore = true;
+    private void OnCollisionEnter2D(Collision2D collision) {
+        if (!collision.gameObject.CompareTag("Player")) return;
+        // 关闭其他移动
+        GetComponent<Collider2D>().enabled = false;
+        GetComponent<Rigidbody2D>().gravityScale = 0;
+        GetComponent<Rigidbody2D>().velocity = Vector2.zero;
+        // 开始旋转
+        transform.DORotate(new Vector3(0, 0, 360f * Mathf.RoundToInt(rollTime * 1.5f)), rollTime, RotateMode.FastBeyond360);
+        transform.DOScale(2, rollTime);
+        transform.DOMoveY(-2, rollTime);
+        StartCoroutine(Roll());
+    }
+    IEnumerator Roll() {
+        for (int i = 0; i < rollTime * 8; i++) {
+            currentLetter = Module.RandomOne("wasdlr".ToList()).ToString();
+            UpdateSpriteText();
+            yield return new WaitForSeconds(0.1f);
+        }
+        for (int i = 0; i < Mathf.RoundToInt(rollTime * 0.333f); i++) {
+            currentLetter = Module.RandomOne("wasdlr".ToList()).ToString();
+            UpdateSpriteText();
+            yield return new WaitForSeconds(0.333f);
+        }
+        // 最终确定
+        string possible = InputM.GetPossibleResults(key, canRestore);
+        Debug.Log(possible);
+        currentLetter = Module.RandomOne(possible.ToCharArray().ToList()).ToString();
+        UpdateSpriteText();
+        yield return new WaitForSeconds(0.5f);
+        // 强调动画
+        transform.DOScale(2.5f, 0.1f);
+        yield return new WaitForSeconds(0.1f);
+        transform.DOScale(2.3f, 0.1f);
+        yield return new WaitForSeconds(0.7f);
+        // 结束动画
+        transform.DOScale(1, endTime);
+        GameObject endObj = InputM.GetDiceUI(key);
+        Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.current, endObj.transform.position);
+        transform.DOMove((Vector2) Camera.current.ScreenToWorldPoint(screenPos), endTime);
+        yield return new WaitForSeconds(endTime);
+        // 设置
+        InputM.SetKey(key, currentLetter);
+        Destroy(gameObject);
+    }
+
+
+}

+ 1 - 1
Assets/Resources/Controls/Tooltip/BasicTooltip.cs.meta → Assets/Resources/Dice/DiceEntity.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61fc6dc11daac7343a01f1f9e8d5535a
+guid: e20f0e1c16f86844b82bdcb89a2f00ee
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 11 - 0
Assets/Resources/Dice/DiceMaterial.physicsMaterial2D

@@ -0,0 +1,11 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!62 &6200000
+PhysicsMaterial2D:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: DiceMaterial
+  friction: 1
+  bounciness: 0.4

+ 3 - 3
Assets/Resources/Controls/Tooltip.meta → Assets/Resources/Dice/DiceMaterial.physicsMaterial2D.meta

@@ -1,8 +1,8 @@
 fileFormatVersion: 2
-guid: 3683dd6cff6587a4bacbdc9aeb1e6e64
-folderAsset: yes
-DefaultImporter:
+guid: e938aca3f71562d499deb20bf7e0edcd
+NativeFormatImporter:
   externalObjects: {}
+  mainObjectFileID: 6200000
   userData: 
   assetBundleName: 
   assetBundleVariant: 

+ 9 - 3
Assets/Resources/Dice/DiceUI.cs

@@ -3,20 +3,26 @@ using System.Collections.Generic;
 using DG.Tweening;
 using UnityEngine;
 using UnityEngine.UI;
+using System.Linq;
 
 public class DiceUI : MonoBehaviour {
 
-    private Image sprite;
+    private Image spriteBg, spriteLetter;
     public InputM.KeyType keybind;
     void Start() {
-        sprite = GetComponent<Image>();
+        spriteBg = GetComponent<Image>();
+        spriteLetter = GetComponentsInChildren<Image>().Where(sp => sp.gameObject.name == "ImgText").First();
+        UpdateLetter();
+    }
+    public void UpdateLetter() {
+        spriteLetter.sprite = InputM.GetKeyTextSprite(InputM.GetKeyRaw(keybind));
     }
 
     private bool isKeyDown = false;
     void Update() {
         if (isKeyDown == InputM.GetKeyUI(keybind)) return;
         isKeyDown = !isKeyDown;
-        sprite.DOColor(isKeyDown ? new Color(49f / 255f, 38f / 255f, 31f / 255f, 1) : new Color(111f / 255f, 93f / 255f, 80f / 255f, 1), 0.05f);
+        spriteBg.DOColor(isKeyDown ? new Color(49f / 255f, 38f / 255f, 31f / 255f, 1) : new Color(111f / 255f, 93f / 255f, 80f / 255f, 1), 0.05f);
     }
     
 }

+ 37 - 1
Assets/Resources/Dice/Images/die_bg.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_cover_attack.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_cover_down.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_cover_lefft.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_cover_refresh.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_cover_right.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_cover_up.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_face_a.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_face_d.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_face_lmb.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_face_rmb.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_face_s.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

+ 37 - 1
Assets/Resources/Dice/Images/die_face_w.png.meta

@@ -47,7 +47,7 @@ TextureImporter:
   spriteMeshType: 1
   alignment: 0
   spritePivot: {x: 0.5, y: 0.5}
-  spritePixelsToUnits: 100
+  spritePixelsToUnits: 64
   spriteBorder: {x: 0, y: 0, z: 0, w: 0}
   spriteGenerateFallbackPhysicsShape: 1
   alphaUsage: 1
@@ -76,6 +76,42 @@ TextureImporter:
     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: []

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

@@ -24,14 +24,14 @@ public abstract class EntityBase : MonoBehaviour {
         float speedX = rb.velocity.x, speedY = rb.velocity.y;
         bool isCrouch = isPressingCrouch();
         bool isLand = Physics2D.OverlapCircle(transform.position, jumpThreshold, LayerMask.GetMask("Tilemap"));
-        int moveHorizontal = isCrouch ? 0 : // 没有下蹲
+        float moveHorizontal = (isCrouch && isLand ? 0.35f : 1) * // 下蹲减速
             (isPressingLeft() == isPressingRight() ? 0 : // 没有同时按住左右
             (isPressingLeft() ? -1 : 1)); // 获取方向
         // 判断跳跃
         jumpBuffer -= Time.deltaTime; jumpWolf -= Time.deltaTime; jumping -= Time.deltaTime;
         if (isPressDownJump()) jumpBuffer = jumpBufferTime;
         if (isLand) jumpWolf = jumpWolfTime;
-        if (!isCrouch && jumpBuffer > 0 && jumpWolf > 0 && jumping < 0) { // 在地面、没有蹲下
+        if (jumpBuffer > 0 && jumpWolf > 0 && jumping < 0) {
             speedY = jumpForce;
             jumpBuffer = 0;
             jumping = 0.5f;

+ 10 - 0
Assets/Resources/Entities/PlayerController.cs

@@ -2,6 +2,7 @@ using Cinemachine;
 using DG.Tweening;
 using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 
 public class PlayerController : EntityBase {
@@ -26,4 +27,13 @@ public class PlayerController : EntityBase {
         Camera.current.DOShakePosition(0.3f, 0.3f, 20);
     }
 
+    // ²âÊÔ·½·¨£º°´ Ctrl+R Éú³É÷»×Ó
+    public GameObject dice;
+    private void LateUpdate() {
+        if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyUp(KeyCode.R)) {
+            DiceEntity diceNew = GameObject.Instantiate(dice).GetComponent<DiceEntity>();
+            diceNew.key = Module.RandomOne(InputM.keyTypes.ToList());
+        }
+    }
+
 }

+ 95 - 2
Assets/Resources/System/InputM.cs

@@ -1,10 +1,24 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using System.Linq;
 
-public static class InputM {
+public class InputM : MonoBehaviour {
     
     public static string keyLeft = "a", keyRight = "d", keyJump = "w", keyCrouch = "s", keyFire = "l", keyReload = "r";
+    public enum KeyType { Left, Right, Jump, Crouch, Fire, Reload }
+
+    public static void SetKey(KeyType key, string newKey) {
+        _ = key switch {
+            KeyType.Left => keyLeft = newKey,
+            KeyType.Right => keyRight = newKey,
+            KeyType.Jump => keyJump = newKey,
+            KeyType.Crouch => keyCrouch = newKey,
+            KeyType.Fire => keyFire = newKey,
+            _ => keyReload = newKey,
+        };
+        foreach (GameObject dice in instance.dicesUI) dice.GetComponent<DiceUI>().UpdateLetter();
+    }
     public static bool GetKeyUI(KeyType key) => key switch {
         KeyType.Left => keyLeft == "l" ? Input.GetMouseButton(0) : (keyLeft == "r" ? Input.GetMouseButton(1) : Input.GetKey(keyLeft)),
         KeyType.Right => keyRight == "l" ? Input.GetMouseButton(0) : (keyRight == "r" ? Input.GetMouseButton(1) : Input.GetKey(keyRight)),
@@ -21,6 +35,85 @@ public static class InputM {
         KeyType.Fire => keyFire == "l" ? Input.GetMouseButton(0) : (keyFire == "r" ? Input.GetMouseButton(1) : Input.GetKey(keyFire)),
         _ => keyReload == "l" ? Input.GetMouseButtonDown(0) : (keyReload == "r" ? Input.GetMouseButtonDown(1) : Input.GetKeyDown(keyReload)),
     };
-    public enum KeyType { Left, Right, Jump, Crouch, Fire, Reload }
+    public static string GetKeyRaw(KeyType key) => key switch {
+        KeyType.Left => keyLeft,
+        KeyType.Right => keyRight,
+        KeyType.Jump => keyJump,
+        KeyType.Crouch => keyCrouch,
+        KeyType.Fire => keyFire,
+        _ => keyReload,
+    };
+    public static string GetKeyRawDefault(KeyType key) => key switch {
+        KeyType.Left => "a",
+        KeyType.Right => "d",
+        KeyType.Jump => "w",
+        KeyType.Crouch => "s",
+        KeyType.Fire => "l",
+        _ => "r",
+    };
+
+    public static InputM instance;
+    private void Awake() {
+        instance = this;
+        keyLeft = "a"; keyRight = "d"; keyJump = "w"; keyCrouch = "s"; keyFire = "l"; keyReload = "r";
+    }
+
+    public Sprite[] spritesText, spritesType;
+    public GameObject[] dicesUI;
+    public static Sprite GetKeyTextSprite(string key) => key switch {
+        "w" => instance.spritesText[0],
+        "a" => instance.spritesText[1],
+        "s" => instance.spritesText[2],
+        "d" => instance.spritesText[3],
+        "l" => instance.spritesText[4],
+        _ => instance.spritesText[5],
+    };
+    public static Sprite GetKeyTypeSprite(KeyType key) => key switch {
+        KeyType.Jump => instance.spritesType[0],
+        KeyType.Left => instance.spritesType[1],
+        KeyType.Crouch => instance.spritesType[2],
+        KeyType.Right => instance.spritesType[3],
+        KeyType.Fire => instance.spritesType[4],
+        _ => instance.spritesType[5],
+    };
+    public static GameObject GetDiceUI(KeyType key) => key switch {
+        KeyType.Jump => instance.dicesUI[0],
+        KeyType.Left => instance.dicesUI[1],
+        KeyType.Crouch => instance.dicesUI[2],
+        KeyType.Right => instance.dicesUI[3],
+        KeyType.Fire => instance.dicesUI[4],
+        _ => instance.dicesUI[5],
+    };
+
+    public readonly static KeyType[] keyTypes = new[] { KeyType.Left, KeyType.Right, KeyType.Jump, KeyType.Crouch, KeyType.Fire, KeyType.Reload };
+    public static string GetPossibleResults(KeyType key, bool canRestore) {
+        List<string> result = "wasdlr".ToList().Select(c => c.ToString()).ToList();
+        // 删除冲突键位
+        //  - 不能同时跳跃、蹲下
+        if (key == KeyType.Jump) result.Remove(GetKeyRaw(KeyType.Crouch)); 
+        if (key == KeyType.Crouch) result.Remove(GetKeyRaw(KeyType.Jump));
+        //  - 不能同时向左、向右
+        if (key == KeyType.Left) result.Remove(GetKeyRaw(KeyType.Right));
+        if (key == KeyType.Right) result.Remove(GetKeyRaw(KeyType.Left));
+        //  - 不能同时开火、装弹
+        if (key == KeyType.Fire) result.Remove(GetKeyRaw(KeyType.Reload));
+        if (key == KeyType.Reload) result.Remove(GetKeyRaw(KeyType.Fire));
+        Debug.Log("删除冲突后:" + string.Join("", result));
+        // 是否可以还原回原始键位
+        if (!canRestore) result.Remove(GetKeyRawDefault(key));
+        if (canRestore) result.Add(GetKeyRawDefault(key)); // 增大还原概率
+        Debug.Log("还原回原始键位:" + string.Join("", result));
+        // 禁止选择已经有两个绑定项的字母、尽量选择没有绑定项的字母
+        foreach (string letter in "wasdlr".ToCharArray().Select(c => c.ToString())) {
+            if (keyTypes.Count(keyType => GetKeyRaw(keyType) == letter) >= 2) { result.Remove(letter); result.Remove(letter); }
+            if (keyTypes.Count(keyType => GetKeyRaw(keyType) == letter) == 0) { result.Add(letter); result.Add(letter); }
+        }
+        Debug.Log("绑定项 != 1:" + string.Join("", result));
+        // 禁止与当前项相同
+        string resultStr = "";
+        result.ForEach(c => { if (c != GetKeyRaw(key)) resultStr += c; });
+        Debug.Log("禁止与当前项相同:" + resultStr);
+        return resultStr;
+    }
 
 }

+ 10 - 2
Assets/Resources/System/Modules.cs

@@ -2,14 +2,15 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using UnityEngine;
 
 public static class Module {
 
     /// <summary>
     /// 将 List 随机打乱。
     /// </summary>
-    public static List<T> Shuffle<T>(this List<T> list, Random random = null) {
-        random ??= new Random();
+    public static List<T> Shuffle<T>(this List<T> list, System.Random random = null) {
+        random ??= new System.Random();
         for (int i = 0; i < list.Count; i++) {
             int randomIndex = random.Next(list.Count);
             (list[randomIndex], list[i]) = (list[i], list[randomIndex]);
@@ -17,6 +18,13 @@ public static class Module {
         return list;
     }
     /// <summary>
+    /// 随机返回数组中的一个元素。
+    /// </summary>
+    public static T RandomOne<T>(this List<T> list, System.Random random = null) {
+        random ??= new System.Random();
+        return list[random.Next(list.Count)];
+    }
+    /// <summary>
     /// 可自我返回的 Sort 扩展方法。
     /// </summary>
     public static List<T> SortAndReturn<T>(this List<T> list) {

+ 62 - 27
Assets/Scenes/SceneMain.unity

@@ -682,11 +682,11 @@ RectTransform:
   m_Father: {fileID: 855117207}
   m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 100, y: -30}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -95, y: 29.99997}
   m_SizeDelta: {x: 60, y: 60}
-  m_Pivot: {x: 0, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &549158895
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -788,8 +788,8 @@ MonoBehaviour:
   spriteNormal: {fileID: 21300000, guid: fc138a3e426f0224f92ccc5065951ade, type: 3}
   spriteDown: {fileID: 21300000, guid: 833d67975e2fbe54db127baa2e5f9525, type: 3}
   canCrouch: 1
-  movementSpeed: 35
-  jumpForce: 22
+  movementSpeed: 40
+  jumpForce: 23
   horizontalF: 0.8
   horizontalA: 0.07
   jumpThreshold: 0.05
@@ -799,6 +799,7 @@ MonoBehaviour:
   jumpWolfTime: 0.2
   knockbackForceH: 40
   knockbackForceV: 10
+  dice: {fileID: 1666923398196175546, guid: 5227edcd0b7cac746a8f86c1e821b9db, type: 3}
 --- !u!50 &557375728
 Rigidbody2D:
   serializedVersion: 4
@@ -3009,11 +3010,11 @@ RectTransform:
   m_Father: {fileID: 855117207}
   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: 40, y: -90}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -155, y: -30}
   m_SizeDelta: {x: 60, y: 60}
-  m_Pivot: {x: 0, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &767199833
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -3101,11 +3102,11 @@ RectTransform:
   m_Father: {fileID: 855117207}
   m_RootOrder: 5
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 280, y: -96}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 85, y: -36}
   m_SizeDelta: {x: 60, y: 60}
-  m_Pivot: {x: 0, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &803082886
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -3429,11 +3430,11 @@ RectTransform:
   m_Father: {fileID: 855117207}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 100, y: -90}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -95, y: -30}
   m_SizeDelta: {x: 60, y: 60}
-  m_Pivot: {x: 0, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1142715113
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -3521,11 +3522,11 @@ RectTransform:
   m_Father: {fileID: 855117207}
   m_RootOrder: 4
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
-  m_AnchorMin: {x: 0, y: 1}
-  m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: 280, y: -24}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 84.99994, y: 35.99994}
   m_SizeDelta: {x: 60, y: 60}
-  m_Pivot: {x: 0, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1153718132
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -3951,6 +3952,7 @@ GameObject:
   - component: {fileID: 1378097948}
   - component: {fileID: 1378097947}
   - component: {fileID: 1378097946}
+  - component: {fileID: 1378097949}
   m_Layer: 0
   m_Name: Managers
   m_TagString: Untagged
@@ -4008,6 +4010,39 @@ Transform:
   m_Father: {fileID: 1913634233}
   m_RootOrder: 1
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &1378097949
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1378097945}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c6a604d118c1a1048a8be03e40d92e94, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  spritesText:
+  - {fileID: 21300000, guid: 2cf8713ec36010f4798bc5f1ab1d204d, type: 3}
+  - {fileID: 21300000, guid: 34465e68ae881a140b4f4146cfab7c56, type: 3}
+  - {fileID: 21300000, guid: 2104e13d39b611445857f2ece0258954, type: 3}
+  - {fileID: 21300000, guid: 49c231c2f55ac634b972fe98d76332fc, type: 3}
+  - {fileID: 21300000, guid: d0210ecf4cb8fb049b1aead6436487dc, type: 3}
+  - {fileID: 21300000, guid: 688b1fe913bf77f45b5307f3c9eaafec, type: 3}
+  spritesType:
+  - {fileID: 21300000, guid: a858aaaeef9c612418acf4c205cbffe5, type: 3}
+  - {fileID: 21300000, guid: 3100d937f30a1de4a91c315c3cfb5fce, type: 3}
+  - {fileID: 21300000, guid: 353afd993ca311442b5620645e3115e2, type: 3}
+  - {fileID: 21300000, guid: 57a16e5270a8fc94597ac99be4d9b8b8, type: 3}
+  - {fileID: 21300000, guid: 7653fee4027b5d74c8babcef3e5edb63, type: 3}
+  - {fileID: 21300000, guid: 745758ab1e3108842a935635acb5a488, type: 3}
+  dicesUI:
+  - {fileID: 549158893}
+  - {fileID: 767199831}
+  - {fileID: 1142715111}
+  - {fileID: 1688445079}
+  - {fileID: 1153718130}
+  - {fileID: 803082884}
 --- !u!1 &1415309056
 GameObject:
   m_ObjectHideFlags: 0
@@ -4098,7 +4133,7 @@ GameObject:
   - component: {fileID: 1504625350}
   - component: {fileID: 1504625349}
   - component: {fileID: 1504625351}
-  m_Layer: 3
+  m_Layer: 9
   m_Name: MapBorder
   m_TagString: Border
   m_Icon: {fileID: 0}
@@ -5822,11 +5857,11 @@ RectTransform:
   m_Father: {fileID: 855117207}
   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: 160, y: -90}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -35.00006, y: -30.00003}
   m_SizeDelta: {x: 60, y: 60}
-  m_Pivot: {x: 0, y: 1}
+  m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1688445081
 MonoBehaviour:
   m_ObjectHideFlags: 0

+ 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_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
   m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
-  m_LayerCollisionMatrix: bbffffffbbffffff88ffffffffffffffbbffffffbbffffffc8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+  m_LayerCollisionMatrix: bbffffffbbffffff88ffffffffffffffbbffffffbbffffffc8fffffffffffffffffffffffffbfffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

+ 2 - 1
ProjectSettings/TagManager.asset

@@ -7,6 +7,7 @@ TagManager:
   - Border
   - Enemy
   - Bullet
+  - Dice
   layers:
   - Default
   - TransparentFX
@@ -18,7 +19,7 @@ TagManager:
   - Player
   - Enemy
   - Border
-  - 
+  - Dice
   - 
   - 
   -