Răsfoiți Sursa

优化的骰子……

龙腾猫跃 4 ani în urmă
părinte
comite
0d0008a6ba

+ 6 - 4
Assets/Resources/Dice/DiceEntity.cs

@@ -10,7 +10,6 @@ public class DiceEntity : MonoBehaviour {
     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);
@@ -29,7 +28,7 @@ public class DiceEntity : MonoBehaviour {
         // ¿ªÊ¼Ðýת
         transform.DORotate(new Vector3(0, 0, 360f * Mathf.RoundToInt(rollTime * 1.5f)), rollTime, RotateMode.FastBeyond360);
         transform.DOScale(2, rollTime);
-        transform.DOMoveY(-2, rollTime);
+        transform.DOMoveY(transform.position.y + 3, rollTime);
         StartCoroutine(Roll());
     }
     IEnumerator Roll() {
@@ -57,11 +56,14 @@ public class DiceEntity : MonoBehaviour {
         // ½áÊø¶¯»­
         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);
+        Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.allCameras[0], endObj.transform.position);
+        transform.DOMove((Vector2) Camera.allCameras[0].ScreenToWorldPoint(screenPos), endTime);
         yield return new WaitForSeconds(endTime);
         // ÉèÖÃ
         InputM.SetKey(key, currentLetter);
+        endObj.GetComponent<DiceUI>().isDropped = false;
+        endObj.GetComponent<DiceUI>().UpdateColor();
+        yield return new WaitForSeconds(0.1f);
         Destroy(gameObject);
     }
 

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

@@ -8,9 +8,11 @@ using System.Linq;
 public class DiceUI : MonoBehaviour {
 
     private Image spriteBg, spriteLetter;
+    private RectTransform rectTransform;
     public InputM.KeyType keybind;
     void Start() {
         spriteBg = GetComponent<Image>();
+        rectTransform = GetComponent<RectTransform>();
         spriteLetter = GetComponentsInChildren<Image>().Where(sp => sp.gameObject.name == "ImgText").First();
         UpdateLetter();
     }
@@ -19,10 +21,34 @@ public class DiceUI : MonoBehaviour {
     }
 
     private bool isKeyDown = false;
-    void Update() {
+    void LateUpdate() {
         if (isKeyDown == InputM.GetKeyUI(keybind)) return;
         isKeyDown = !isKeyDown;
-        spriteBg.DOColor(isKeyDown ? new Color(49f / 255f, 38f / 255f, 31f / 255f, 1) : new Color(111f / 255f, 93f / 255f, 80f / 255f, 1), 0.05f);
+        UpdateColor();
+    }
+    public void UpdateColor() {
+        spriteBg.DOColor(isKeyDown ?
+            new Color(49f / 255f, 38f / 255f, 31f / 255f, isDropped ? 0.3f : 1f) :
+            new Color(111f / 255f, 93f / 255f, 80f / 255f, isDropped ? 0.3f : 1f), 0.05f);
+    }
+
+    public bool allowPress = true;
+    void Update() {
+        if (!Input.GetMouseButtonUp(0) || !allowPress || 
+            !RectTransformUtility.RectangleContainsScreenPoint(rectTransform, Input.mousePosition, Camera.allCameras[0])) return;
+        // µã»÷
+        DropDice();
+    }
+
+    public bool isDropped = false;
+    public void DropDice() {
+        Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.allCameras[0], transform.position);
+        Vector2 currentPos = Camera.allCameras[0].ScreenToWorldPoint(screenPos);
+        DiceEntity diceNew = GameObject.Instantiate(InputM.instance.dicePrefab).GetComponent<DiceEntity>();
+        diceNew.transform.position = currentPos;
+        diceNew.key = keybind;
+        isDropped = true;
+        UpdateColor();
     }
-    
+
 }

+ 3 - 4
Assets/Resources/Entities/PlayerController.cs

@@ -30,10 +30,9 @@ public class PlayerController : EntityBase {
     // 测试方法:按 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());
-        }
+        if (!Input.GetKey(KeyCode.LeftControl) || !Input.GetKeyUp(KeyCode.R)) return;
+        // 生成测试骰子
+        InputM.DropDice(Module.RandomOne(InputM.keyTypes.ToList()));
     }
 
 }

+ 25 - 18
Assets/Resources/System/InputM.cs

@@ -4,6 +4,7 @@ using UnityEngine;
 using System.Linq;
 
 public class InputM : MonoBehaviour {
+    public GameObject dicePrefab;
     
     public static string keyLeft = "a", keyRight = "d", keyJump = "w", keyCrouch = "s", keyFire = "l", keyReload = "r";
     public enum KeyType { Left, Right, Jump, Crouch, Fire, Reload }
@@ -86,34 +87,40 @@ public class InputM : MonoBehaviour {
     };
 
     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();
+    public static string GetPossibleResults(KeyType key, bool doRestore) {
+        List<string> accepted = "wasdlr".ToList().Select(c => c.ToString()).ToList();
+        List<string> refused = new();
         // 删除冲突键位
         //  - 不能同时跳跃、蹲下
-        if (key == KeyType.Jump) result.Remove(GetKeyRaw(KeyType.Crouch)); 
-        if (key == KeyType.Crouch) result.Remove(GetKeyRaw(KeyType.Jump));
+        if (key == KeyType.Jump) refused.Add(GetKeyRaw(KeyType.Crouch)); 
+        if (key == KeyType.Crouch) refused.Add(GetKeyRaw(KeyType.Jump));
         //  - 不能同时向左、向右
-        if (key == KeyType.Left) result.Remove(GetKeyRaw(KeyType.Right));
-        if (key == KeyType.Right) result.Remove(GetKeyRaw(KeyType.Left));
+        if (key == KeyType.Left) refused.Add(GetKeyRaw(KeyType.Right));
+        if (key == KeyType.Right) refused.Add(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));
+        if (key == KeyType.Fire) refused.Add(GetKeyRaw(KeyType.Reload));
+        if (key == KeyType.Reload) refused.Add(GetKeyRaw(KeyType.Fire));
         // 禁止选择已经有两个绑定项的字母、尽量选择没有绑定项的字母
         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); }
+            if (keyTypes.Count(keyType => GetKeyRaw(keyType) == letter) >= 2) refused.Add(letter);
+            if (keyTypes.Count(keyType => GetKeyRaw(keyType) == letter) == 0) { accepted.Add(letter); accepted.Add(letter); }
         }
-        Debug.Log("绑定项 != 1:" + string.Join("", result));
         // 禁止与当前项相同
+        refused.Add(GetKeyRaw(key));
+        // 是否可以还原回原始键位
+        if (!doRestore) refused.Add(GetKeyRawDefault(key));
+        if (doRestore) for (int i = 0; i < 10; i++) accepted.Add(GetKeyRawDefault(key));
+        // 输出
         string resultStr = "";
-        result.ForEach(c => { if (c != GetKeyRaw(key)) resultStr += c; });
-        Debug.Log("禁止与当前项相同:" + resultStr);
+        accepted.ForEach(resultChar => {
+            foreach (string refusedChar in refused) if (resultChar == refusedChar) return;
+            resultStr += resultChar; 
+        });
         return resultStr;
     }
 
+    public static void DropDice(KeyType key) {
+        GetDiceUI(key).GetComponent<DiceUI>().DropDice();
+    }
+
 }

+ 21 - 14
Assets/Scenes/SceneMain.unity

@@ -175,7 +175,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -470,7 +470,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.85490197, g: 0.8235294, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -546,7 +546,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -622,7 +622,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -738,6 +738,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   keybind: 2
+  allowPress: 1
 --- !u!1 &557375725
 GameObject:
   m_ObjectHideFlags: 0
@@ -3066,6 +3067,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   keybind: 0
+  allowPress: 1
 --- !u!1 &803082884
 GameObject:
   m_ObjectHideFlags: 0
@@ -3158,6 +3160,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   keybind: 5
+  allowPress: 1
 --- !u!1 &807452969
 GameObject:
   m_ObjectHideFlags: 0
@@ -3210,7 +3213,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.85490197, g: 0.8235294, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -3293,8 +3296,8 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
-  m_Color: {r: 0.6792453, g: 0.6148675, b: 0.54083306, a: 1}
-  m_RaycastTarget: 1
+  m_Color: {r: 0.6792453, g: 0.6148675, b: 0.54083306, a: 0.80784315}
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -3370,7 +3373,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -3486,6 +3489,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   keybind: 3
+  allowPress: 1
 --- !u!1 &1153718130
 GameObject:
   m_ObjectHideFlags: 0
@@ -3578,6 +3582,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   keybind: 4
+  allowPress: 1
 --- !u!1 &1171855005
 GameObject:
   m_ObjectHideFlags: 0
@@ -3630,7 +3635,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.85490197, g: 0.8235294, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -3706,7 +3711,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -3917,7 +3922,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.85490197, g: 0.8235294, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -4022,6 +4027,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: c6a604d118c1a1048a8be03e40d92e94, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+  dicePrefab: {fileID: 1666923398196175546, guid: 5227edcd0b7cac746a8f86c1e821b9db, type: 3}
   spritesText:
   - {fileID: 21300000, guid: 2cf8713ec36010f4798bc5f1ab1d204d, type: 3}
   - {fileID: 21300000, guid: 34465e68ae881a140b4f4146cfab7c56, type: 3}
@@ -4095,7 +4101,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.85490197, g: 0.8235294, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -5913,6 +5919,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   keybind: 1
+  allowPress: 1
 --- !u!1 &1741842511
 GameObject:
   m_ObjectHideFlags: 0
@@ -5965,7 +5972,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.85490197, g: 0.8235294, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged:
@@ -6041,7 +6048,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
   m_Color: {r: 0.854902, g: 0.8235295, b: 0.72156864, a: 1}
-  m_RaycastTarget: 1
+  m_RaycastTarget: 0
   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
   m_Maskable: 1
   m_OnCullStateChanged: