2025-10-25 21:27:50 +08:00

81 lines
2.9 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;
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);
}
}