Files
MiniGame_Unity_GP/Assets/Resources/puzzle/scripts/CreatPuzzle.cs
T
2026-07-06 16:27:14 +08:00

468 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using IgnoreOPS;
using Spine.Unity;
using UnityEngine;
using TowerClimberChronicles;
using FairyGUI;
using UnityEngine.UI;
using System.Collections;
using DG.Tweening;
public class CreatPuzzle : MonoBehaviour
{
public static CreatPuzzle instance;
private List<Sprite> img_list;
private List<Sprite> line_list;
private void Awake()
{
instance = this;
img_list = new List<Sprite>();
line_list = new List<Sprite>();
puzzle_parent = GameObject.Find("puzzle_parent");
GameDispatcher.Instance.AddListener(GameMsg.PuzzleIn, PuzzlenInFunc);
GameDispatcher.Instance.AddListener(GameMsg.PuzzleReset, PuzzlenResetFunc);
puzzle_list = new List<GameObject>();
}
private int rows = 6;
private int cols = 4;
List<List<float>> offsetList_x = new List<List<float>>()
{
new List<float>()
{
-229, -83, 87, 233
},
new List<float>()
{
-255f, -137f, -1.2f, 133.6f, 251.6f
},
new List<float>()
{
-250f, -86f, 81f, 243.3f
},
new List<float>()
{
-260f, -130.6f, 3.3f, 136f, 264.5f
},
new List<float>()
{
-225f, -119.3f, 82.4f, 223.9f
},
new List<float>()
{
-248f, -151.6f, -0.2f, 151.5f, 249f
},
new List<float>()
{
-223f, -89.9f, 80.2f, 217.1f
},
new List<float>()
{
-242f, -132.9f, 3.3f, 139f, 245.7f
},
new List<float>()
{
-225f, -84.5f, 83.8f, 224.3f
},
new List<float>()
{
-246f, -133.8f, 1.5f, 135.8f, 248f
},
};
List<List<float>> offsetList_y = new List<List<float>>()
{
new List<float>()
{
391, 250.9f, 82.5f, -89.5f, -259, -404.6f
},
new List<float>()
{
421f, 310.7f, 184.2f, 57.1f, -69.5f, -195.9f, -322.2f, -433.3f
},
new List<float>()//2
{
391, 228.1f, 60.3f, -108f, -274.5f, -438.2f
},
new List<float>()//3
{
421f, 299.4f, 175.2f, 50f, -75.6f, -200.7f, -326f, -447.6f
},
new List<float>()
{
413f, 271.5f, 87.2f, -97.6f, -281.8f, -421.3f
},
new List<float>()
{
428f, 324.3f, 190.2f, 56.4f, -77.3f, -211.4f, -344.9f, -451.3f
},
new List<float>()
{
381f, 244.3f, 74.6f, -95.7f, -265.5f, -398.2f
},
new List<float>()
{
413f, 312.6f, 185f, 57.7f, -69.8f, -197.2f, -324.4f, -425.4f
},
new List<float>()//8
{
391, 250.5f, 81.8f, -87.1f, -255.8f, -396.2f
},
new List<float>()
{
415f, 310f, 183.1f, 56.1f, -70.7f, -197.3f, -324f, -429.3f
},
};
List<List<Vector2>> image_offset_list = new List<List<Vector2>>()
{
new List<Vector2>()//0
{
new Vector2(1051, -1806), new Vector2(386, -1806), new Vector2(-386, -1806), new Vector2(-1051, -1806),
new Vector2(1051, -1169), new Vector2(386, -1169), new Vector2(-386, -1169), new Vector2(-1051, -1169),
new Vector2(1051, -401.2f), new Vector2(386, -401.2f), new Vector2(-386, -401.2f), new Vector2(-1051, -401.2f),
new Vector2(1051, 380), new Vector2(386, 380), new Vector2(-386, 380), new Vector2(-1051, 380),
new Vector2(1051, 1150.5f), new Vector2(386, 1150.5f), new Vector2(-386, 1150.5f), new Vector2(-1051, 1150.5f),
new Vector2(1051, 1810.5f), new Vector2(386, 1810.5f), new Vector2(-386, 1810.5f), new Vector2(-1051, 1810.5f),
},
new List<Vector2>()//1
{
new Vector2(1151, -1940), new Vector2(615, -1940), new Vector2(-3, -1940), new Vector2(-616.3f, -1940), new Vector2(-1153, -1940),
new Vector2(1151, -1439), new Vector2(615, -1439), new Vector2(-3, -1439), new Vector2(-616.3f, -1439), new Vector2(-1153, -1439),
new Vector2(1151, -864), new Vector2(615, -864), new Vector2(-3, -864), new Vector2(-616.3f, -864), new Vector2(-1153, -864),
new Vector2(1151, -287), new Vector2(615, -287), new Vector2(-3, -287), new Vector2(-616.3f, -287), new Vector2(-1153, -287),
new Vector2(1151, 288), new Vector2(615, 288), new Vector2(-3, 288), new Vector2(-616.3f, 288), new Vector2(-1153, 288),
new Vector2(1151, 862), new Vector2(615, 862), new Vector2(-3, 862), new Vector2(-616.3f, 862), new Vector2(-1153, 862),
new Vector2(1151, 1437), new Vector2(615,1437), new Vector2(-3, 1437), new Vector2(-616.3f, 1437), new Vector2(-1153,1437),
new Vector2(1151, 1941), new Vector2(615, 1941), new Vector2(-3, 1941), new Vector2(-616.3f, 1941), new Vector2(-1153, 1941),
},
new List<Vector2>()//2
{
new Vector2(1117, -1888), new Vector2(371, -1888), new Vector2(-389.5f, -1888), new Vector2(-1125, -1888),
new Vector2(1117, -1149), new Vector2(371, -1149), new Vector2(-389.5f, -1149), new Vector2(-1125, -1149),
new Vector2(1117, -386), new Vector2(371, -386), new Vector2(-389.5f, -386), new Vector2(-1125, -386),
new Vector2(1117, 378), new Vector2(371, 378), new Vector2(-389.5f, 378), new Vector2(-1125, 378),
new Vector2(1117, 1136), new Vector2(371, 1136), new Vector2(-389.5f, 1136), new Vector2(-1125, 1136),
new Vector2(1117, 1881), new Vector2(371, 1881), new Vector2(-389.5f, 1881), new Vector2(-1125, 1881),
},
new List<Vector2>()//3
{
new Vector2(1194, -1976), new Vector2(606.3f, -1976), new Vector2(-3, -1976), new Vector2(-606.5f, -1976), new Vector2(-1188, -1976),
new Vector2(1194, -1423), new Vector2(606.3f, -1423), new Vector2(-3, -1423), new Vector2(-606.5f, -1423), new Vector2(-1188, -1423),
new Vector2(1194, -858.4f), new Vector2(606.3f, -858.4f), new Vector2(-3, -858.4f), new Vector2(-606.5f, -858.4f), new Vector2(-1188, -858.4f),
new Vector2(1194, -291.9f), new Vector2(606.3f, -291.9f), new Vector2(-3, -291.9f), new Vector2(-606.5f, -291.9f), new Vector2(-1188, -291.9f),
new Vector2(1194, 280.8f), new Vector2(606.3f, 280.8f), new Vector2(-3, 280.8f), new Vector2(-606.5f, 280.8f), new Vector2(-1188, 280.8f),
new Vector2(1194, 848), new Vector2(606.3f, 848), new Vector2(-3, 848), new Vector2(-606.5f, 848), new Vector2(-1188, 848),
new Vector2(1194, 1419), new Vector2(606.3f,1419), new Vector2(-3, 1419), new Vector2(-606.5f, 1419), new Vector2(-1188,1419),
new Vector2(1194, 1971), new Vector2(606.3f, 1971), new Vector2(-3, 1971), new Vector2(-606.5f, 1971), new Vector2(-1188, 1971),
},
new List<Vector2>()//4
{
new Vector2(1020, -1890), new Vector2(539, -1890), new Vector2(-377.6f, -1890), new Vector2(-1018.6f, -1890),
new Vector2(1020, -1245), new Vector2(539, -1245), new Vector2(-377.6f, -1245), new Vector2(-1018.6f, -1245),
new Vector2(1020, -409), new Vector2(539, -409), new Vector2(-377.6f, -409), new Vector2(-1018.6f, -409),
new Vector2(1020, 430.7f), new Vector2(539, 430.7f), new Vector2(-377.6f, 430.7f), new Vector2(-1018.6f, 430.7f),
new Vector2(1020, 1267.9f), new Vector2(539, 1267.9f), new Vector2(-377.6f, 1267.9f), new Vector2(-1018.6f, 1267.9f),
new Vector2(1020, 1903), new Vector2(539, 1903), new Vector2(-377.6f, 1903), new Vector2(-1018.6f, 1903),
},
new List<Vector2>()//5
{
new Vector2(1132, -2006), new Vector2(693.7f, -2006), new Vector2(4.3f, -2006), new Vector2(-686.7f, -2006), new Vector2(-1127.6f, -2006),
new Vector2(1132, -1535), new Vector2(693.7f, -1535), new Vector2(4.3f, -1535), new Vector2(-686.7f, -1535), new Vector2(-1127.6f, -1535),
new Vector2(1132, -926), new Vector2(693.7f, -926), new Vector2(4.3f, -926), new Vector2(-686.7f, -926), new Vector2(-1127.6f, -926),
new Vector2(1132, -316.5f), new Vector2(693.7f, -316.5f), new Vector2(4.3f, -316.5f), new Vector2(-686.7f, -316.5f), new Vector2(-1127.6f, -316.5f),
new Vector2(1132, 290.5f), new Vector2(693.7f, 290.5f), new Vector2(4.3f, 290.5f), new Vector2(-686.7f, 290.5f), new Vector2(-1127.6f, 290.5f),
new Vector2(1132, 899.8f), new Vector2(693.7f, 899.8f), new Vector2(4.3f, 899.8f), new Vector2(-686.7f, 899.8f), new Vector2(-1127.6f, 899.8f),
new Vector2(1132, 1508), new Vector2(693.7f,1508), new Vector2(4.3f, 1508), new Vector2(-686.7f, 1508), new Vector2(-1127.6f,1508),
new Vector2(1132, 1990), new Vector2(693.7f, 1990), new Vector2(4.3f, 1990), new Vector2(-686.7f, 1990), new Vector2(-1127.6f, 1990),
},
new List<Vector2>()//6
{
new Vector2(1007, -1761), new Vector2(402, -1761), new Vector2(-370f, -1761), new Vector2(-991.3f, -1761),
new Vector2(1007, -1138), new Vector2(402, -1138), new Vector2(-370f, -1138), new Vector2(-991.3f, -1138),
new Vector2(1007, -369), new Vector2(402, -369), new Vector2(-370f, -369), new Vector2(-991.3f, -369),
new Vector2(1007, 405), new Vector2(402, 405), new Vector2(-370f, 405), new Vector2(-991.3f, 405),
new Vector2(1007, 1179), new Vector2(402, 1179), new Vector2(-370f, 1179), new Vector2(-991.3f, 1179),
new Vector2(1007, 1781), new Vector2(402, 1781), new Vector2(-370f, 1781), new Vector2(-991.3f, 1781),
},
new List<Vector2>()//7
{
new Vector2(1104, -1905), new Vector2(610, -1905), new Vector2(-3, -1905), new Vector2(-616, -1905), new Vector2(-1111.9f, -1905),
new Vector2(1104, -1451), new Vector2(610, -1451), new Vector2(-3, -1451), new Vector2(-616, -1451), new Vector2(-1111.9f, -1451),
new Vector2(1104, -871.3f), new Vector2(610, -871.3f), new Vector2(-3, -871.3f), new Vector2(-616, -871.3f), new Vector2(-1111.9f, -871.3f),
new Vector2(1104, -292.9f), new Vector2(610, -292.9f), new Vector2(-3, -292.9f), new Vector2(-616, -292.9f), new Vector2(-1111.9f, -292.9f),
new Vector2(1104, 288), new Vector2(610, 288), new Vector2(-3, 288), new Vector2(-616, 288), new Vector2(-1111.9f, 288),
new Vector2(1104, 866), new Vector2(610, 866), new Vector2(-3, 866), new Vector2(-616, 866), new Vector2(-1111.9f, 866),
new Vector2(1104, 1445), new Vector2(610, 1445), new Vector2(-3, 1445), new Vector2(-616, 1445), new Vector2(-1111.9f, 1445),
new Vector2(1104, 1904), new Vector2(610, 1904), new Vector2(-3, 1904), new Vector2(-616, 1904), new Vector2(-1111.9f, 1904),
},
new List<Vector2>()//8
{
new Vector2(1019, -1791), new Vector2(377.8f, -1791), new Vector2(-386f, -1791), new Vector2(-1026, -1791),
new Vector2(1019, -1153.4f), new Vector2(377.8f, -1153.4f), new Vector2(-386f, -1153.4f), new Vector2(-1026,-1153.4f),
new Vector2(1019, -386), new Vector2(377.8f, -386), new Vector2(-386f, -386), new Vector2(-1026, -386),
new Vector2(1019, 381.6f), new Vector2(377.8f, 381.6f), new Vector2(-386f, 381.6f), new Vector2(-1026, 381.6f),
new Vector2(1019, 1149), new Vector2(377.8f, 1149), new Vector2(-386f, 1149), new Vector2(-1026, 1149),
new Vector2(1019, 1787), new Vector2(377.8f, 1787), new Vector2(-386f, 1787), new Vector2(-1026, 1787),
},
new List<Vector2>()
{
new Vector2(1121, -1917), new Vector2(612, -1917), new Vector2(-3, -1917), new Vector2(-615, -1917), new Vector2(-1126, -1917),
new Vector2(1121, -1440), new Vector2(612, -1440), new Vector2(-3, -1440), new Vector2(-615, -1440), new Vector2(-1126, -1440),
new Vector2(1121, -863), new Vector2(612, -863), new Vector2(-3, -863), new Vector2(-615, -863), new Vector2(-1126, -863),
new Vector2(1121, -286), new Vector2(612, -286), new Vector2(-3, -286), new Vector2(-615, -286), new Vector2(-1126, -286),
new Vector2(1121, 292.8f), new Vector2(612, 292.8f), new Vector2(-3, 292.8f), new Vector2(-615, 292.8f), new Vector2(-1126, 292.8f),
new Vector2(1121, 868.5f), new Vector2(612, 868.5f), new Vector2(-3, 868.5f), new Vector2(-615, 868.5f), new Vector2(-1126, 868.5f),
new Vector2(1121, 1442), new Vector2(612, 1442), new Vector2(-3, 1442), new Vector2(-615, 1442), new Vector2(-1126, 1442),
new Vector2(1121, 1922), new Vector2(612, 1922), new Vector2(-3, 1922), new Vector2(-615, 1922), new Vector2(-1126, 1922),
},
};
private List<GameObject> puzzle_list;
public void PuzzlenResetFunc(object a = null)
{
Debug.Log("脚本里的reset");
for (int i = 0; i < puzzle_list.Count; i++)
{
GameObject.Destroy(puzzle_list[i]);
}
puzzle_list.Clear();
}
private void PuzzlenInFunc(object a = null)
{
remain_puzzle_numbers -= 1;
if (remain_puzzle_numbers <= 0)
{
// for (int i = 0; i < puzzle_list.Count; i++)
// {
// GameObject.Destroy(puzzle_list[i]);
// }
// puzzle_list.Clear();
GameDispatcher.Instance.Dispatch(GameMsg.PuzzleSuccess);
AudioManager.Instance.PlayDynamicEffect(AudioConst.puzzle_success);
}
}
private GameObject puzzle_parent;
private int remain_puzzle_numbers;
public void CreatPuzzleItem(int type, string imageName, int puzzleNumbers, int puzzle_level)
{
GameObject prefab = Resources.Load<GameObject>("puzzle/item/item");
if (prefab == null) return;
GameObject canvas = GameObject.Find("Canvas");
if (canvas == null) return;
int all_puzzle_numbers = 0;
if (type % 2 == 0)
{
rows = 6;
cols = 4;
}
else
{
rows = 8;
cols = 5;
}
all_puzzle_numbers = rows * cols;
img_list.Clear();
line_list.Clear();
for (int i = 1; i <= all_puzzle_numbers; i++)
{
img_list.Add(Resources.Load<Sprite>("puzzle/mask/" + type + "/" + i));
line_list.Add(Resources.Load<Sprite>("puzzle/line/" + type + "/" + i + "-line"));
}
int index = 0;
// puzzleNumbers=1;
remain_puzzle_numbers = puzzleNumbers;
Debug.Log(type);
List<int> random_list = GetRandomNumbers(puzzleNumbers, 0, all_puzzle_numbers - 1);
List<UnityEngine.UI.Image> image_list = new List<UnityEngine.UI.Image>();
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
GameObject piece = Instantiate(prefab, canvas.transform);
RectTransform rt = piece.GetComponent<RectTransform>();
puzzle_list.Add(piece);
float x = offsetList_x[type][c];
float y = offsetList_y[type][r];
Vector2 basePos = new Vector2(x, y);
rt.anchoredPosition = basePos;
// 转换到根 Canvas 的局部坐标
Canvas rootCanvas = GameObject.Find("Canvas").GetComponent<Canvas>();
RectTransform canvasRect = rootCanvas.transform as RectTransform;
Vector3 worldPos = rt.position;
Vector2 canvasLocalPos = canvasRect.InverseTransformPoint(worldPos);
DragPuzzle dp = piece.GetComponent<DragPuzzle>();
dp.snapTarget = canvasLocalPos; // ✅ 用根 Canvas 的局部坐标
dp.snapDistance = 80f;
if (random_list.Contains(index))
{
piece.SetParent(puzzle_parent);
dp.locked = false;
}
else
{
}
// 设置图片
Transform mask = piece.transform.Find("mask_obj");
UnityEngine.UI.Image img = mask.GetComponent<UnityEngine.UI.Image>();
img.sprite = img_list[index];
img.SetNativeSize();
Transform image_obj = mask.transform.Find("image_obj");
UnityEngine.UI.Image img_1 = image_obj.GetComponent<UnityEngine.UI.Image>();
UnityEngine.UI.Image line_image = piece.transform.Find("line_obj").GetComponent<UnityEngine.UI.Image>();
line_image.sprite = line_list[index];
line_image.SetNativeSize();
// Sprite source = Resources.Load<Sprite>("puzzle/image/test_img1");
// img_1.sprite = source;
// img_1.SetNativeSize();
// img_1.rectTransform.anchoredPosition = image_offset_list[type][index];
image_list.Add(img_1);
index++;
}
}
Shuffle();
TextureHelper.setPuzzle(imageName, image_list, image_offset_list[type]);
RefereshList();
}
private ManualHorizontalList manualHorizontalList;
private void RefereshList()
{
if (manualHorizontalList == null) manualHorizontalList = GameObject.Find("puzzle_parent").GetComponent<ManualHorizontalList>();
Debug.Log("refreshhhhhhhhhhhhhh");
manualHorizontalList.hasSortedOnce = false;
DOVirtual.DelayedCall(0, () =>
{
manualHorizontalList.Refresh();
});
}
public void Shuffle()
{
if (puzzle_parent == null) return;
int count = puzzle_parent.transform.childCount;
// 把所有子物体存到数组里
Transform[] children = new Transform[count];
for (int i = 0; i < count; i++)
{
children[i] = puzzle_parent.transform.GetChild(i);
}
// 随机打乱数组
for (int i = 0; i < count; i++)
{
int randIndex = Random.Range(i, count);
Transform temp = children[i];
children[i] = children[randIndex];
children[randIndex] = temp;
}
// 重新设置 sibling 顺序
for (int i = 0; i < count; i++)
{
children[i].SetSiblingIndex(i);
}
}
List<int> GetRandomNumbers(int count, int min, int maxInclusive)
{
// 生成完整区间
List<int> numbers = new List<int>();
for (int i = min; i <= maxInclusive; i++)
{
numbers.Add(i);
}
// Fisher-Yates 洗牌
for (int i = numbers.Count - 1; i > 0; i--)
{
int j = Random.Range(0, i + 1);
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
// 取前 count 个
return numbers.GetRange(0, count);
}
public ScrollRect scrollRect; // 指向你的 ScrollView
private float interval = 0.5f; // 每个拼图之间的间隔
private float flyDuration = 0.4f; // 每个拼图的飞行时长
// 倒数 n 个依次飞向各自的吸附点(调用各自 DragPuzzle.FlyAndSnap
public void FlyLastN(int n)
{
StartCoroutine(FlyLastNCoroutine(n));
}
private IEnumerator FlyLastNCoroutine(int n)
{
if (scrollRect == null) scrollRect = GameObject.Find("ScrollView").GetComponent<ScrollRect>();
RectTransform content = scrollRect.content;
int count = content.childCount;
if (count == 0 || n <= 0) yield break;
// 从后往前选 n 个
for (int i = 0; i < n; i++)
{
int index = count - 1 - i;
if (index < 0) break;
DragPuzzle piece = content.GetChild(index).GetComponent<DragPuzzle>();
if (piece != null)
{
piece.FlyAndSnap(flyDuration); // 调用“每个脚本自身”的飞方法
}
if (i < n - 1) // 最后一个不再等待
{
yield return new WaitForSeconds(interval);
}
}
}
}