81 lines
2.9 KiB
C#
Raw Normal View History

2025-10-25 21:27:50 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CardLayout : MonoBehaviour
{
public List<GameObject> cardPrefabs; // 卡片预制体
public Vector2 centerPosition = new Vector2(0, 100);
public int cardNumber = 0;
public float cardRotationAngle = 1f;
public float fanShapeMaxRadius = 800f;
public float fanShapeMaxAngle = 60f;
private RectTransform card_container;
private readonly string card_container_name = "CardContainer";
private List<RectTransform> card_list = new List<RectTransform>(); // 存储当前所有卡片
private void Start()
{
card_container = transform.Find(card_container_name).GetComponent<RectTransform>();
m_self_debug_create_card();
m_self_set_card_layout_with_single();
// m_self_debug_set_card();
}
private void m_self_set_card_layout_with_single()
{
if (cardNumber / 2 == 0) return;
if (cardNumber == 0) return;
float halfAngle = fanShapeMaxAngle / 2f;
for (int i = 0; i < cardNumber; i++)
{
// 均匀角度分布
float t = (cardNumber == 1) ? 0.5f : (float)i / (cardNumber - 1);
float angleDeg = -halfAngle + t * fanShapeMaxAngle;
float angleRad = angleDeg * Mathf.Deg2Rad;
// 弧线坐标计算
float x = fanShapeMaxRadius * Mathf.Sin(angleRad);
float y = fanShapeMaxRadius * (1 - Mathf.Cos(angleRad));
// 应用到 UI 坐标
Vector2 pos = centerPosition + new Vector2(x, y);
card_list[i].anchoredPosition = pos;
// 设置旋转Z 轴)
float rotZ = -angleDeg * cardRotationAngle;
card_list[i].localRotation = Quaternion.Euler(0, 0, rotZ);
card_list[i].gameObject.SetActive(true);
}
}
private void m_self_set_card_layout_with_double()
{
if (cardNumber / 2 != 0) return;
}
private void m_self_debug_create_card()
{
// 从卡片预制体中随机选择卡牌按照数量插入到当前手牌中
for (var i = 0; i < cardNumber; i++)
{
GameObject _game_object = Instantiate(cardPrefabs[UnityEngine.Random.Range(0, cardPrefabs.Count)]);
RectTransform _rect_transform = _game_object.GetComponent<RectTransform>();
_rect_transform.name = "Card" + i;
_rect_transform.SetParent(card_container);
_game_object.SetActive(false);
card_list.Add(_rect_transform);
}
}
private void m_self_debug_set_card()
{
GameObject _game_object = Instantiate(cardPrefabs[0]);
RectTransform _rect_transform = _game_object.GetComponent<RectTransform>();
_rect_transform.name = "Card0";
_rect_transform.SetParent(card_container);
_rect_transform.anchoredPosition = centerPosition;
// _rect_transform.localRotation = Quaternion.Euler(0, 0, 0);
}
}