You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

无需修改,保持原代码即可。


配置步骤

  1. 在Unity Inspector中选中GameController对象
  2. 设置pairGroups数组长度为4(对应8张卡牌的4组配对)
  3. 为每个PairGroup条目设置spriteIdA和spriteIdB:
    • 例如:将雨水图片的索引设为spriteIdA,雨伞图片的索引设为spriteIdB
  4. 确保images数组包含所有配对中引用的图片,索引与配置的ID一致

内容的提问来源于stack exchange,提问作者Mife Ger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:32:02