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