Unity配对游戏自定义关联图片配对功能实现求助
实现关联图片配对的修改方案
核心思路
将原有的「相同ID配对」逻辑改为「自定义关联ID配对」,通过序列化类定义配对关系,随机打乱卡牌布局后,检查两张卡牌是否属于同一关联组。
修改后的代码
GameController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; // 定义关联配对组,可在Inspector中配置 [Serializable] public class PairGroup { public int spriteIdA; public int spriteIdB; } public class GameController : MonoBehaviour { public const int columns = 4; public const int rows = 2; public const float Xspace = 4f; public const float Yspace = -3f; [SerializeField] private MainImageScripts startObject; [SerializeField] private Sprite[] images; [SerializeField] private PairGroup[] pairGroups; // 新增:配置关联配对的数组 private int[] Randomiser(int[] locations) { int[] array = locations.Clone() as int[]; for (int i = 0; i < array.Length; i++) { int newArray = array[i]; int j = Random.Range(i, array.Length); array[i] = array[j]; array[j] = newArray; } return array; } private void Start() { List<int> locationList = new List<int>(); // 从配对组生成卡牌ID列表 foreach (var pair in pairGroups) { locationList.Add(pair.spriteIdA); locationList.Add(pair.spriteIdB); } int[] locations = locationList.ToArray(); locations = Randomiser(locations); Vector3 startPosition = startObject.transform.position; for (int i = 0; i < columns; i++) { for (int j = 0; j < rows; j++) { MainImageScripts gameImage; if (i == 0 && j == 0) { gameImage = startObject; } else { gameImage = Instantiate(startObject) as MainImageScripts; } int index = j * columns + i; int id = locations[index]; gameImage.ChangeSprite(id, images[id]); float positionX = (Xspace * i) + startPosition.x; float positionY = (Yspace * j) + startPosition.y; gameImage.transform.position = new Vector3(positionX, positionY, startPosition.z); } } } private MainImageScripts firstOpen; private MainImageScripts secondOpen; private int score = 0; private int attempts = 0; [SerializeField] private TextMesh scoreText; [SerializeField] private TextMesh attemptsText; public bool canOpen { get { return secondOpen == null; } } public void imageOpened(MainImageScripts startObject) { if (firstOpen == null) { firstOpen = startObject; } else { secondOpen = startObject; StartCoroutine(CheckGuessed()); } } // 新增:检查两个ID是否属于同一关联配对 private bool ArePair(int id1, int id2) { foreach (var pair in pairGroups) { if ((pair.spriteIdA == id1 && pair.spriteIdB == id2) || (pair.spriteIdA == id2 && pair.spriteIdB == id1)) { return true; } } return false; } private IEnumerator CheckGuessed() { // 修改配对判断逻辑为检查关联组 if (ArePair(firstOpen.spriteId, secondOpen.spriteId)) { score++; scoreText.text = "Счёт: " + score; } else { yield return new WaitForSeconds(0.5f); firstOpen.Close(); secondOpen.Close(); } attempts++; attemptsText.text = "Попыток: " + attempts; firstOpen = null; secondOpen = null; } public void Restart() { SceneManager.LoadScene("MainScene"); } }
MainImageScripts.cs
无需修改,保持原代码即可。
配置步骤
- 在Unity Inspector中选中GameController对象
- 设置
pairGroups数组长度为4(对应8张卡牌的4组配对) - 为每个PairGroup条目设置
spriteIdA和spriteIdB:- 例如:将雨水图片的索引设为
spriteIdA,雨伞图片的索引设为spriteIdB
- 例如:将雨水图片的索引设为
- 确保
images数组包含所有配对中引用的图片,索引与配置的ID一致
内容的提问来源于stack exchange,提问作者Mife Ger
相关产品推荐
相关产品推荐

